如何设置一个Excel单元格值作为访问查询的条件?
How can I set an Excel Cell Value as the criteria for Access Query?
我正在 MS Access 中创建一个新查询,它根据 "Branch" 和 "Employee" 字段更新现有记录。如何设置条件以引用单元格值?假设 A2
持有 "Branch" 访问 ID,B2
持有 Access.I 中 "Employee" ID 的值,想要更新我的访问 "Notes" 字段.当 运行ning in Excel 时,我的查询有效,但这只是因为我指定了 "Employee" 和 "Branch" ID 是什么。当我 运行 我的代码如下时没有任何更新:
代码
Sub modify_record()
Dim ac As Object
Dim branchid As String
Dim employeeid As String
Dim notesF As String
Set ac = CreateObject("Access.Application")
branchid = Sheets("Sheet4").Range("A2")
employeeid = Sheets("Sheet4").Range("B2")
notesF = Sheets("Sheet4").Range("C2")
Dim strDatabasePath As String
strDatabasePath = "C:\Users\johnsmith\OneDrive\pbsbackup.mdb"
With ac
.OpenCurrentDatabase (strDatabasePath)
Dim db As Object
Set db = .CurrentDb
db.Execute "Update_Records"
End With
End Sub
在 MS Access 中查询。另存为 Update_Records
UPDATE pbsmaster SET pbsmaster.notes = "notesF" WHERE
(((pbsmaster.branch)="branchid") AND((pbsmaster.employee)="employeeid"));
您的变量不会神奇地转移到查询中,只是因为它们具有相同的名称。
您需要在 Access 查询中指定参数,并通过 DAO.QueryDef
对象在 Excel VBA 代码中传递它们。
这里有一个例子:
Dim qd As Object ' DAO.QueryDef
Set qd = db.QueryDefs("Update_Records")
qd.Parameters("branchid") = branchid
' etc.
qd.Execute
这是我从@Andre 那里学到的解决方案。我能够执行我的代码,我注意到使用参数比使用 DAO 打开记录集要快得多。
Sub foo()
Dim db As Database
Dim qdf As QueryDef
Set db = OpenDatabase("C:\Users\employee\OneDrive\samplefile.mdb")
Set qdf = db.CreateQueryDef("", _
"PARAMETERS pbsbranch text , pbsnotes text; " & _
"UPDATE pbsmaster SET pbsmaster.notes=[pbsnotes] " & _
"WHERE pbsmaster.branch=[pbsbranch] " & _
"")
qdf!pbsbranch = Sheets("Sheet4").Range("A2")
qdf!pbsnotes = Sheets("Sheet4").Range("C2")
qdf.Execute dbFailOnError
Set qdf = Nothing
Set cdb = Nothing
End Sub
我正在 MS Access 中创建一个新查询,它根据 "Branch" 和 "Employee" 字段更新现有记录。如何设置条件以引用单元格值?假设 A2
持有 "Branch" 访问 ID,B2
持有 Access.I 中 "Employee" ID 的值,想要更新我的访问 "Notes" 字段.当 运行ning in Excel 时,我的查询有效,但这只是因为我指定了 "Employee" 和 "Branch" ID 是什么。当我 运行 我的代码如下时没有任何更新:
代码
Sub modify_record()
Dim ac As Object
Dim branchid As String
Dim employeeid As String
Dim notesF As String
Set ac = CreateObject("Access.Application")
branchid = Sheets("Sheet4").Range("A2")
employeeid = Sheets("Sheet4").Range("B2")
notesF = Sheets("Sheet4").Range("C2")
Dim strDatabasePath As String
strDatabasePath = "C:\Users\johnsmith\OneDrive\pbsbackup.mdb"
With ac
.OpenCurrentDatabase (strDatabasePath)
Dim db As Object
Set db = .CurrentDb
db.Execute "Update_Records"
End With
End Sub
在 MS Access 中查询。另存为 Update_Records
UPDATE pbsmaster SET pbsmaster.notes = "notesF" WHERE
(((pbsmaster.branch)="branchid") AND((pbsmaster.employee)="employeeid"));
您的变量不会神奇地转移到查询中,只是因为它们具有相同的名称。
您需要在 Access 查询中指定参数,并通过 DAO.QueryDef
对象在 Excel VBA 代码中传递它们。
这里有一个例子:
Dim qd As Object ' DAO.QueryDef
Set qd = db.QueryDefs("Update_Records")
qd.Parameters("branchid") = branchid
' etc.
qd.Execute
这是我从@Andre 那里学到的解决方案。我能够执行我的代码,我注意到使用参数比使用 DAO 打开记录集要快得多。
Sub foo()
Dim db As Database
Dim qdf As QueryDef
Set db = OpenDatabase("C:\Users\employee\OneDrive\samplefile.mdb")
Set qdf = db.CreateQueryDef("", _
"PARAMETERS pbsbranch text , pbsnotes text; " & _
"UPDATE pbsmaster SET pbsmaster.notes=[pbsnotes] " & _
"WHERE pbsmaster.branch=[pbsbranch] " & _
"")
qdf!pbsbranch = Sheets("Sheet4").Range("A2")
qdf!pbsnotes = Sheets("Sheet4").Range("C2")
qdf.Execute dbFailOnError
Set qdf = Nothing
Set cdb = Nothing
End Sub