문제

I have an 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"

이 코드를 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

다음과 같이 코드를 VBA 모듈에 Excel에 넣습니다.

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

배치 파일을 시작하고 결과를 얻으십시오.

macro

매크로를 실행하려고하지 않을 경우 빈 가치를 넣으십시오. Set MacroName= 배치에.

createObject () 메소드를 통해 Excel 인스턴스를 만들기 위해 vbscript를 작성한 다음 통합 문서를 열고 매크로를 실행할 수 있습니다. 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 env-var)테스트를 쉽습니다.내가 쓴 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

문자열을 직접 비교하는 대신 (vb는 getenvironmentvariable 길이 255의 문자열을 반환하기 때문에 동일하게 찾을 수 없습니다.) 이것을 작성하십시오.

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이 이미 열려 있는지 확인할 수 있습니다. 다른 isondance를 만들 필요가 없습니다

   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로 쉽게 편집 할 수 있고 명령 줄에서 호출을 통해 실행될 수 있습니다.

네임 스페이스에 Excel 패키지를 추가하는 것을 잊지 마십시오.

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;
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top