【问题标题】:Excel VBA Compile ErrorExcel VBA 编译错误
【发布时间】:2013-08-08 21:55:55
【问题描述】:

我们有一个我们使用的 excel 电子表格,它适用于大多数机器,但在其他机器上会出现“隐藏模块中的编译错误 - 常规”,原因似乎是缺少参考。

我们检查宏是否已启用,但仍然没有帮助。

由于我们使用密码保护此 Excel 电子表格,我们不想将此密码提供给我们的用户以检查参考文献,并想知道是否有人知道如何添加 VBA 代码来检查excel 电子表格所需的参考资料在那里,如果没有,则弹出一个消息框以告知用户。

我们使用的参考文献如下:

  • Visual Basic 应用程序
  • Microsoft Excel 11.0 对象库
  • Microsoft Forms 2.0 对象库
  • Microsoft Windows 通用控件 5.0 (SP2)

或者,如果有人对如何解决这个问题有任何其他建议,那就太好了。

【问题讨论】:

  • 不知道有没有vba可以检查引用,但是我知道excel对象库经常会根据安装的office版本不同。如果命令相同,我的建议是使用后期绑定......但可能有更好的方法。
  • 嗨伙计,我对 VBA 编程还是很陌生,那么使用后期​​绑定是什么意思?
  • 谢谢@SamoanProgrammer 如果 VBA 代码上有密码,您知道您的用户如何添加引用吗? (我有完全一样的问题)。 chrs, BK

标签: excel vba reference compilation


【解决方案1】:

您列出的唯一可能缺少的参考是常用控件。其余的是每个版本的 Excel 中的默认设置。只有当您有用户表单或明确设置它时,Forms 才会出现,但这不是您的问题。通用控件是您的问题。它不再随 Office 提供。如果你有 Visual Studio 或 VB6,你可能已经有了。或旧版 Office,如 XP Developer Edition。

无论如何,您可以检查系统文件夹中是否存在 OCX 文件。我不认为它必须在那个文件夹中,但我从未在其他任何地方见过它。

自从我看到对 5.0 的引用以来已经有一段时间了,所以我在下面的代码中包含了如何找到 6.0。检查以确保您知道您使用的是什么版本。

在标准模块中:

Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Public Function HasCommonControl() As Boolean

    Dim sFolder As String
    Dim lReturn As Long

    Const lSIZE As Long = 255
    Const sDLLNAME As String = "COMCTL32.OCX" 'For windows common control 5.0
    'Const sDLLNAME As String = "MSCOMCTL.OCX" 'For windows common control 6.0

    sFolder = Space(lSIZE)
    lReturn = GetSystemDirectory(sFolder, lSIZE)

    sFolder = Left$(sFolder, lReturn)

    HasCommonControl = Len(Dir(sFolder & Application.PathSeparator & sDLLNAME)) > 0

End Function

说了这么多,为什么还要使用通用控件?如果是用于用户窗体上的树视图,请查看这个全 vba 树视图

http://www.jkp-ads.com/articles/treeview.asp

自从 jkp 写了之后,我就没有使用过通用控件。很少有普通人的电脑安装它,这只是一种痛苦。

【讨论】:

  • 我确实在网上找到了 jkp 示例,因为我们确实有一个在 Excel 2010 中运行时为空的树视图。基本上,我们正在使用一个多年前创建的 excel 模板,它在后来的 Excel 版本之前一切正常。我遇到的问题也是因为 64 位机器,所以我添加了一些代码来检查如果 VBA = 7 然后运行 ​​64 位代码,否则使用在 32 位下工作的代码。
【解决方案2】:

取决于对特定 Excel 或其他组件版本的引用是一个可能的问题。切换到后期绑定将解决该问题,只要您注意不要使用一个版本支持的任何命令/对象/方法/属性,而不是另一个版本。

跟进 RowanC 的链接(不错的选择),您可以添加对 Excel 的引用,例如并像这样编写代码:

Dim xlWks as Excel.Worksheet
'Dim xlWks as Object

调试完所有内容后,删除 Excel 引用并将声明更改为:

'Dim xlWks as Excel.Worksheet
Dim xlWks as Object

这可以让您在编码/调试时享受智能感知的好处,但以后会消除对特定 Excel 版本的依赖。

可能会弄错,但 IIRC 通用控件组件是 Visual Basic 的一部分,而不是 Office,因此除非您分发它并将其与您的应用程序一起注册,否则它可能不会出现在某些系统上。

【讨论】:

    【解决方案3】:

    尝试后期绑定,它不需要设置引用(尽管它可能会影响性能,并且这意味着自动完成在您的代码中不起作用)而不是通过以下方式调用 excel:

    Dim oExcel As Excel.Application
      Set oExcel = CreateObject("Excel.Application")
    

    尝试以这种方式调用它,并删除对 excel 对象模型的引用。

     Dim oExcel As Object
       Set oExcel = CreateObject("Excel.Application")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-28
      • 2014-03-11
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      相关资源
      最近更新 更多