Programing

명령 줄 또는 배치 파일에서 Excel 매크로를 실행하는 방법은 무엇입니까?

lottogame 2020. 10. 30. 07:37
반응형

명령 줄 또는 배치 파일에서 Excel 매크로를 실행하는 방법은 무엇입니까?


배치 파일에서 파일에 액세스 할 때 실행해야하는 Excel VBA 매크로가 있지만 파일을 열 때마다 실행해야하는 것은 아닙니다 (따라서 파일 열기 이벤트를 사용하지 않음). 명령 줄 또는 배치 파일에서 매크로를 실행하는 방법이 있습니까? 나는 그러한 명령에 익숙하지 않습니다.

Windows NT 환경을 가정합니다.


Excel을 시작하고 통합 문서를 열고 VBScript 파일에서 매크로를 실행할 수 있습니다.

아래 코드를 메모장에 복사하십시오.

' MyWorkbook.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.Run "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


나는 항상 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

Excel / VBA 내에서 작업하는 것이 더 편하다면 열기 이벤트를 사용하고 환경을 테스트합니다. 신호 파일, 레지스트리 항목 또는 열기 이벤트가 수행하는 작업을 제어하는 ​​환경 변수가 있습니다.

외부에서 파일 / 설정을 만들고 내부에서 테스트 (환경 변수에 GetEnviromentVariable 사용)하고 쉽게 테스트 할 수 있습니다. 나는 VBScript를 작성했지만 VBA와의 유사성은 나를 쉽게하기보다 더 불안하게 만든다 ..

[더]

내가 문제를 이해 했으므로 일반적으로 스프레드 시트를 대부분 / 일부 사용하지만 일괄 적으로 실행하고 추가 / 다른 작업을 수행하고 싶습니다. excel.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 

@ 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

내 매크로가 처리하는 사용자 폼을 호출하기 때문에 "Application.Quit"을 제거했습니다.

건배

편집하다

누군가가 독립 실행 형 응용 프로그램과 "유사한"사용자 양식을 실행하려는 경우를 대비하여 실제로 해결했습니다.

내가 직면 한 문제 :

1-Excel이 읽기 전용으로 잠겨 있으므로 Workbook_Open 이벤트를 사용하고 싶지 않았습니다. 2-배치 명령은 (내 지식으로) 매크로를 호출 할 수 없다는 사실로 제한됩니다.

먼저 응용 프로그램을 숨기면서 사용자 양식을 시작하는 매크로를 작성했습니다.

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

내에 "표시 상태로 다시 설정"도 포함 시켰습니다 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

어쨌든 도움을 주셔서 감사합니다. 누군가가 필요하면 도움이되기를 바랍니다.


Excel이 이미 열려 있는지 확인할 수 있습니다. 다른 isntance를 만들 필요가 없습니다.

   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

나는 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;
    }
}

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

반응형