Я написал некоторый код VBA, который запрашивает базу данных доступа и вытягивает этот код в ячейки.Это работает, но очень медленно, в основном из-за того, как я это написал, однако я изо всех сил пытаюсь ускорить его.
Первый и второй запросы совпадают, за исключением того, что второй запрос имеет смещение в 1 месяц.
Как я могу ускорить это?
Первая проблема заключается в том, что мне кажется, что мне приходится подключать и закрывать базу данных каждый цикл.Если я пытаюсь выполнить оба запроса в рамках одного подключения к базе данных, я получаю сообщение об ошибке.
Второй вопрос - соединение кажется довольно медленным.
' 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
Редактировать
По запросу это объект БД
Public WithEvents Connection As ADODB.Connection
Public WithEvents Recordset As ADODB.Recordset
Public Command As New ADODB.Command
Public FilePath
Public Password
Public Function Connect()
If Connection.State = 1 Then Disconnect
AccessConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & FilePath & "';Jet OLEDB:Database Password='" & Password & "';"
Connection.ConnectionString = AccessConnect
Connection.CursorLocation = adUseClient
Connection.mode = adModeReadWrite
Connection.Open
End Function
Public Function Disconnect()
On Error Resume Next
Connection.Close
On Error GoTo 0
End Function
Public Function RunGetResults(qryString)
sqlQuery = qryString
Recordset.Open sqlQuery, Connection, adOpenKeyset, adLockOptimistic
End Function
Public Function Execute(qryString)
Connection.Execute (qryString)
End Function
Public Function Esc(eString)
eString = Replace(eString, "'", "''")
Esc = eString
End Function
Private Sub Class_Initialize()
Set Connection = New ADODB.Connection
Set Recordset = New ADODB.Recordset
Password = "xxxxx"
End Sub