首页 > 解决方案 > 在 Excel 中处理对象组时创建循环以替换多个嵌套的 if 语句

问题描述

我不确定如何将下面附加的代码优化为某种形式的循环,并希望有人能够说明如何最好地解决这个问题。

基本上,我继承了一个电子表格,其中包含从宏记录器记录和/或由没有 VBA 经验的人编写的几个 VBA 模块,并且运行速度非常慢。我一直在经历并将许多冗余的“嵌套 if”类型部分减少到 for 循环中,以尝试优化和加快速度,但是我也非常缺乏经验,而且我自己也不是你可能猜到的编码器!

If Range("Link1").Value = "" Then
    Application.CutCopyMode = False

    GoTo Finale:
Else

If Range("Link2").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1")).Select
    Selection.Copy
Else

If Range("Link3").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2")).Select
    Selection.Copy
Else

If Range("Link4").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3")).Select
    Selection.Copy
Else

If Range("Link5").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4")).Select
    Selection.Copy
Else

If Range("Link6").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4", "Group5")).Select
    Selection.Copy
Else

If Range("Link7").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4", "Group5", "Group6")).Select
    Selection.Copy
Else

If Range("Link8").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4", "Group5", "Group6", "Group7")).Select
    Selection.Copy
Else

    ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4", "Group5", "Group6", "Group7", "Group8")).Select
    Selection.Copy

End If

End If

End If

End If

End If

End If

End If

End If

该代码处理复制 8 组“事物”(在本例中,每组都包含文本框和一个图形)并检查是否已填充链接,并在找到未填充的链接时复制先前的组。因此,这里的想法是只复制填充的组。

关于这一切的第二个问题是,当您有多个这样的 if 语句时,将这些事情减少到循环中实际上是更快或更优化,还是我应该寻找其他地方来进一步优化电子表格?将长段递归代码转换为最小循环当然感觉很好(!),但我不知道这是否真的是提高速度和稳定性真正需要做的,或者它实际上没有什么有意义的影响。

标签: excelvba

解决方案


很难从您提供的内容中判断您的代码在做什么,但是有几种方法可以至少使这部分更有效。

首先是使用ElseIf构造。这使您不必执行许多嵌套的 if 语句。

其次,您要尽可能避免使用Select

以下是重构代码的示例:

If Range("Link2").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1")).Copy
ElseIf Range("Link3").Value = "" Then
    ActiveSheet.Shapes.Range(Array("Group1", "Group2")).Copy
Elseif ...

推荐阅读