在处理Excel中的对象组时创建一个循环来替换多个嵌套的if语句

时间:2019-06-12 07:57:43

标签: excel vba

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

基本上,我已经继承了一个电子表格,其中包含从宏记录器记录的和/或由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语句时,将这样的事情减少为循环实际上是有意义的更快或更优化的选择,还是我应该在其他地方寻找进一步优化电子表格的机会?将较长的递归代码转换为最少的循环当然感觉很好(!),但是我不知道这是否真的是真正需要做的以提高速度和稳定性,或者它实际上没有多大意义。

2 个答案:

答案 0 :(得分:0)

很难从提供的内容中看出代码的作用,但是有几种方法可以使这部分至少更有效。

第一种是使用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 ...

答案 1 :(得分:0)

或仅使用Select Case

Application.ScreenUpdating = False
Select Case Range("Links").Value
        Case "1": ActiveSheet.Shapes.Range(Array("Group1")).Group.Copy
        Case "2": ActiveSheet.Shapes.Range(Array("Group1", "Group2")).Group.Copy
        Case "3": ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3")).Group.Copy
        Case "4": ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4")).Group.Copy
        Case "5": ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4", "Group5")).Group.Copy
        Case "6": ActiveSheet.Shapes.Range(Array("Group1", "Group2", "Group3", "Group4", "Group5", "Group6")).Group.Copy
        Case Else: Application.CutCopyMode = False: GoTo Finale
    End Select
Application.ScreenUpdating = True

其中

Range("Links").Value只是您输入首选号码的一个单元格