none
VBAを外部ソフトウェアまたはExcelからコンパイルする方法を教えてください。 RRS feed

  • 質問

  • OS:Windows7 x64

    Office:Excel 2010 x86

    拡張子:xlsm

    上記の動作環境にて、ソースコードまたは何等かの方法を用いて、

    XXXX.xlsmファイルのコンパイル(VBエディタのデバッグ->VBProjectのコンパイル)と同等の

    動作をさせる方法がありましたら教えて頂けないでしょうか?

    仕様用途としては、例えば100のExcelファイルが存在し、それぞれ自作のライブラリをCOM参照をしている場合に、

    対象ライブラリが更新された場合、COMの張り替えをする必要がありますが手作業だと大変です。

    COMの張り替え事態は、VBA処理にて、リファレンスを用いて機械的に張り直しが行えますが、

    その後コンパイルする方法が分かりませんでした。

    Excel実行時に問題がなければ自動的にコンパイルされ(るはず)、実行できますが、

    何らかの問題により、参照している関数が使えなくなっていた場合のエラー検知が事前に出来ませんので、

    明示的にコンパイルを行いたい次第です。

    手作業で一画面ずつ開いてVBエディタでコンパイルはしんどいです。

    できれば、VBAの機能使い、コンパイル.xlsmから、XXX.xlsmをコンパイルしていくというのが理想です。

    不可能であれば、VisualStudioなどからでも問題ないです。

    よろしくお願いします。





    • 編集済み mogja 2018年11月13日 11:23
    2018年11月13日 11:11

回答

  • XXXX.xlsmファイルのコンパイル(VBエディタのデバッグ->VBProjectのコンパイル)と同等の動作をさせる方法がありましたら教えて頂けないでしょうか?

    これでどうでしょう。

    Application.VBE.CommandBars.FindControl(ID:=578).Execute
    • 回答としてマーク mogja 2018年11月14日 2:13
    2018年11月14日 0:52
  • Executeメソッドの後で、該当コマンドボタンのEnabledがFalse(=コンパイル成功)になるまで待つか、または、FindWindow関数(API)でClassNameが「#32770」かつWindowNameが「Microsoft Visual Basic for Applications」のウインドウが新たに出現するか(=コンパイル失敗)、Do~LoopでWaitしてはどうでしょうか。
    • 回答としてマーク mogja 2018年11月14日 5:48
    2018年11月14日 3:55

すべての返信

  • XXXX.xlsmファイルのコンパイル(VBエディタのデバッグ->VBProjectのコンパイル)と同等の動作をさせる方法がありましたら教えて頂けないでしょうか?

    これでどうでしょう。

    Application.VBE.CommandBars.FindControl(ID:=578).Execute
    • 回答としてマーク mogja 2018年11月14日 2:13
    2018年11月14日 0:52
  • ありがとうございます。実行してみたところコンパイルを行うことが出来ました。

    ただ、コンパイルを呼び出した結果、異常がある場合もExceuteでは止まらず

    そのまま処理してしまうので、もう少し捻らないといけなさそうです。

    Excute事態はSub()メソッドのため考え中です。

    2018年11月14日 2:14
  • Executeメソッドの後で、該当コマンドボタンのEnabledがFalse(=コンパイル成功)になるまで待つか、または、FindWindow関数(API)でClassNameが「#32770」かつWindowNameが「Microsoft Visual Basic for Applications」のウインドウが新たに出現するか(=コンパイル失敗)、Do~LoopでWaitしてはどうでしょうか。
    • 回答としてマーク mogja 2018年11月14日 5:48
    2018年11月14日 3:55
  • ありがとうございます。前者を使用し、Trueを検出した場合は、失敗か正常かを判断するようにしました。

    取りあえず保存しておきたい場合のフラグを見て、エラーでも保存、エラーじゃない場合は保存しないに

    分岐して、エラー結果は別に出力してエラーがあったら、そこだけ手作業で直せばという感じです。

    助かりました。

            'VBProjectコンパイル制御
            Dim ctrl As CommandBarControl
            Set ctrl = exApp.VBE.CommandBars.FindControl(ID:=578)
            ' コンパイル実行
            ctrl.Execute
            ' コンパイルボタン活性状態確認
            If ctrl.Enabled Then
                '活性の場合
                compile = False ' コンパイルエラー
            Else
                compile = True ' コンパイル正常
            End If
            ' コンパイル成功または失敗しても保存する場合
            If compile Or saved Then
                wkBook.Save
            End If


    2018年11月14日 5:55