VBA编译错误:过程太长

我怎样才能缩短这段代码? 原谅我不好的编码做法,我自学成人,几乎是一个小白菜。

代码由199个“Elseif”语句组成,我不知道任何其他方式来写我想要做的事情。

Sub CopytoRoutine() If Sheets("iPhone view").Range("A2") = Sheets("Routine").Range("B9") And Sheets("iPhone view").Range("A3") = Sheets("Routine").Range("C7") Then Range("A5:B5").Select Selection.Copy Sheets("Routine").Select Range("C9:D9").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ True, Transpose:=FalseL ElseIf Sheets("iPhone view").Range("A2") = Sheets("Routine").Range("B10") And Sheets("iPhone view").Range("A3") = Sheets("Routine").Range("C7") Then Range("A5:B5").Select Selection.Copy Sheets("Routine").Select Range("C10:D10").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ True, Transpose:=False ElseIf Sheets("iPhone view").Range("A2") = Sheets("Routine").Range("B11") And Sheets("iPhone view").Range("A3") = Sheets("Routine").Range("C7") Then Range("A5:B5").Select Selection.Copy Sheets("Routine").Select Range("C11:D11").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ True, Transpose:=False ElseIf Sheets("iPhone view").Range("A2") = Sheets("Routine").Range("B12") And Sheets("iPhone view").Range("A3") = Sheets("Routine").Range("C7") Then Range("A5:B5").Select Selection.Copy Sheets("Routine").Select Range("C12:D12").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ True, Transpose:=False ElseIf Sheets("iPhone view").Range("A2") = Sheets("Routine").Range("B13") And Sheets("iPhone view").Range("A3") = Sheets("Routine").Range("C7") Then Range("A5:B5").Select Selection.Copy Sheets("Routine").Select Range("C13:D13").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ True, Transpose:=False ElseIf Sheets("iPhone view").Range("A2") = Sheets("Routine").Range("B14") And Sheets("iPhone view").Range("A3") = Sheets("Routine").Range("C7") Then Range("A5:B5").Select Selection.Copy Sheets("Routine").Select Range("C14:D14").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ True, Transpose:=False ElseIf Sheets("iPhone view").Range("A2") = Sheets("Routine").Range("B15") And Sheets("iPhone view").Range("A3") = Sheets("Routine").Range("C7") Then Range("A5:B5").Select Selection.Copy Sheets("Routine").Select Range("C15:D15").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ True, Transpose:=False 

表格(“例程”)范围(“Bx”)其中x = 9-29

表(“例程”)范围(“C7”),该范围变为G7,K7,O7,S7,… AM7。 当上面到达B29时

范围(“C9:D9”)的列字母。select与上述分别更改,所以行号

所以我可以做这样的事情?

 Sub CopytoRoutine() Dim wb As Workbook Dim cpuview As Worksheet Dim routine As Worksheet Set wb = ThisWorkbook Set cpuview = wb.Sheets("iPhone view") Set routine = wb.Sheets("Routine") Dim x As Integer For x = 9 To 29 If cpuview.Range("A2") = routine.Range("Bx") And cpuview.Range("A3") = routine.Range("C7") Then Range("A5:B5").Select Selection.Copy routine.Select Range("Cx:Dx").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ True, Transpose:=False 

有几件事你可以做。 首先,它看起来像你在每一个if语句中检查以下内容:

 And Sheets("iPhone view").Range("A3") = Sheets("Routine").Range("C7") 

您只需要运行一次该testing,直到“C7”更改为“D7”。 你可以这样做,虽然我们会稍微优化一下:

 If Sheets("iPhone view").Range("A3") = Sheets("Routine").Range("C7") If Sheets("iPhone view").Range("A2") = Sheets("Routine").Range("B9") Then ...etc End If 

您也可以用工作表variables来replace您的工作表,这将减less您必须执行的打字量(同时缩短代码长度)。

例如:

  Dim wb As Workbook Dim iphone As Worksheet Dim routine As Worksheet Set wb = ThisWorkbook Set iphone = wb.Sheets("iPhone view") Set routine = wb.Sheets("Routine") ' now we don't have to specify the sheet each time, so instead of this: ElseIf Sheets("iPhone view").Range("A2") = Sheets("Routine").Range("B10") Then ' we can use this shorter version: If iphone.Range("A2") = routine.Range("B10") Then 

但是到目前为止,你最大的挑战就是用一个variables代替if语句。

正如你在你的评论中指出的那样,“这里x = 9-29”可以这样写:

 Dim myRow As Integer For myRow = 9 To 29 ' do stuff, replacing "x" with myRow Next myRow 

综合起来,您可以嵌套两个循环,一个用于增加的列,另一个用于您为每列处理的行的范围。

尝试这个:

 Sub ReplaceElseIfWithLoops() Dim wb As Workbook Dim iphone As Worksheet Dim routine As Worksheet Dim myRow As Integer Dim myCol As Integer Set wb = ThisWorkbook Set iphone = wb.Sheets("iPhone view") Set routine = wb.Sheets("Routine") For myCol = 3 To 39 ' column C = 3 and AM = 39 If iphone.Range("A3") = routine.Cells(7, myCol) Then For myRow = 9 To 29 If iphone.Range("A2") = routine.Range("B" & myRow) Then routine.Range(Cells(myRow, myCol), Cells(myRow, myCol + 1)).Value = iphone.Range("A5:B5").Value End If Next myRow End If Next myCol End Sub 

请注意,在粘贴之前,您不必select目标工作表。 事实上,select和激活你的VBA代码中的东西几乎总是一个非常糟糕的做法。