我有一个完整的应用程序,可以在Excel文档中搜索ID号(6个数字的集合)。一旦找到数字,它就会将它们放入标签中。我的问题是,excel表几乎是60000行,并且需要一段时间(当我按名称搜索时甚至更长)。有没有办法加快速度,或者搜索其他选项?
Private Sub SearchID()
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet1 As Excel.Worksheet
Dim rng As Excel.Range
Dim codeabc As String
Dim found As Boolean
Dim i As Integer
If AssociateID.Text = String.Empty Then
popup.Close()
MsgBox("Please make sure 'Associate ID' is filled out")
Exit Sub
End If
xlApp = CreateObject("Excel.Application")
xlBook = xlApp.Workbooks.Open("G:\grps\every\People Report\HRIS Remedy Report.xls")
xlSheet1 = xlBook.Worksheets(1)
rng = xlSheet1.Range("a1:a60000")
codeabc = (AssociateID.Text)
found = False
For i = 1 To rng.Count
If rng.Cells(i).Value = codeabc Then
IDLabel.Text = AssociateID.Text
NameLabel.Text = (rng.Cells(i).offset(0, 1).value())
DepartmentLabel.Text = (rng.Cells(i).offset(0, 3).value())
PositionLabel.Text = (rng.Cells(i).offset(0, 2).value())
found = True
xlBook.Close()
popup.Close()
Exit Sub
End If
Next i
If Not found Then
MsgBox("Associate ID: " & AssociateID.Text & " is not found. Please check the ID and try again")
AssociateID.Clear()
End If
popup.Close()
xlBook.Close()
End Sub
答案 0 :(得分:1)
来自VB的Excel调用本质上很慢。随着Excel文件变大,运行代码所花费的大部分时间就是Excel打开文件。通过将电子表格导出为CSV可以显着提升性能,但是您必须完全重写代码才能使用Excel之外的其他内容读取文件,即TextFieldParser。
由于你有工作代码并且只想提高性能,我猜这个Excel电子表格会被其他用户定期更新,并且手动转换文件是不切实际的。如果是这种情况,您可以尝试上面的Dale建议,或者,如果您的环境的安全设置允许,请考虑编写宏以在每次更新时自动转换Excel文件。
减少搜索时间的另一种方法是在代码搜索结果之前调用Excel。像让Excel对象全局化并让后台工作程序在启动时打开文件这样简单的操作将消除打开文件的延迟。沿着这些方向的更深入的解决方案是让您的应用程序以另一种格式维护一个完全独立的数据库,并在后台或战略时间更新它。例如,后台工作程序可以在启动时将Excel文件与SQL数据库进行比较,并根据需要进行更新。如果用户通常在更新完成之前启动搜索并且每天更新数据库满足您的需求,则可以将进程设置为在没有人将使用该应用程序时自动运行,例如,每天凌晨2:00。我更喜欢使用SQL进行快速搜索,this question中也是如此。
请记住,这些策略会严重影响代码的运行方式,并会使调试和更新程序更加复杂。如果您现在遇到的延迟是一个小小的不便,那么改变它可能是不值得的。但是,如果它削弱了应用程序的可用性,那么您可能没有其他选择。