2016-10-03 32 views
6

ファイル削除: のPowerShell:ExcelからVBAモジュールは、私が何をしたいのか

  • が動的モジュールを取り外しVBAモジュールをインポートし、モジュール
  • から関数を実行ファイル

    • オープンExcelを
    • だからここ

    は私のPowerShellのコードです:

    $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) 
    

    (当然のことながら、私は動的モジュールをインポートできるようにするために、エクセルのトラストセンターの設定でVBAプロジェクトへのアクセス有効)

    今、私が手にエラーは次のとおりです:

    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 
    

    この私がExcel内でこれを行うと全部が実際に機能します(パワーシェルなし)。ここ

    しかし、私はすでに出て見つけたものです...

    私は、Remove関数のオーバーロードを確認:

    [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機能交流かかわらずこのOLEオートメーション処理中にCOMオブジェクトに変換されて、VBComponentという型を戻します。

    私は何とかこのCOMオブジェクトを実際のVBComponentオブジェクトに変換しなければならないと思っています。どのようにそれを明示的にキャストすることはできません。

  • +0

    私はこれを複製できません - あなたのコードはサンプルワークブックとモジュールでうまく機能しました。 – Comintern

    +0

    MS Office Developer Toolsをインストールしていますか? – Comintern

    +0

    @Cominternうーん、私はそれを知らない。プログラムや機能の追加/削除(Ctrlキー)では、そのようなものは表示されません。私がそれを確認できる他の場所? – ThomasMX

    答えて

    0

    あなたは単に適切なモジュールを参照できない理由がありますか? Excelにモジュールを接続する必要はありません。アドインのモジュール&個人用ブックは、どのシートでも実行できます。

    アドインを作成する場合は(_アドインとして保存し、次にデベロッパーツールを使用してオンにします)、必要なモジュールを使用してオンザフライで更新します。実行して

    あなたが開発者向けツール]タブへのアクセス権を持っていけない場合、あなたはあなたの個人的なワークブックにモジュールを追加することができます(これは、あなたが最初のレコードマクロボタンを使用するときに自動生成することができます隠されたブックである)

    上のいずれかをExcelファイルを開いてコードを実行し、プログラムを使用してモジュールをサポートしていないモジュールにプログラムを追加しようとすることなくファイルを閉じることができます。

    絶対にモジュールを取り付けたり取り外したりする必要がある場合は、ファイルを開き、xlsb形式に変換してファイルを閉じ、ファイル名を.zipに変更し、モジュールを追加してxmlパスを.zip内に更新し、 、excelで開き、モジュールを実行し、モジュールをサポートしていないファイルとして保存します。

    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) 
    
    関連する問題