【问题标题】:Microsoft Access "User-defined type not defined"Microsoft Access“未定义用户定义类型”
【发布时间】:2020-09-01 16:00:39
【问题描述】:

当尝试运行以下代码时,当它遇到Dim qdf As QueryDef 说时出现错误

用户自定义类型未定义

我认为这真的很奇怪,因为我有同一个项目的备份,在它之后没有进行太多更改,这完全可以正常工作。我试图追溯自己的脚步,并为此苦苦挣扎。

关于我可能遗漏什么的任何线索?我已经尝试了Tools > References 的常见建议并从那里添加,无论如何我之前没有它就可以工作。

Private Sub Complete_Click()

Set objAD = CreateObject("ADSystemInfo")
Set objUser = GetObject("LDAP://" & objAD.UserName)
strDisplayName = objUser.DisplayName

Dim dtTrained As String
Dim sprTrained As String
Dim compCheck As String

dtTrained = InputBox("Enter date trained as 'mm/dd/yyyy':", "", Format(Date, "mm/dd/yyyy"))
Debug.Print dtTrained

sprTrained = InputBox("Trained By:", "", strDisplayName)
Debug.Print sprTrained

compCheck = InputBox("How was competency verified?", "", "Enter here")
Debug.Print compCheck

Dim ConfirmMsg, ConfirmStyle, ConfirmTitle, ConfirmResponse
ConfirmMsg = "Continue?"
ConfirmStyle = vbYesNo
ConfirmTitle = " "
ConfirmResponse = MsgBox(ConfirmMsg, ConfirmStyle, ConfirmTitle)

If ConfirmResponse = vbYes Then

Const dbConnStr = "CONNECTION STRING IS HERE"

Dim qdf As QueryDef

Set qdf = CurrentDb.CreateQueryDef("")

Dim sqlString As String
sqlString = "INSERT INTO dbo.TRAINING_RECORDS (EMPLOYEE_ID, DOCUMENT_ID, REVISION, DATE_TRAINED, TRAINED_BY, STATUS, COMPETENCY) " & _
"SELECT '" & EMPLOYEE_ID.Value & "', '" & DOCUMENT_ID.Value & "', '" & LATEST_REV.Value & "', '" & dtTrained & "', '" & sprTrained & "', 'C', '" & compCheck & "'"

qdf.sql = sqlString

qdf.ReturnsRecords = False

qdf.Connect = dbConnStr

Debug.Print sqlString
qdf.Execute

'CurrentDb.Execute "INSERT INTO TRAINING_RECORDS (EMPLOYEE_ID, EMPLOYEE_NAME, DOCUMENT_ID, FILENAME, REVISION, DATE_TRAINED, TRAINED_BY, STATUS) " & _
'"SELECT EMPLOYEE_ID, EMPLOYEE_NAME, DOCUMENT_ID, FILENAME, REVISION, DATE_TRAINED, TRAINED_BY, STATUS FROM uSysTRAINING_RECORDS " & _
'"WHERE DOCUMENT_ID = '" & DOCUMENT_ID.Value & "'"

CurrentDb.Execute "INSERT INTO TRAINING_RECORDS (EMPLOYEE_ID, DOCUMENT_ID, REVISION, DATE_TRAINED, TRAINED_BY, STATUS) " & _
"SELECT * FROM uSysTRAINING_RECORDS " & _
"WHERE EMPLOYEE_ID = '" & EMPLOYEE_ID.Value & "'"

CurrentDb.Execute "DELETE FROM TRAINING_NEEDED " & _
"WHERE EMPLOYEE_ID LIKE '" & EMPLOYEE_ID.Value & "' AND DOCUMENT_ID LIKE '" & DOCUMENT_ID.Value & "'"

Forms!TRAINING_MATRIX.TRAINING_NEEDED_SUBFORM.Form.Requery
Forms!TRAINING_MATRIX.TRAINING_RECORDS_SUBFORM.Requery
Forms!TRAINING_MATRIX.ALL_TRAINING_RECORDS.Requery

Else

End If

End Sub

【问题讨论】:

  • 听起来您需要添加对 Microsoft DAO 的引用。 datanumen.com/blogs/add-object-library-reference-vba
  • @RobertHarvey 就是这样......谢谢!
  • 这段代码在哪里运行?如果在 MS Access 中,默认情况下它应该已经在其“Microsoft Office x.x 数据库引擎对象库”下提供了 DAO。因此,QueryDefs 应该可用。您可能不小心取消了它。
  • @Parfait 它在 Access 中运行。我也有同样的想法,尤其是因为它可以正常工作,而无需之前添加 Microsoft DAO 引用。所以,我不太确定那里发生了什么,但添加该参考确实解决了问题。

标签: sql vba ms-access


【解决方案1】:

因为QueryDefsTableDefsRecordsets 甚至Database 都是Access 的Database Object (DAO) 库下的对象,所以您需要让您的MS Access 项目引用该库。否则,VBA 无法与此类对象、属性和方法进行交互。 DAO 是 MS Access 的默认数据库 API,在开发 VBA 模块时选择非常重要,如下所示:

  • Visual Basic 应用程序
  • Microsoft Access #.0 对象库
  • OLE 自动化
  • Microsoft Office #.# Access 数据库引擎对象库

相比之下,ADO 是不同的数据库 API,需要不同的非默认库:Microsoft ActiveX Data Objects #.# Library。其实如上图,VBA本身就是作为第一个checked item的reference!

实际上,DAO 对象的完整命名引用会以DAO 为前缀,以强调其来源。省略它是一种简写方式。

Dim db  As DAO.Database
Dim rst As DAO.Recordset
Dim tdf As DAO.TableDef
Dim qdf As DAO.QueryDef

Set db = CurrentDb
Set rst = db.OpenRcordset("SELECT * FROM myTable")
Set tdf = db.TableDefs("myTable")
Set qdf = db.QueryDefs("myQuery")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    相关资源
    最近更新 更多