3

Excel 2003 VBA プロジェクトで、MSCOMCTL.OCX のコントロールを使用しています。つまり、VBA プロジェクトには System32\MSCOMCTL.OCX への参照があります。

そのプロジェクトを 64 ビット Windows 7 システムの Excel 2003 で開くと、Excel は参照を SysWOW64\MSCOMCTL.OCX (正しい場所) に自動的に変更します。

しかし、そのプロジェクトを 32 ビット Windows XP を使用しているクライアントに送信すると、クライアントのシステムに SysWOW64\MSCOMCTL.OCX が存在しないため、プロジェクトを開くときに問題が発生します。

これまでに思いついた(不十分な)解決策は次のとおりです。

  1. 参照をシステム上の正しい場所 (System32\MSCOMCTL.OCX) に手動で変更するようクライアントに指示します。

    • これは、次の理由で実際には機能しません。
      1. Excel 2003 32 ビットでシートを開き、MSCOMCTL への参照が見つからない場合、ライブラリから取得したすべてのコントロール (TreeCtrl など) がフォームから削除されます :-(
      2. クライアントは手順に苦労しており、かなり面倒です。
  2. VBA の VBProject.References.AddFromFile/AddFromGuid を使用して参照を自動的に修正します。
    • 上記と同じ問題: ワークブックを開くときに VBA のコンパイルが失敗すると、Excel はフォームから見つけられなかったすべてのコントロールを削除します。
  3. 参照を自動的に追加し (2. のように)、動的バインディングを使用して、実行時に関連するすべてのコントロールを追加します。
    • これは実際に機能する可能性がありますが、現在、イベントハンドラーをコントロールにバインドするのに苦労しています(ただし、それは別の質問になります;-)

アプローチ 1. と 2. は実際には何も解決せず、ソリューション 3 は大変な作業です。

どんなアイデアでも大歓迎です。

4

1 に答える 1

1

ワークブックを閉じたときに参照を自動的にオフにした場合はどうなるでしょうか? そうすれば、ブックを開いたときに参照が「壊れる」ことはなく、すべてのコントロールは引き続き良好です。

すなわち:

Private Sub Workbook_Open()
'use environ variable for folder locs
If os = "64bit" Then
    Me.VBProject.References.AddFromFile ("C:\WINDOWS\SysWOW64\MSCOMCTL.OCX")
Else
    Me.VBProject.References.AddFromFile ("C:\WINDOWS\system32\MSCOMCTL.OCX")
End If
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    For Each ref In Me.VBProject.References
       If ref.Name = "MSComctlLib" Then
        Me.VBProject.References.Remove ref
       End If
        Next ref
End Sub

ADODB dll で簡単なテストを行ったところ、動作しているように見えましたが、その DLL を具体的にどのように使用しているかはわかりません。それがうまくいくかどうか教えてください!確かにオプション 3 よりもはるかに優れています。

于 2013-03-12T17:28:25.103 に答える