我编写了一些VBA代码,该代码查询访问数据库并将该代码放入单元格中。它可以工作,但是非常慢,主要取决于我的编写方式,但是我一直在努力加快速度。
第一个查询和第二个查询相同,除了第二个查询的偏移量为1个月。
如何加快速度?
第一个问题是我似乎必须在每个循环中连接和关闭数据库。如果我尝试在同一数据库连接中运行两个查询,则会收到错误消息。
第二个问题是联接似乎很慢。
Lock
根据请求,这是数据库对象
' FIRST MONTH QUERY
db.Connect
db.RunGetResults ("SELECT data.*, monthdata.VAL, monthdata.MONTHVAL, monthdata.GREEN, monthdata.RED, monthdata.RAG, monthdata.CREATOR FROM data LEFT JOIN monthdata ON data.UID = monthdata.DATAUID WHERE [UID] = '" & (IDcell) & "' AND [MONTHVAL] = #" & Format(Range("multidate"), "mm/dd/yyyy") & "#")
'Debug.Print db.Recordset.RecordCount
irow = IDcell.Row
Do Until db.Recordset.EOF
icol = 2
For Each ifield In db.Recordset.Fields
Sheet3.Cells(irow, icol) = ifield.Value
icol = icol + 1
Next
i = i + 1
progress i
db.Recordset.MoveNext
If db.Recordset.EOF = True Then
Else
End If
Loop
End If
Next
db.Disconnect
GoTo 69
' SECOND MONTH QUERY
For Each IDcell In Rng
If IDcell <> "" Then
db.Connect
'Application.Goto Reference:="month2"
db.RunGetResults ("SELECT monthdata.VAL, monthdata.MONTHVAL, monthdata.GREEN, monthdata.RED, monthdata.RAG, monthdata.CREATOR FROM data LEFT JOIN monthdata ON data.UID = monthdata.DATAUID WHERE [UID] = '" & (IDcell) & "' AND [MONTHVAL] = #" & Format((month2), "mm/dd/yyyy") & "#")
'Debug.Print db.Recordset.RecordCount
irow = IDcell.Row
Do Until db.Recordset.EOF
icol = 18
For Each ifield In db.Recordset.Fields
Sheet3.Cells(irow, icol) = ifield.Value
icol = icol + 1
Next
i = i + 1
progress i
db.Recordset.MoveNext
If db.Recordset.EOF = True Then
Else
End If
Loop
End If
Next
db.Disconnect
答案 0 :(得分:1)
我建议仅在需要时使用android.enableD8.desugaring=false
。
锁定和闩锁会产生开销。如果您只想阅读,请使用adOpenKeyset, adLockOptimistic
。这不会锁定记录,并且在记录被删除时不需要持续的连接来接收更新。
您的整个数据库对象对我来说都很奇怪。您在声明记录集和与事件的连接,但不监听任何事件。所有这些都会产生一些开销。
您还可以断开记录集的连接,但是,如果您使用的是带有只读锁的静态类型的记录集,则可能不会有太大的不同。