[excel] कमांड लाइन या बैच फ़ाइल से एक्सेल मैक्रोज़ चलाने का तरीका?


Answers

ऐसा करने का सबसे आसान तरीका यह है:

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

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

Question

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

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




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

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

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

इस कोड को एक्सेल वीबीए इस वर्कबुक ऑब्जेक्ट में रखें:

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= बैच में Set MacroName=




@ रॉबर्ट: मैंने आपके कोड को सापेक्ष पथ से अनुकूलित करने का प्रयास किया है, और वीबीएस चलाने के लिए बैच फ़ाइल बनाई है।

वीबीएस शुरू होता है और बंद हो जाता है लेकिन मैक्रो लॉन्च नहीं करता है ... इस मुद्दे का कोई विचार कहां हो सकता है?

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 - मैं वर्कबुक_ ओपन इवेंट का उपयोग नहीं करना चाहता था क्योंकि एक्सेल केवल पढ़ने में बंद है। 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"

और अंत में मैंने वीबीएस निष्पादित करने के लिए बैच फ़ाइल की ...

@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

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




मैं सी # के आंशिक हूँ। मैं 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;
    }
}



तारों की तुलना करने की बजाय सीधे (वीबी उन्हें बराबर नहीं मिलेगा क्योंकि 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 



Related