64位Windows 7上的Excel 2003自动更改对SysWOW64 \ MSCOMCTL.OCX的引用,因此32位Excel抱怨

时间:2012-12-27 12:01:59

标签: excel vba 64-bit ocx

在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.)并使用动态绑定在运行时添加所有相关控件。
    • 这实际上可以工作,但是目前我正在努力将事件处理程序绑定到控件(但这将是单独的问题; - )
  4. 方法1.和2.没有真正解决任何问题,解决方案3是很多工作。

    非常感谢任何想法。

1 个答案:

答案 0 :(得分: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好很多!