我不确定如何将下面所附的代码优化成某种形式的循环,并希望有人能够说明如何最好地解决此问题。
基本上,我已经继承了一个电子表格,其中包含从宏记录器记录的和/或由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语句时,将这样的事情减少为循环实际上是有意义的更快或更优化的选择,还是我应该在其他地方寻找进一步优化电子表格的机会?将较长的递归代码转换为最少的循环当然感觉很好(!),但是我不知道这是否真的是真正需要做的以提高速度和稳定性,或者它实际上没有多大意义。
答案 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
只是您输入首选号码的一个单元格