문제

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's dialog

매크로를 실행하려고하지 않을 경우 빈 가치를 넣으십시오. 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