programing

명령줄에서 VBScript를 사용하여 Outside Excel에서 Excel 매크로 실행

newsource 2023. 4. 15. 08:55

명령줄에서 VBScript를 사용하여 Outside Excel에서 Excel 매크로 실행

엑셀 파일 외부에서 엑셀 매크로를 실행하려고 합니다.현재 명령줄에서 실행 중인 .vbs 파일을 사용하고 있는데 매크로를 찾을 수 없다는 메시지가 계속 나타납니다.여기 제가 사용하려는 스크립트가 있습니다.

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("test.xls")

objExcel.Application.Visible = True
objExcel.Workbooks.Add
objExcel.Cells(1, 1).Value = "Test value"

objExcel.Application.Run "Macro.TestMacro()"
objExcel.ActiveWorkbook.Close


objExcel.Application.Quit
WScript.Echo "Finished."
WScript.Quit

액세스 하고 싶은 매크로는 다음과 같습니다.

Sub TestMacro()
'first set a string which contains the path to the file you want to create.
'this example creates one and stores it in the root directory
MyFile = "C:\Users\username\Desktop\" & "TestResult.txt"
'set and open file for output
fnum = FreeFile()
Open MyFile For Output As fnum
'write project info and then a blank line. Note the comma is required
Write #fnum, "I wrote this"
Write #fnum,
'use Print when you want the string without quotation marks
Print #fnum, "I printed this"
Close #fnum
End Sub

외부 명령에서 Excel 매크로 실행이 가능합니까?에 있는 솔루션을 사용해 보았습니다.(물론 수정도 가능하지만) 효과가 없는 것 같습니다.Microsoft Office Excel:매크로 '매크로'TestMacro'를 찾을 수 없습니다.

편집: Excel 2003.

좋아, 사실 간단해.매크로가 시트 중 하나가 아닌 모듈 안에 있다고 가정하면 다음을 사용합니다.

  objExcel.Application.Run "test.xls!dog" 
  'notice the format of 'workbook name'!macro

공백이 있는 파일명의 경우는, 파일명을 따옴표로 묶습니다.

예를 들어 sheet1과 같이 매크로를 시트 아래에 배치한 경우에는 sheet1이 기능을 소유하고 있다고 가정합니다.

    objExcel.Application.Run "'test 2.xls'!sheet1.dog"

주의: 사용 중인 macro.test 함수 표기법은 필요하지 않습니다.

이 코드는 Test.xls 파일을 열고 매크로를 실행합니다.TestMacro텍스트 파일에 쓸 수 있습니다.TestResult.txt

Option Explicit

Dim xlApp, xlBook

Set xlApp = CreateObject("Excel.Application")
'~~> Change Path here
Set xlBook = xlApp.Workbooks.Open("C:\Test.xls", 0, True)
xlApp.Run "TestMacro"
xlBook.Close
xlApp.Quit

Set xlBook = Nothing
Set xlApp = Nothing

WScript.Echo "Finished."
WScript.Quit

하루 종일 "macro not found or disabled" 오류를 해결하는 방법을 검색한 결과 관련 질문이 올바른 손에 의해 삭제되었기 때문에, 나에게 맞는 구문은 여기에 게시되었습니다(어플리케이션.run은 아무리 해도 실행되지 않았습니다).

Set objExcel = CreateObject("Excel.Application")

' Didn't run this way from the Modules
'objExcel.Application.Run "c:\app\Book1.xlsm!Sub1"
' Didn't run this way either from the Sheet
'objExcel.Application.Run "c:\app\Book1.xlsm!Sheet1.Sub1"
' Nor did it run from a named Sheet
'objExcel.Application.Run "c:\app\Book1.xlsm!Named_Sheet.Sub1"

' Only ran like this (from the Module1)

Set objWorkbook = objExcel.Workbooks.Open("c:\app\Book1.xlsm")
objExcel.Run "Sub1"

Excel 2010, Windows 7

@Siddhart의 코드를 상대 경로로 수정하여 실행하려고 했습니다.open_form매크로를 사용했지만 효과가 없었던 것 같습니다.이게 내 첫 번째 시도였어.현재 사용하고 있는 솔루션은 다음과 같습니다.

Option Explicit

Dim xlApp, xlBook
dim fso
dim curDir
set fso = CreateObject("Scripting.FileSystemObject")
curDir = fso.GetAbsolutePathName(".")
set fso = nothing

Set xlApp = CreateObject("Excel.Application")
'~~> Change Path here
Set xlBook = xlApp.Workbooks.Open(curDir & "Excels\CLIENTES.xlsb", 0, true)
xlApp.Run "open_form"
xlBook.Close
xlApp.Quit

Set xlBook = Nothing
Set xlApp = Nothing

WScript.Echo "Finished."

편집

다른 사용자가 독립 실행형 애플리케이션을 "유사"로 실행하려는 경우를 대비해서 실제로 해결했습니다.

당면한 문제:

1 - Excel이 읽기 전용으로 잠겨 있기 때문에 Workbook_Open Event를 사용하고 싶지 않았습니다.2 - batch 명령어는 매크로를 호출할 수 없는 것이 한정되어 있습니다.

처음에 매크로를 작성하여 응용 프로그램을 숨긴 상태에서 사용자 폼을 실행합니다.

Sub open_form()
 Application.Visible = False
 frmAddClient.Show vbModeless
End Sub

그런 다음 vbs를 생성하여 이 매크로를 실행합니다(상대 경로를 사용하여 실행하는 것은 까다로웠습니다).

dim fso
dim curDir
dim WinScriptHost
set fso = CreateObject("Scripting.FileSystemObject")
curDir = fso.GetAbsolutePathName(".")
set fso = nothing

Set xlObj = CreateObject("Excel.application")
xlObj.Workbooks.Open curDir & "\Excels\CLIENTES.xlsb"
xlObj.Run "open_form"

그리고 마침내 VBS를 실행하기 위해 배치 파일을 만들었어요

@echo off
pushd %~dp0
cscript Add_Client.vbs

또한 "Set back to visible"도 포함되었습니다.Userform_QueryClose:

Private Sub cmdClose_Click()
Unload Me
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ThisWorkbook.Close SaveChanges:=True
    Application.Visible = True
    Application.Quit
End Sub

어쨌든, 당신의 도움에 감사드리며, 만약 누군가가 도움이 필요하다면 도움이 되길 바랍니다.

위의 방법을 시도했지만 "macro cannot be find" 오류가 발생했습니다.이게 작동한 마지막 코드야!

Option Explicit

Dim xlApp, xlBook

Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True

  ' Import Add-Ins
xlApp.Workbooks.Open "C:\<pathOfXlaFile>\MyMacro.xla"
xlApp.AddIns("MyMacro").Installed = True

'
Open Excel workbook
Set xlBook = xlApp.Workbooks.Open("<pathOfXlsFile>\MyExcel.xls", 0, True)

' Run Macro
xlApp.Run "Sheet1.MyMacro"

xlBook.Close
xlApp.Quit

Set xlBook = Nothing
Set xlApp = Nothing

WScript.Quit

나의 경우 MyMacro는 Sheet1 아래에 있는 것이므로 Sheet1이 됩니다.마이마크로

는 보통 를 반반 my my my에 저장합니다.xlam워크북과는 별도로 추가 기능을 사용하기 때문에 워크북을 열고 별도로 저장된 매크로를 실행하려고 했습니다.

VBS 스크립트가 필요하기 때문에 인수 전달을 통해 사용할 수 있도록 "휴대용"으로 만들고 싶었습니다.다음은 3개의 인수를 포함하는 마지막 스크립트입니다.

  • 워크북의 전체 경로
  • 매크로명
  • [옵션] 매크로를 사용하여 워크북을 분리하는 경로

다음과 같이 테스트했습니다.

"C:\Temp\runmacro.vbs" "C:\Temp\Book1.xlam" "Hello"

"C:\Temp\runmacro.vbs" "C:\Temp\Book1.xlsx" "Hello" "%AppData%\Microsoft\Excel\XLSTART\Book1.xlam"

runmacro.vbs:

Set args = Wscript.Arguments

ws = WScript.Arguments.Item(0)
macro = WScript.Arguments.Item(1)
If wscript.arguments.count > 2 Then
 macrowb= WScript.Arguments.Item(2)
End If

LaunchMacro

Sub LaunchMacro() 
  Dim xl
  Dim xlBook  

  Set xl = CreateObject("Excel.application")
  Set xlBook = xl.Workbooks.Open(ws, 0, True)
  If wscript.arguments.count > 2 Then
   Set macrowb= xl.Workbooks.Open(macrowb, 0, True)
  End If
  'xl.Application.Visible = True ' Show Excel Window
  xl.Application.run macro
  'xl.DisplayAlerts = False  ' suppress prompts and alert messages while a macro is running
  'xlBook.saved = True ' suppresses the Save Changes prompt when you close a workbook
  'xl.activewindow.close
  xl.Quit

End Sub 

퍼스널 워크북에서 매크로를 실행하려고 하면 VBScript를 사용하여 Excel 파일을 열어도 퍼스널.X가 자동으로 열리지 않기 때문에 동작하지 않을 수 있습니다.LSB. 다음과 같은 작업을 수행해야 합니다.

Dim oFSO
Dim oShell, oExcel, oFile, oSheet
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oShell = CreateObject("WScript.Shell")
Set oExcel = CreateObject("Excel.Application")
Set wb2 = oExcel.Workbooks.Open("C:\..\PERSONAL.XLSB") 'Specify foldername here

oExcel.DisplayAlerts = False


For Each oFile In oFSO.GetFolder("C:\Location\").Files
    If LCase(oFSO.GetExtensionName(oFile)) = "xlsx" Then
        With oExcel.Workbooks.Open(oFile, 0, True, , , , True, , , , False, , False)



            oExcel.Run wb2.Name & "!modForm"


            For Each oSheet In .Worksheets



                oSheet.SaveAs "C:\test\" & oFile.Name & "." & oSheet.Name & ".txt", 6


            Next
            .Close False, , False
        End With
    End If



Next
oExcel.Quit
oShell.Popup "Conversion complete", 10

그래서 루프의 시작은 개인을 여는 것입니다.xlsb 및 다른 모든 워크북에 대해 매크로를 실행합니다.누군가 나처럼 이걸 우연히 발견했을 때를 대비해서 여기에 글을 올려야겠다고 생각했는데 왜 아직도 매크로가 실행되지 않는지 모르겠어.

안녕하세요, 이 스레드를 사용하여 솔루션을 입수했습니다.누군가 사용할 수 있는 경우를 대비해 제가 한 일을 공유하고 싶습니다.

셀을 변경하고 행을 지우는 매크로라고 부르고 싶었지만 1500 엑셀(파일당 약 3분 소요) 이상 필요했습니다.

주요 문제: - vbe에서 매크로를 호출할 때도 같은 문제가 발생했는데, 개인에서 매크로를 호출할 수 없었습니다.XLSB, 스크립트가 억제를 했을 때 엑셀은 개인적으로 실행되지 않았습니다.xlsb 및 매크로 창의 옵션 없음

매크로가 로드된 상태로 엑셀 파일 하나를 열어두면 해결(a.xlsm)(스크립트 실행 전)

그러면 나는 스크립트에 의해 반대되는 엑셀에서 매크로를 호출한다.

    Option Explicit
    Dim xl
    Dim counter

   counter =10



  Do

  counter = counter + 1

  Set xl = GetObject(, "Excel.Application")
  xl.Application.Workbooks.open "C:\pruebas\macroxavi\IA_030-08-026" & counter & ".xlsx"
  xl.Application.Visible = True
  xl.Application.run "'a.xlsm'!eraserow" 
  Set xl = Nothing


  Loop Until counter = 517

  WScript.Echo "Finished."
  WScript.Quit

언급URL : https://stackoverflow.com/questions/10232150/run-excel-macro-from-outside-excel-using-vbscript-from-command-line