VBA 代码的重复记录运行时错误
Posted
技术标签:
【中文标题】VBA 代码的重复记录运行时错误【英文标题】:Duplicate Record run time error for VBA code 【发布时间】:2016-07-15 13:57:29 【问题描述】:我目前在 Access 2013 中工作。
我遇到的问题是我试图将记录从主窗体复制到带有按钮的子窗体。
我的表格包括:
tbl40_1 tbl40_1_changes
ID (PK) ID (PK)
System_Name 40_1_ID (FK)
Configuration_Type System_Name
Configuration_ID Configuration_Type
Reference_Document Configuration_ID
Approval_Authority Reference_Document
Approval_Mechanism Approval_Authority
Item_Location Approval_Mechanism
Custodian Item_Location
Custodian
按钮的当前代码包括:
Private Sub Duplicate_Click()
Dim strInsert
Dim db As DAO.Database
StrInsert = "INSERT INTO tbl40_1_changes_subform (ID, [System_Name], [Configuration_Type], [Configuration_ID], [Reference_Document], [Approval_Authority], [Approval_Mechanism], [Item_Location], [Custodian]" & _
"SELECT ID, [System_Name], [Configuration_Type], [Configuration_ID], [Reference_Document], [Approval_Authority], [Approval_Mechanism], [Item_Location], [Custodian]" & _
"FROM frm40_1" & _
"WHERE [40_1_ID] = " & Me.tbl40_1_changes_subform.Form.txt40_1_ID
Set db = CurrentDb()
db.Execute strInsert, dbFailOnError
Set db = Nothing
End Sub
当我单击按钮时,我收到 [StrInsert = "INSERT INTO"、"Select"、"From"、"Where"] 的运行时错误。我不确定这段代码有什么问题,因为它突出显示了整段代码。
【问题讨论】:
你忘了用)
关闭第一行
包括Debug.Print StrInsert
,运行代码,然后在“立即”窗口中检查INSERT
语句。 (Ctrl+g 将带您到那里。)您需要匹配此模式:INSERT INTO TableName (<field list>) ...
您必须在 <field list>
周围包含两个括号 --- 看起来您的缺少第二个。
【参考方案1】:
您在换行符处缺少空格。
添加Debug.Print StrInsert
即可查看。
而且,正如 Hynek Bernard 所写,INSERT 子句缺少结束 )
试试
StrInsert = "INSERT INTO tbl40_1_changes (ID, [System_Name], [Configuration_Type], [Configuration_ID], [Reference_Document], [Approval_Authority], [Approval_Mechanism], [Item_Location], [Custodian])" & _
" SELECT ID, [System_Name], [Configuration_Type], [Configuration_ID], [Reference_Document], [Approval_Authority], [Approval_Mechanism], [Item_Location], [Custodian]" & _
" FROM frm40_1" & _
" WHERE [40_1_ID] = " & Me.tbl40_1_changes_subform.Form.txt40_1_ID
Debug.Print StrInsert ' Ctrl+G shows Debug output
编辑
我认为您的 WHERE 子句非常不合适。你是从frm40_1
(主窗体上)复制到子窗体上的tbl40_1_changes
,对吧?
如果tbl40_1_changes.ID
是自动编号,则无法设置。
那么你需要类似的东西
StrInsert = "INSERT INTO tbl40_1_changes (40_1_ID, [System_Name], [Configuration_Type], [Configuration_ID], [Reference_Document], [Approval_Authority], [Approval_Mechanism], [Item_Location], [Custodian])" & _
" SELECT ID, [System_Name], [Configuration_Type], [Configuration_ID], [Reference_Document], [Approval_Authority], [Approval_Mechanism], [Item_Location], [Custodian]" & _
" FROM tbl40_1" & _
" WHERE ID = " & Me.ID
【讨论】:
您好安德烈,感谢您的回复。我复制了您的代码,但仍然收到相同的错误代码(运行时错误2465
:应用程序 - 定义或对象 - 定义错误)。
请仔细检查该错误,@Orange56。 Access 错误 #2465 的消息以 “Microsoft Access 找不到字段...”开头
@Orange56:已编辑目标表名称。如果仍然失败,请发布完整的调试输出。并阅读How to debug dynamic SQL in VBA
@HansUp 我检查了访问错误 #2465,它正在显示(“应用程序定义的或对象定义的错误”),不知道为什么。当我在谷歌中搜索代码时,它显示“ Microsoft Access 找不到该字段”。
@Orange56:另外,如果40_1_ID
是外键,您也必须插入它。我强烈建议在查询设计器中构建您的查询,并且仅当它完成并工作时,将 SQL 复制回 VBA。以上是关于VBA 代码的重复记录运行时错误的主要内容,如果未能解决你的问题,请参考以下文章