作者:杨子忧愁_347 | 来源:互联网 | 2023-05-27 09:55
如题。另select ……case语句 和if语句哪个运行速度快一些呢?
13 个解决方案
VBA的代码移植到VB,编译后的速度绝对不会变慢!
一般来说,if...else..endif比较select case 速度快,但在语言表达上不及后者清晰。
人呢?今天是不是放假啊,怎么人这么少啊?帮帮忙啊?
等了2个多小时了,怎么还不来人帮我啊,:(,痛哭流涕!
为什么会这样子?在excel中运行的速度也就是15秒左右,而到了vb里面确要等5分钟左右?
哦,我明白了,访问Office套件时,在VBA里确实比VB里快,原因VB只能使用Dispatch接口访问Office对象,而Office里访问这些对象时,可以直接通过vtable访问(因为二者在同一个进程里,甚至可以在同一个公寓线程里),在大量单元格访问时,二者速度相差很多。
你把完整的代码和数据给我,也许我能帮你优化一下。
Dim dScor#
num = xlApp.activesheet.range("G1").CurrentRegion.Rows.Count
With xlApp.activesheet
For i = 2 To num
'替换物理等级
dScor = val(.range("G" & i).Text)
If dScor>= wl.Scoreaj Then
.range("N" & i).Value = "A+"
ElseIf dScor>= wl.Scorea Then
.range("N" & i).Value = "A"
ElseIf dScor >= wl.Scorebj Then
.range("N" & i).Value = "B+"
ElseIf dScor >= wl.Scoreb Then
.range("N" & i).Value = "B"
ElseIf dScor >= wl.Scorec Then
.range("N" & i).Value = "C"
'ElseIf xlApp.WorksheetFunction.CountBlank(.range("G" & i)) <> 1 Then '判断excel单元格为空
ElseIf dScor > 0 then
.range("N" & i).Value = "D"
End If
'替换化学等级
dScor = val(.range("h" & i).Text)
Select Case dScor
Case Is >= hx.Scoreaj
.range("o" & i).Value = "A+"
Case Is >= hx.Scorea
.range("o" & i).Value = "A"
..........
End Select
............
Next i
'换一种样式
...........
'另存一份替换好等级的工作表到d盘
'xlApp.Cells.Copy
'Set newbook = xlApp.Workbooks.Add
'Set NewSheet = xlApp.worksheets.Add '创建新表
'NewSheet.Name = School & "等级成绩表"
'NewSheet.Paste
'==============================
xlApp.ActiveSheet.Name = School & "等级成绩表"
xlApp.ActiveWorkbook.SaveAs "d:\等级成绩表.xls"
第一条优化建议:
一般来说,如果是使用CreateObject函数实例化Office组件,可以改成Dim XX As New YYY,速度上也有较大提升,原因是VB对用New实例化的对象做了一定的优化,使用了专门的管理器,而CreateObjet是所有语言都可以使用的通用COM管理器。
第二条优化建议:
在赋值操作时,尽量使用类型明确的变量,比如:
Dim v As Variant
oSheet.Cells(1,1).Value = v '多一个运行期间的类型判断
如果改成
oSheet.Cells(1,1).Value = CStr(v) '直接指定VARIANT类型的vt成员为BSTR,速度比上一条语句快。
或者改成
Dim v As String
oSheet.Cells(1,1).Value = v
第三条建议
对Excel的数据进行读取时,可使用本地数组加快速度。数组的使用可参考:
http://support.microsoft.com/kb/177991/zh-cn
哦,原来如此,谢了lyserver,做了个Excel某一列数据查重,把Excel的数据读到数组里再比较查重比在Excel里直接查快了好几十倍,数据量小还不体现,上千数据量就已经差别很大了