我有一个列出了Access查询名称的电子表格。我想通过Excel VBA在Access中运行这些查询,但是我想要处理已经打开的实例(和数据库),而不是打开新的Access实例。我目前拥有的代码仅用于创建新实例:
Sub RunQueries()
Dim appAccess As Object
Set appAccess = CreateObject("Access.Application")
appAccess.Visible = True
appAccess.OpenCurrentDatabase "D:\Access\tysql.accdb", False
Dim QueryName As String
For i = 2 To Queries.Count + 1
QueryName = Cells(i, 1).Value
appAccess.DoCmd.OpenQuery QueryName
Next i
End Sub
我会很感激任何建议。
实际上,您使用的是MS Access的GUI端而不是其底层数据库引擎。考虑通过ADO的路由,其中涉及打开没有.accdb数据库到屏幕。实际上,您甚至不需要将MSAccess.exe GUI安装为MS Office程序!
Dim conn As Object
Set conn = CreateObject("ADODB.Connection")
conn.Open "DRIVER=Microsoft Access Driver (*.mdb, *.accdb);DBQ=C:\Path\To\Database\File.accdb;"
Dim QueryName As String
For i = 2 To Queries.Count + 1
QueryName = Cells(i, 1).Value
conn.Execute QueryName
Next i
Set conn = Nothing
使用Access作为数据库引擎的美妙之处在于它可以移植到其他语言,如任何RDBMS,而不仅仅是Excel VBA。例如,在Python(我看到的是您的一个配置文件标签)中,您可以迭代csv(以该格式保存工作表)并在数据库中运行命名查询。
import csv
import pyodbc
database = r'C:\Path\To\Database\File.accdb'
constr = "Driver={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={0};".format(database)
db = pyodbc.connect(constr)
cur = db.cursor()
with open(r'C:\Path\To\Query\Names.csv', 'r') as f:
r = csv.reader(f)
for line in r:
cur.execute(line[0])
db.commit()
cur.close()
db.close()