2013-08-27 106 views
1

我怎樣才能縮短這段代碼?原諒我的糟糕的編碼習慣,我自學成功,幾乎是一個小白菜。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」)分別與上述選擇的變化,所以做行號

所以,我基本上可以做這樣的事情?

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 
+0

是的,這是主意,雖然語法有點不合適。我已經編輯了我的答案,包括一個你應該可以使用一些調整的子。 –

回答

3

有幾件事你可以做。首先,它看起來像你檢查每一個下面的if語句:

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

你只需要一次運行測試,直到「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 

您還可以使用工作表變量替換你的牀單,這將減少你所要做的輸入量(也減少你的代碼的長度)。

例如:

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 

但到目前爲止爲您的降壓最大的爆炸將被更換,如果使用一個變量與循環語句的。

正如您在您的評論指出,「其中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 

注意,你沒有選擇粘貼前的靶紙。事實上,選擇和激活VBA代碼中的東西幾乎總是一種非常糟糕的做法。

+0

所以它看起來像這樣: – user2719818

+0

看看我最後的編輯。我用幾行代碼替換了199個if語句。 –

+0

啊,我明白了,這樣做更有意義,哈哈。我唯一的問題是,是否可以將列增加4?因爲我不需要檢查3-39之間的所有列。我感謝您的幫助 – user2719818