Попробуйте выполнить профилирование вашего кода, выполнив это, и изучите непосредственное окно (открытое Ctrl
+ G
в редакторе VBA:
Function Lob_amt(sp_name As String, l_date As String) As Double
Debug.Print "begin Lob_amt function: " & Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
Dim Conn As ADODB.Connection
Set Conn = New ADODB.Connection
Dim recset As ADODB.Recordset
Set recset = New ADODB.Recordset
Dim l_year As Double
Dim l_name As String
l_year = Year(l_date)
Dim sqlQry As String, sConnect As String
sqlQry = "SELECT sum(lob_lobbying.Amount)FROM lob_lobbying" & _
" WHERE lob_lobbying.Latest = 'Y'" & _
" AND lob_lobbying.IndTot ='Y'" & _
" AND UltOrg = '" & sp_name & "'" & _
" AND CycleYear in ('" & l_year & "')"
Debug.Print vbNewLine & sqlQry & vbNewLine
sConnect = "Driver={SQL Server};Server=DESKTOP-L9CVIVP;Database=lobbying;Trusted_Connection=yes;"
Conn.Open sConnect
Debug.Print "Lob_amt function Conn.Open: " & Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
recset.Open sqlQry, Conn
If IsNull(recset.Fields(0).Value) Then
Lob_amt = 0
Debug.Print "Lob_amt Lob_amt = 0: " & Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
Else
Lob_amt = recset.Fields(0).Value
Debug.Print "Lob_amt recset.Fields(0).Valu: " & Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
End If
recset.Close
Debug.Print "Lob_amt recset closed: " & Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
Conn.Close
Debug.Print "Lob_amt conn closed: " & Strings.Format(Now, "HH:nn:ss") & "." & Strings.Right(Strings.Format(Timer, "#0.00"), 2)
Set recset = Nothing
Set Conn = Nothing
End Function
Возможно, проблема в других функциях, таких как модули
UPD: SELECT sum(lob_lobbying.Amount)FROM lob_lobbying WHERE lob_lobbying.Latest = 'Y' AND lob_lobbying.IndTot ='Y' AND UltOrg = 'Cigna Corp' AND CycleYear in ('2006')
этот сгенерированный запрос передается методу Open
, поэтому он останавливается (до 5 секунд) не из-за самого метода Open
, а из-за выполнения этого запроса, который содержит условия и групповые операции (SUM
) на SQL Server, так что это проблема базы данных. Эта проблема, если она очень неудобная, должна решаться другими подходами (индексация, разделение данных, OLAP и т. Д.)