给2个建议:
第一,
Application.ScreenUpdating = False
与之相对应的语句没有,自然不能加速程式运行,在最后面加如下
Application.ScreenUpdating = True
第二,不要查一个比一个,一次性将数实际库存导入到一张隐藏sheet中,再从隐藏sheet中将值写到实际库存列中。数据库数据的导入导出运行是最慢的。所以写程式时尽量避免多次的数据导入导出。
For I = 1 To 300
为什么要指定循环300次?以下是我根据自己的理解稍微改了下代码; 供参考(改变不大)
Public RA As String
Sub StockBalance()
On Error Resume Next
Dim CNstring, Qstring As String
Dim Row As Integer
Dim CONN As ADODB.Connection
Dim RS As ADODB.Recordset
'Dim total As Double
Application.ScreenUpdating = False
Sheet1.Select
RA = "E3" & "E2000"
Range(RA).Delete
Set CONN = New ADODB.Connection
Set RS = New ADODB.Recordset
frow = 3
Total = 0
CNstring = "Provider=SQLOLEDB;Data Source=DS;Initial Catalog=SDB;User Id=hdb;Password=123"
CONN.Open CNstring
Qstring = "SELECT ID, STOCK AS '安全库存' from AA ORDER BY ID DESC"
RS.Open Qstring, CONN
Do Until Cells(frow, 1) = ""
'在SQL查询结果的数据集中循环搜索和Excel中第一列的ID相匹配的记录,如果相匹配则写入Excel中第三列对应单元格
Do Until RS.EOF
If (Cells(frow, 1) = RS(0)) Then
Cells(frow, 3) = RS(1)
Exit Do
Else
RS.MoveNext
End If
Loop
End If
frow = frow + 1
Loop
RS.Close
End Sub
是的,最好查询一次数据库就能完成。
两种方法:
1,如果数据库中表数据不是很大的话,可以查询结果存到一个数组对象中,后面只要访问这个数组对象来比较
2, 将excel表格数据导入到数据库中,和实际表做join