2010-01-12 9 views
52

मेरे पास एक एक्सेल वीबीए मैक्रो है जिसे मुझे बैच फ़ाइल से फ़ाइल तक पहुंचने पर चलाने की आवश्यकता है, लेकिन हर बार जब मैं इसे खोलता हूं (इसलिए खुली फ़ाइल घटना का उपयोग नहीं करता)। क्या कमांड लाइन या बैच फ़ाइल से मैक्रो चलाने का कोई तरीका है? मैं इस तरह के आदेश से परिचित नहीं हूँ।कमांड लाइन या बैच फ़ाइल से एक्सेल मैक्रोज़ चलाने का तरीका?

विंडोज एनटी पर्यावरण मानें।

+1

विंडोज स्क्रिप्टिंग होस्ट के साथ vbscript/jscript का उपयोग कर रहा है? – madaboutcode

उत्तर

64

आप Excel लॉन्च कर सकते हैं, कार्यपुस्तिका खोल सकते हैं और एक वीबीस्क्रिप्ट फ़ाइल से मैक्रो चला सकते हैं।

नीचे दिए गए कोड को नोटपैड में कॉपी करें।

अपडेट '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"

+8

यही वह है जिसे मैं ढूंढ रहा था! यह काम करता हैं। मुझे ग्लिच के बिना काम करने के लिए कुछ बदलाव जोड़ना चाहिए: 1. यह "xlApp.Run" है। 2. छोड़ने से पहले, किसी को xlApp.SaveAs का उपयोग करना चाहिए या मैक्रो द्वारा किए गए कोई भी संशोधन सहेजे नहीं जाएंगे। (संबंधित x पॉपअप से बचने के लिए xlApp.DisplayAlerts = गलत) का उपयोग कर सकते हैं) 3. छोड़ने से पहले, xlApp.ActiveWorkbook.Close को बुलाया जाना चाहिए या स्प्रेडशीट खुला रहता है (हालांकि छुपा हुआ), जो आगे संपादन को अक्षम करता है। सब कुछ में, मैं यही देख रहा था :) – Polymeron

+1

'xlApp.Visible = True' जोड़ने पर भी विचार करें, अन्यथा आप एक्सेल या उसके किसी भी संवाद बॉक्स को नहीं देख पाएंगे जो दिखाई दे सकता है। –

+1

जब मैं इस स्क्रिप्ट वर्बैटिम को चलाता हूं तो प्रक्रिया 'EXCEL.exe' बंद नहीं होती है। –

4

आप createobject() विधि के माध्यम से एक्सेल का उदाहरण बनाने के लिए एक vbscript लिख सकते हैं, फिर कार्यपुस्तिका खोलें और मैक्रो चलाएं। आप या तो सीधे vbscript को कॉल कर सकते हैं, या बैच फ़ाइल से vbscript को कॉल कर सकते हैं। http://www.codeguru.com/forum/showthread.php?t=376401

2

आप और अधिक आरामदायक एक्सेल/VBA के अंदर काम कर रहे हैं, खुला घटना का उपयोग करें और पर्यावरण का परीक्षण: या तो एक संकेत फ़ाइल, एक रजिस्ट्री प्रविष्टि या

यहाँ एक संसाधन मैं सिर्फ करवाते हैं ठोकर खाई है एक पर्यावरण परिवर्तनीय जो खुली घटना करता है उसे नियंत्रित करता है।

आप बाहर फ़ाइल/सेटिंग बना सकते हैं और अंदर परीक्षण कर सकते हैं (env-vars के लिए GetEnviromentVariable का उपयोग करें) और आसानी से परीक्षण करें। मैं मेरे कारण VBA को VBScript लेकिन समानताएं लिखा है आसानी से ज्यादा गुस्से ..

[अधिक]

मैं समस्या को समझने के रूप में, आप सामान्य रूप से सबसे स्प्रेडशीट का उपयोग करना चाहते हैं/समय की कुछ में अभी तक यह बैच में चलाता है और कुछ अतिरिक्त/अलग करता है। आप 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 
14

सबसे आसान तरीका का उपयोग यह है क्या करने के लिए करने के लिए:

1) प्रारंभ एक्सेल अपने मैक्रो युक्त कार्यपुस्तिका खोलने के लिए अपने बैच फ़ाइल से:

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 

यह अब वापस आ जाएगी टी वह अन्य प्रसंस्करण करने के लिए अपनी बैच फ़ाइल पर नियंत्रण करता है।

+2

उस पर विचार किया गया, लेकिन यह तब भी चलाएगा जब मैं इसे बैच फ़ाइल के माध्यम से नहीं खोलता, जिससे फ़ाइल को मैक्रोज़ को अक्षम किए बिना काम करना असंभव हो जाता है। – Polymeron

+1

रजिस्ट्री सेटिंग को संशोधित करके हल करना आसान है जो एक्सेल को बताता है कि किस स्तर की सुरक्षा सेट है। – bvukas

+0

बेशक, कार्यपुस्तिका पर डिजिटल हस्ताक्षर हमेशा परीक्षण प्रमाण पत्र के साथ मदद करता है :) – bvukas

2

सीधे तार (वीबी उन्हें बराबर के बाद से 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 
2

मैं हमेशा 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 
2

@ रॉबर्ट: मैं एक रिश्तेदार पथ के साथ अपने कोड अनुकूलन करने की कोशिश की, और 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 

मैंने "एप्लिकेशन.क्यूइट" हटा दिया क्योंकि मेरा मैक्रो उपयोगकर्ता की देखभाल करने के लिए उपयोगकर्ता को कॉल कर रहा है।

मुद्दे मैं का सामना करना पड़ रहा था:

चीयर्स

संपादित

मैं वास्तव में इसे बाहर, "एक जैसे" योग्य स्वतंत्र आवेदन काम किया है सिर्फ मामले में किसी को एक userform चलाना चाहता है

1 - मैं वर्कबुक_ ओपन इवेंट का उपयोग नहीं करना चाहता था क्योंकि एक्सेल केवल पढ़ने में बंद है। 2 - बैच कमांड सीमित है कि तथ्य (मेरे ज्ञान के लिए) यह मैक्रो को कॉल नहीं कर सकता है।

मैं पहली बार लिखा था मेरी userform शुरू करने के लिए है, जबकि आवेदन छुपा एक मैक्रो:

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 

वैसे भी, आपकी मदद के लिए धन्यवाद, और मुझे आशा है कि यह मदद मिलेगी अगर किसी को इसकी आवश्यकता है

0

आप देख सकते हैं एक्सेल पहले से ही है खुला। एक और आइसेंटेंस बनाने की कोई आवश्यकता नहीं है

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 
0

मैं सी # के आंशिक हूं। मैं linqpad का उपयोग कर निम्नलिखित भाग गया। लेकिन यह आसानी से सीएससी के साथ संकलित किया जा सकता है और कमांड लाइन से बुलाया जा सकता है।

नामस्थान में एक्सेल पैकेज जोड़ने के लिए मत भूलना।

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; 
    } 
} 
2

विधि नीचे दिखाया गया है यह वातावरण चर का उपयोग करता है एक्सेल में बैच से मैक्रो का नाम पारित करने के लिए, बैच फ़ाइल से परिभाषित एक्सेल मैक्रो को चलाने के लिए अनुमति देता है।

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

एक्सेल VBA ThisWorkbook वस्तु को यह कोड डालें::

बैच फ़ाइल (EXCEL.EXE करने और कार्यपुस्तिका के लिए अपने पथ का उपयोग करें) के लिए इस कोड डाल

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

और अपने कोड डाल एक्सेल वीबीए मॉड्यूल के लिए, जैसा कि निम्नानुसार है:

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

बैच फ़ाइल लॉन्च करें और वें प्राप्त करें ई परिणाम:

macro's dialog

मामला है जब तुम सिर्फ बैच के लिए रिक्त मान Set MacroName= डाल किसी भी मैक्रो को चलाने के लिए इरादा नहीं है के लिए।

संबंधित मुद्दे