programing

명령줄 또는 배치 파일에서 Excel 매크로를 실행하는 방법

easyjava 2023. 4. 14. 22:17
반응형

명령줄 또는 배치 파일에서 Excel 매크로를 실행하는 방법

Excel VBA 매크로를 가지고 있어 배치 파일에서 파일에 액세스할 때는 실행할 필요가 있지만 파일을 열 때마다 실행할 필요는 없습니다(따라서 열린 파일 이벤트는 사용하지 않습니다).명령줄 또는 배치 파일에서 매크로를 실행하는 방법이 있습니까?그런 명령어는 잘 모릅니다.

Windows NT 환경을 상정합니다.

Excel을 실행하고 워크북을 열고 VBScript 파일에서 매크로를 실행할 수 있습니다.

다음 코드를 메모장에 복사합니다.

My Workbook을 업데이트합니다.xls' 및 'MyMacro' 매개 변수입니다.

vbs 확장으로 저장하고 실행합니다.

Option Explicit

On Error Resume Next

ExcelMacroExample

Sub ExcelMacroExample() 

  Dim xlApp 
  Dim xlBook 

  Set xlApp = CreateObject("Excel.Application") 
  Set xlBook = xlApp.Workbooks.Open("C:\MyWorkbook.xls", 0, True) 
  xlApp.Run "MyMacro"
  xlApp.Quit 

  Set xlBook = Nothing 
  Set xlApp = Nothing 

End Sub 

매크로를 실행하는 주요 행은 다음과 같습니다.

xlApp. "MyMacro" 실행

가장 간단한 방법은 다음과 같습니다.

1) 배치 파일에서 Excel을 시작하여 매크로가 포함된 워크북을 엽니다.

EXCEL.EXE /e "c:\YourWorkbook.xls"

2) 워크북에서 매크로 호출Workbook_Open다음과 같은 이벤트

Private Sub Workbook_Open()
    Call MyMacro1          ' Call your macro
    ActiveWorkbook.Save    ' Save the current workbook, bypassing the prompt
    Application.Quit       ' Quit Excel
End Sub

이제 제어가 배치 파일로 돌아가 다른 처리를 수행합니다.

아래 메서드는 정의된 Excel 매크로를 배치 파일에서 실행할 수 있으며 환경변수를 사용하여 배치에서 Excel로 매크로 이름을 전달합니다.

이 코드를 배치 파일에 넣습니다(경로를 사용하여)EXCEL.EXE및 워크북:

Set MacroName=MyMacro
"C:\Program Files\Microsoft Office\Office15\EXCEL.EXE" "C:\MyWorkbook.xlsm"

다음 코드를 Excel VBA ThisWorkBook 객체에 넣습니다.

Private Sub Workbook_Open()
    Dim strMacroName As String
    strMacroName = CreateObject("WScript.Shell").Environment("process").Item("MacroName")
    If strMacroName <> "" Then Run strMacroName
End Sub

그리고 다음과 같이 Excel VBA 모듈에 코드를 입력합니다.

Sub MyMacro()
    MsgBox "MyMacro is running..."
End Sub

배치 파일을 실행하고 결과를 가져옵니다.

매크로 대화 상자

매크로를 실행하지 않을 경우 빈 값을 입력하십시오.Set MacroName=일괄 처리됩니다.

vbscript를 작성하여 createobject() 메서드를 사용하여 Excel 인스턴스를 작성한 후 워크북을 열고 매크로를 실행할 수 있습니다.vbscript를 직접 호출하거나 배치 파일에서 vbscript를 호출할 수 있습니다.

다음은 우연히 발견한 리소스입니다.http://www.codeguru.com/forum/showthread.php?t=376401

Excel/VBA 내에서 작업하는 것이 더 편하다면 오픈 이벤트를 사용하여 환경을 테스트합니다.신호 파일, 레지스트리 엔트리 또는 오픈 이벤트의 동작을 제어하는 환경 변수가 있습니다.

외부에서 파일/설정을 작성하고 내부에서 테스트할 수 있습니다(GetEnviromentVariable for env-vars 사용).또한 쉽게 테스트할 수 있습니다.나는 VBScript를 썼지만, VBA와 비슷한 점이 나를 쉽게 하기보다 더 불안하게 한다.

[더 보기]

문제를 이해한 결과, 보통 스프레드시트를 사용하는 경우가 대부분이지만, 일괄적으로 실행하거나 다른 작업을 하고 싶다고 생각하고 있습니다.엑셀에서 시트를 열 수 있습니다.exe 명령줄이지만 위치를 모르면 동작을 제어할 수 없습니다.환경변수를 사용하는 것은 비교적 간단하며 스프레드시트를 쉽게 테스트할 수 있습니다.

알기 쉽게 하기 위해 아래 함수를 사용하여 환경을 조사합니다.모듈 선언:

Private Declare Function GetEnvVar Lib "kernel32" Alias "GetEnvironmentVariableA" _
    (ByVal lpName As String, ByVal lpBuffer As String, ByVal nSize As Long) As Long

Function GetEnvironmentVariable(var As String) As String
Dim numChars As Long

    GetEnvironmentVariable = String(255, " ")

    numChars = GetEnvVar(var, GetEnvironmentVariable, 255)

End Function

워크북 열기 이벤트에서(다른 이벤트와 마찬가지로):

Private Sub Workbook_Open()
    If GetEnvironmentVariable("InBatch") = "TRUE" Then
        Debug.Print "Batch"
    Else
        Debug.Print "Normal"
    End If
End Sub

필요에 따라서 액티브한 코드를 추가합니다.배치 파일에서

set InBatch=TRUE

문자열을 직접 비교하는 대신 다음과 같이 입력합니다(GetEnvironmentVariable은 255 길이의 문자열을 반환하므로 VB는 동일하지 않습니다).

Private Sub Workbook_Open()     
    If InStr(1, GetEnvironmentVariable("InBatch"), "TRUE", vbTextCompare) Then
        Debug.Print "Batch"  
        Call Macro
    Else    
        Debug.Print "Normal"     
    End If 

End Sub 

저는 항상 Workbook_Open()에서 열린 워크북의 수를 테스트해 왔습니다.1인 경우 명령줄에서 워크북을 연 것입니다(또는 사용자가 모든 워크북을 닫은 다음 이 워크북을 연 경우).

If Workbooks.Count = 1 Then

    ' execute the macro or call another procedure - I always do the latter  
    PublishReport

    ThisWorkbook.Save

    Application.Quit

End If

@ Robert:당신의 코드를 상대 경로로 수정하려고 시도했고, VBS를 실행하기 위한 배치 파일을 만들었습니다.

VBS가 시작되고 닫히지만 매크로가 시작되지 않습니다.문제가 어디에 있는지 아세요?

Option Explicit

On Error Resume Next

ExcelMacroExample

Sub ExcelMacroExample() 

  Dim xlApp 
  Dim xlBook 

  Set xlApp = CreateObject("Excel.Application")
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  strFilePath = objFSO.GetAbsolutePathName(".") 
  Set xlBook = xlApp.Workbooks.Open(strFilePath, "Excels\CLIENTES.xlsb") , 0, True) 
  xlApp.Run "open_form"


  Set xlBook = Nothing 
  Set xlApp = Nothing 

End Sub

"응용 프로그램"을 제거했습니다.종료"라는 메시지가 나타납니다. 왜냐하면 매크로가 사용자 폼을 호출하고 있기 때문입니다.

건배.

편집

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

당면한 문제:

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

, 「 to visible(보여지도록 되돌리기)」는 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

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

저는 C#을 좋아합니다.linqpad를 사용하여 다음을 실행했습니다.단, CSC를 사용하여 컴파일을 쉽게 할 수 있으며 명령줄에서 콜을 실행할 수 있습니다.

네임스페이스에 엑셀 패키지를 추가하는 것을 잊지 마세요.

void Main()
{
    var oExcelApp = (Microsoft.Office.Interop.Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    try{
        var WB = oExcelApp.ActiveWorkbook;
        var WS = (Worksheet)WB.ActiveSheet;
        ((string)((Range)WS.Cells[1,1]).Value).Dump("Cell Value"); //cel A1 val
        oExcelApp.Run("test_macro_name").Dump("macro");
    }
    finally{
        if(oExcelApp != null)
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcelApp);
        oExcelApp = null;
    }
}

는 보통 를 반반 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 

엑셀이 이미 열려있는지 확인하실 수 있습니다.다른 존재는 생성할 필요가 없습니다.

   If CheckAppOpen("excel.application")  Then
           'MsgBox "App Loaded"
            Set xlApp = GetObject(, "excel.Application")   
   Else
            ' MsgBox "App Not Loaded"
            Set  wrdApp = CreateObject(,"excel.Application")   
   End If

언급URL : https://stackoverflow.com/questions/2050505/way-to-run-excel-macros-from-command-line-or-batch-file

반응형