Excel VBA编译错误

我们有一个excel的电子表格,我们使用它,它适用于大多数机器,但在其他人的popup“编译错误隐藏模块 – 一般”,原因似乎是由于缺less引用。

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

由于我们用密码来保护这个excel表格,所以我们不希望把这个密码发给我们的用户来检查引用,并想知道是否有人知道我怎样才能添加VBA代码来检查引用是否需要Excel电子表格在那里,如果没有,然后调出一个消息框来通知用户。

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

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

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

您列出的可能缺less的唯一参考是常用控件。 其余的在每个版本的Excel中都是默认的。 表单之一只有当你有一个用户窗体或显式设置,但这不是你的问题。 共同的控制是你的问题。 它不再随Office提供。 如果你有Visual Studio或VB6,你可能拥有它。 或者像XP开发版的旧版Office。

无论如何,您可以检查系统文件夹中是否存在OCX文件。 我不认为这是需要在该文件夹,但我从来没有见过其他地方。

从我看到5.0的引用已经有一段时间了,所以我包括了如何在下面的代码中find6.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 

说了这么多,你为什么使用共同的控制? 如果是用户窗体上的treeview,那么检查一下这个all-vba树视图

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

由于jkp写道,我没有使用共同的控制。 所以很less有普通人使用它,这只是一个痛苦。

根据对特定的Excel或其他组件版本的引用是一个可能的问题。 切换到后期绑定可以解决这个问题,只要你小心不要使用在一个版本中支持的任何命令/对象/方法/属性而不是另一个版本。

继续RowanC的链接(很好的select),你可以添加一个Excel的引用,例如编写你的代码,如下所示:

 Dim xlWks as Excel.Worksheet 'Dim xlWks as Object 

一旦所有东西都被debugging了,删除Excel引用并将声明更改为:

 'Dim xlWks as Excel.Worksheet Dim xlWks as Object 

这样可以在编码/debugging时为您提供智能感知的好处,但可以在以后取消对特定版本的Excel的依赖。

可能是错误的,但是IIRC的公共控件组件是Visual Basic的一部分,而不是Office,所以除非你分发它并将它与你的应用程序一起注册,否则它可能在某些系统上不存在。

要尝试后期绑定,不需要引用设置(虽然它可能会有性能问题,并且这意味着自动完成function在您的代码中不起作用),而不是按以下方式调用excel:

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

尝试以这种方式调用它,然后将引用放到excel对象模型中。

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