【问题标题】:Excel VBA user defined type not defined-Excel VBA 用户定义类型未定义-
【发布时间】:2017-10-30 10:56:11
【问题描述】:

我正在尝试创建一个 Excel 程序,该程序可以使用 VBA 在同一文件中从 sheet1 获取数据到 sheet2。但是当我声明 ADODB 时,它并没有出现在下拉列表中。当我尝试运行 sub 时,出现“未定义用户定义类型”错误。任何人都可以与我分享任何修复吗?

代码如下:

Sub testsql()

'declare variable
Dim objMyConn As ADODB.Connection
Dim objMyCmd As ADODB.Command
Dim objMyRecordSet As ADODB.Recordset

Set objMyConn = New ADODB.Connection
Set objMyCmd = New ADODB.Command
Set objMyRecordSet = New ADODB.Recordset

'open connection
objMyConn.connectionstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & wbWorkBook & ";Extended Properties=Excel 8.0;"
objMyConn.Open

'set and execute command
Set objMyCmd.activeconnection = objMyConn
objMyCmd.CommandText = "select top 10000 [Die No], Description from DieMaintenanceEntry"
objMyCmd.CommandType = adcmdtext


'open recordset
Set objMyRecordSet.Source = objMyCmd
objMyRecordSet.Open

'copy data to excel
ActiveWorkbook.Sheets("Display-Die Maintenance Summary").ActiveSheet.Range("A5").CopyFromRecordset (objMyRecordSet)

End Sub

【问题讨论】:

  • 你引用了 Activex 库吗?
  • Tools-> References -> Microsoft ActiveX Data object 2.0 library勾选框点击ok
  • 如果您只是在 same Excel 会话中将数据从一个工作表复制到另一个工作表,并且您没有应用排序或过滤,那么所有这些 ADO 业务可能是矫枉过正。
  • @SivaprasathV 您应该使用 6.x 版本(Windows Vista 和更高版本)。 2.8 适用于 Windows XP,不支持 2.0-2.7。
  • 感谢@ThunderFrame,我通常使用 2.8 库而不知道原因,并认为这是最新的库。由于代码没有任何版本参考,我认为他可以使用最低版本并认为更高版本具有向后兼容性。

标签: vba excel


【解决方案1】:

您可以通过两种方式解决此问题:

  1. 早期绑定(如您的代码所示)
    您需要做的是引用正确的Microsoft ActiveX Data Object。我的版本是6.1

  2. 使用后期绑定(无需引用库)

    Dim objMyConn As Object '/* Declare object type variable */
    Dim objMyCmd As Object
    Dim objMyRecordset As Object
    
    '/* Set using create object */
    Set objMyConn = CreateObject("ADODB.Connection")
    Set objMyCmd = CreateObject("ADODB.Command")
    Set objMyRecordset = CreateObject("ADODB.Recordset")
    

至于用哪个,我只能给出建议。在开发过程中,使用Early Binding 让您利用Intellisense。在部署时,更改为 Late Binding 以解决版本兼容性问题。

【讨论】:

  • 感谢您的意见。但是现在更改代码后,我收到了一个新错误。
  • "objMyConn.Open" 需要改变什么?
  • @hjh93 这已经是一个新错误,超出了我的回答范围:)。开个玩笑(但我是认真的),无论如何,你需要检查你的连接字符串。尝试用ThisWorkbook.FullName替换wbWorkbook
  • @L42,msjet4.0 dll 在 windows 10 中是否默认可用?
  • @SivaprasathV 是否与这篇文章有关,或者您问的是不同的问题。顺便说一句,它应该可以工作(没办法检查,我在 Win7 上)但你应该使用 ACE OLEDB 代替,因为它取代了 JET。
猜你喜欢
  • 2014-08-07
  • 2013-01-22
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
相关资源
最近更新 更多