ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 浅谈If语句的优化

浅谈If语句的优化

作者:绿色风 分类: 时间:2022-08-18 浏览:102
楼主
杨开科
  今天想起写这个帖子,高手就不用看了,对于初学都或许会有些许的帮助。
  如同工作表函数IF一样,If语句在VBA编程中使用极为频繁,但不同的写法,执行效率却不相同,下面以具体例子进行说明:
  在工作表Sheet2中的单元格区域H1:H10中输入一组数据,H1中应包含本例If语句中相应的字符串,如“粮食直补第一批”或“综合补贴第二批”等,然后在下面的代码中按连续F8跟踪代码执行。可见,即使第一个If语句已经成立(即Sheet2工作表中的H1单元格中找到包含“粮食直补”的字符串,下面三行If语句仍旧会被执行。
  1. '未优化的代码
  2. Sub DemoIf1()
  3.     Dim FinalRow As Integer, MyValue, TheValue
  4.     FinalRow = 10
  5.     With Sheets("Sheet1")
  6.         MyValue = Sheets("Sheet2").Range("H1").Value
  7.         TheValue = Sheets("Sheet2").Range("H2:H" & FinalRow).Value

  8.         If InStrRev(MyValue, "粮食直补") > 0 Then .Range("E2:E" & FinalRow).Value = TheValue
  9.         If InStrRev(MyValue, "综合补贴") > 0 Then .Range("F2:F" & FinalRow).Value = TheValue
  10.         If InStrRev(MyValue, "良种补贴") > 0 Then .Range("G2:G" & FinalRow).Value = TheValue
  11.         If InStrRev(MyValue, "退耕还林") > 0 Then .Range("H2:H" & FinalRow).Value = TheValue
  12.     End With
  13. End Sub
  对此代码稍作改变,便可提升代码执行效率,如:
  1. '优化后的代码
  2. Sub DemoIf2()
  3.     Dim FinalRow As Integer, MyValue, TheValue
  4.     FinalRow = 10
  5.     With Sheets("Sheet1")
  6.         MyValue = Sheets("Sheet2").Range("H1").Value
  7.         TheValue = Sheets("Sheet2").Range("H2:H" & FinalRow).Value

  8.         If InStrRev(MyValue, "粮食直补") > 0 Then
  9.             .Range("E2:E" & FinalRow).Value = TheValue
  10.         ElseIf InStrRev(MyValue, "综合补贴") > 0 Then .Range("F2:F" & FinalRow).Value = TheValue
  11.         ElseIf InStrRev(MyValue, "良种补贴") > 0 Then .Range("G2:G" & FinalRow).Value = TheValue
  12.         ElseIf InStrRev(MyValue, "退耕还林") > 0 Then .Range("H2:H" & FinalRow).Value = TheValue
  13.         End If
  14.     End With
  15. End Sub
  在DemoIf2过程中,连续按F8逐行跟踪代码执行。可见,如果第1个If语句成立,便直接跳到End If,后面3行ElseIf语句根本不会被执行。
  需要注意的是.Range("E2:E" & FinalRow).Value = TheValue应写在单独的物理行,否则会出现“编译错误,Else没有If”。有关InStrRev函数的详细信息,请参阅帮助。
  此外,对于提供用户输入的对话框,也应尽量按用户操作习惯来安排If语句中的代码顺序。如,一般情况下,用户不会单击“取消”,对单击“取消”作出的处理则应尽量放在后面。
2楼
杨开科
对于上面的例子,可用Like运算符代替InStrRev函数,其结果是一致的。

  1. Sub DemoIf3()
  2.     Dim FinalRow As Integer, MyValue, TheValue
  3.     FinalRow = 10
  4.     With Sheets("Sheet1")
  5.         MyValue = Sheets("Sheet2").Range("H1").Value
  6.         TheValue = Sheets("Sheet2").Range("H2:H" & FinalRow).Value

  7.         If MyValue Like "*粮食直补*" Then
  8.             .Range("E2:E" & FinalRow).Value = TheValue
  9.         ElseIf MyValue Like "*综合补贴*" Then .Range("F2:F" & FinalRow).Value = TheValue
  10.         ElseIf MyValue Like "*良种补贴*" Then .Range("G2:G" & FinalRow).Value = TheValue
  11.         ElseIf MyValue Like "*退耕还林*" Then .Range("H2:H" & FinalRow).Value = TheValue
  12.         Else: MsgBox "没找到匹配的字符!"
  13.         End If
  14.     End With
  15. End Sub

IF语句优化.rar

3楼
lrlxxqxa
实用!

初学都→初学者

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap