2016-10-03 9 views
6

मैं आपकी क्या अपेक्षाएं हैं: फ़ाइल PowerShell: निकालें एक्सेल से VBA मॉड्यूल फ़ाइल

  • गतिशील रूप से एक VBA मॉड्यूल आयात और मॉड्यूल
  • से एक समारोह को चलाने मॉड्यूल निकालें

    • एक एक्सेल ओपन
    • $excel = New-Object -ComObject Excel.Application 
      $excel.Workbooks.Open($filepath) | Out-Null 
      $macro = $excel.ActiveWorkbook.VBProject.VBComponents.Import($MacroFilepath) 
      $Excel.ActiveWorkbook.Application.Run("HoursSumCounter.main") | Out-Null 
      $excel.ActiveWorkbook.VBProject.VBComponents.Remove($macro) 
      
      :
    तो यहाँ

    मेरी powershell कोड है

    Cannot find an overload for "Remove" and the argument count: "1". 
    At line:1 char:1 
    + $excel.ActiveWorkbook.VBProject.VBComponents.Remove($macro) 
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
        + CategoryInfo   : NotSpecified: (:) [], MethodException 
        + FullyQualifiedErrorId : MethodCountCouldNotFindBest 
    

    यह:

    अब त्रुटि है कि मैं पीछा कर रहा है (स्वाभाविक रूप से मैं क्रम में एक्सेल का विश्वास केंद्र सेटिंग्स में VBA प्रोजेक्ट तक पहुँचने एक मॉड्यूल गतिशील आयात करने के लिए सक्षम होने के लिए सक्षम) पूरी चीज वास्तव में काम करती है अगर मैं एक्सेल के भीतर ऐसा करता हूं (कोई शक्ति नहीं)।

    लेकिन यहाँ क्या मैं पहले से ही पता चला ...

    मैं निकालें समारोह के अधिभार की जाँच की है:

    [DBG]: PS C:\Users\MUT2BP\Desktop\recefice>> $excel.ActiveWorkbook.VBProject.VBComponents.Remove 
    
    OverloadDefinitions                                           
    -------------------                                           
    void Remove(Microsoft.Vbe.Interop.VBComponent VBComponent)                                  
    void _VBComponents.Remove(Microsoft.Vbe.Interop.VBComponent VBComponent)                              
    void _VBComponents_Old.Remove(Microsoft.Vbe.Interop.VBComponent VBComponent) 
    

    यह पता चला कि मैं वास्तव में हालांकि प्रकार Microsoft.Vbe.Interop.VBComponent VBComponent की एक वस्तु पास करना चाहिए मेरी $macro ऑब्जेक्ट प्रकार System.__ComObject#{eee00921-e393-11d1-bb03-00c04fb6c4a6}

    [DBG]: PS C:\Users\MUT2BP\Desktop\recefice>> $macro | Get-Member 
    
    
        TypeName: System.__ComObject#{eee00921-e393-11d1-bb03-00c04fb6c4a6} 
    
    Name   MemberType Definition       
    ----   ---------- ----------       
    Activate  Method  void Activate()     
    DesignerWindow Method  Window DesignerWindow()   
    Export   Method  void Export (string)   
    ... 
    

    की है ... भले ही Remove समारोह एसी इस ओएलई स्वचालन प्रक्रिया के दौरान, एक COM ऑब्जेक्ट में परिवर्तित हो जाता है, इस प्रकार VBComponent का एक प्रकार देता है।

    मुझे संदेह है कि मुझे किसी भी तरह से इस COM ऑब्जेक्ट को वास्तविक VBComponent ऑब्जेक्ट में परिवर्तित करना है, मैं इसे स्पष्ट रूप से कैसे नहीं डाल सकता।

  • +0

    मैं इसे दोहराना नहीं कर सकता - आपका कोड नमूना कार्यपुस्तिका और मॉड्यूल के साथ ठीक काम करता है। – Comintern

    +0

    क्या आपके पास एमएस ऑफिस डेवलपर टूल्स स्थापित हैं? – Comintern

    +0

    @ कॉमिनटर हम्म, मुझे इसके बारे में पता नहीं है। जोड़ें/निकालें प्रोग्राम और फीचर्स (ctrl पैनल) में मुझे ऐसा कुछ नहीं दिखाई देता है। कोई अन्य जगह जहां मैं इसे सत्यापित कर सकता हूं? – ThomasMX

    उत्तर

    0

    क्या कोई कारण है कि आप उचित मॉड्यूल का संदर्भ क्यों नहीं दे सकते? एक्सेल को संलग्न करने के लिए मॉड्यूल की आवश्यकता नहीं है। ऐड-इन्स में मॉड्यूल & व्यक्तिगत कार्यपुस्तिका किसी भी शीट पर चल सकती है।

    यदि आप कोई ऐड-इन बनाते हैं (_ ऐड-इन के रूप में सहेजें, फिर डेवलपर टूल के तहत इसे चालू करने के लिए बॉक्स पर क्लिक करें) तो आप जिस भी मॉड्यूल को चाहते हैं उसे फ्लाई पर अपडेट करें।

    अगर आप न डेवलपर उपकरण टैब पर नहीं पहुंच, आप अपने व्यक्तिगत कार्यपुस्तिका के लिए मॉड्यूल में जोड़ सकते हैं करके

    (यह छिपा हुआ कार्यपुस्तिका उत्पन्न किया जा सकता है कि ऑटो जब आप पहली बार रिकॉर्ड मैक्रो बटन का उपयोग है) उपर्युक्त में से कोई भी आप एक्सेल फ़ाइल खोल सकते हैं, उस पर कोड चला सकते हैं, और तब फ़ाइल को बंद कर सकते हैं बिना प्रोग्राम्सैटिक रूप से एक मॉड्यूल को मॉड्यूल को जोड़ने के लिए जो मॉड्यूल का समर्थन नहीं करता है।

    यदि आपको बिल्कुल मॉड्यूल को संलग्न करना और निकालना है, तो इसे आज़माएं: फ़ाइल खोलें, xlsb प्रारूप में कनवर्ट करें, फ़ाइल बंद करें, फ़ाइल को .zip के रूप में नाम बदलें, मॉड्यूल जोड़ें और .zip के अंदर xml पथ अपडेट करें, .xlsb के रूप में नाम बदलें एक्सेल में खोलें, मॉड्यूल चलाएं, फाइल के रूप में सहेजें जो मॉड्यूल का समर्थन नहीं करता है।

    0

    को हाल ही में ऐसा कुछ करना पड़ा, मैंने यह कैसे किया।

    $Code = @' 
    your code here 
    Make sure this guy is public 
    @' 
    
    $Excel = new-object -com Excel.Application 
    #Need to change security settings 
    
    New-ItemProperty -Path ` 
    "HKCU:\Software\Microsoft\Office\$($Excel.Version)\excel\Security" -Name ` 
    AccessVBOM -Value 1 -Force | Out-Null 
    
    New-ItemProperty -Path ` 
    "HKCU:\Software\Microsoft\Office\$($Excel.Version)\excel\Security" -Name ` 
    VBAWarnings -Value 1 -Force | Out-Null 
    
    $Workbook = $Excel.Workbooks.open("Insert Path to file here",$true) 
    $xlModule = $Workbook.VBProject.VBComponents.Add(1) 
    $Module = $xlmodule.CodeModule.AddFromString($Code) 
    $Excel.Run("Name of Module here, make sure that the sub is public") 
    $Workbook.VBProject.VBComponents.Remove($xlmodule) 
    $Workbook.Close($True) 
    
    संबंधित मुद्दे