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

如果您在工作簿关闭时自动关闭引用会怎样?这样,当工作簿打开时,引用就不会被“破坏”,并且您的所有控制都应该是好的。

IE :

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 回答