2

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

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

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

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

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

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

4

3 回答 3

2

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

无论如何,您可以检查系统文件夹中是否存在 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 写了之后,我就没有使用过通用控件。很少有普通人的电脑安装它,这只是一种痛苦。

于 2013-08-08T13:55:55.493 回答
1

取决于对特定 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,因此除非您分发它并将其与您的应用程序一起注册,否则它可能不会出现在某些系统上。

于 2013-08-08T02:04:49.567 回答
0

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

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

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

 Dim oExcel As Object
   Set oExcel = CreateObject("Excel.Application")
于 2013-08-08T01:56:50.533 回答