2017-06-07 153 views
0

enter image description here我想列出列A中的所有計劃以及列B中每個計劃的所有區域。所以這將是計劃1與區域1和2,計劃2與區域1和2等。我的代碼目前在列A中列出了計劃1,計劃2等,但它只列出計劃1的區域1和2,並且它在那裏停止。你如何使它繼續下去,並列出其他計劃的區域1和區域2?謝謝:))3在宏中嵌套for循環

因此,列A將有計劃1,計劃2,等等。而且,B列是區域1,區域2,區域1,區域2等

'List out all areas for all plans 

For Plan = 0 To 5 

    'List out all areas within a plan 

For Area = 0 To 6 

    'List out one Area 

    For Row = 2 To 10 
     Sheets("S").Cells(Area * 51 + Row, 2) = Sheets("S").Cells(Area + 2, 31) 
     Next Row 
Next Area 
Next Plan 

(上圖左邊的一個是我,現在,我試圖去圖片感謝:))

+1

顯示你的數據。一張照片就足夠了。 – Masoud

+0

嗨馬蘇德,你如何添加圖片?謝謝:) – JBB

+0

https://meta.stackexchange.com/questions/83096/how-to-place-an-image-in-a-stack-overflow-question – Masoud

回答

3

鑑於你有多少個循環,這聽起來像你最好只使用一個計數器作爲你的輸出行。

Dim FirstPlan As Long: FirstPlan = 0 
Dim LastPlan As Long: LastPlan = 5 
Dim Plan As Long 

Dim FirstArea As Long: FirstArea = 0 
Dim LastArea As Long: LastArea = 6 
Dim Area As Long 

Dim FirstRow As Long: FirstRow = 2 
Dim LastRow As Long: LastRow = 10 
Dim myRow As Long ' Avoid "Row" as a variable name 
Dim OutputRow As Long 

OutputRow = 2 'Specify first row to be written to 

'List out all areas for all plans 
For Plan = FirstPlan To LastPlan 

    'List out all areas within a plan 
    For Area = FirstArea To LastArea 

     'List out one Area 
     For myRow = FirstRow To LastRow     
      'I'm guessing at this line 
      Sheets("S").Cells(OutputRow, "A").Value = _ 
        Sheets("S").Cells(Plan - FirstPlan + 2, "AD").Value 

      Sheets("S").Cells(OutputRow, "B").Value = _ 
        Sheets("S").Cells(Area - FirstArea + 2, "AE").Value 

      'I'm guessing at this line 
      Sheets("S").Cells(OutputRow, "C").Value = _ 
        Sheets("S").Cells(myRow - FirstRow + 2, "AF").Value 

      'Set up ready for the next row to be written 
      OutputRow = OutputRow + 1 
     Next 
    Next 
Next 

或者OutputRow可以計算出每一個它是需要時間:

Dim FirstPlan As Long: FirstPlan = 0 
Dim LastPlan As Long: LastPlan = 5 
Dim Plan As Long 

Dim FirstArea As Long: FirstArea = 0 
Dim LastArea As Long: LastArea = 6 
Dim Area As Long 

Dim FirstRow As Long: FirstRow = 2 
Dim LastRow As Long: LastRow = 10 
Dim myRow As Long ' Avoid "Row" as a variable name 
Dim OutputRow As Long 

'List out all areas for all plans 
For Plan = FirstPlan To LastPlan 

    'List out all areas within a plan 
    For Area = FirstArea To LastArea 

     'List out one Area 
     For myRow = FirstRow To LastRow     
      OutputRow = ((Plan - FirstPlan) * (LastArea - FirstArea + 1) + _ 
         (Area - FirstArea)) * (LastRow - FirstRow + 1) + _ 
         (myRow - FirstRow) + 2 

      'I'm guessing at this line 
      Sheets("S").Cells(OutputRow, "A").Value = _ 
        Sheets("S").Cells(Plan - FirstPlan + 2, "AD").Value 

      Sheets("S").Cells(OutputRow, "B").Value = _ 
        Sheets("S").Cells(Area - FirstArea + 2, "AE").Value 

      'I'm guessing at this line 
      Sheets("S").Cells(OutputRow, "C").Value = _ 
        Sheets("S").Cells(myRow - FirstRow + 2, "AF").Value 

     Next 
    Next 
Next 

如果你不習慣循環的控制流程,嘗試運行在下面的例子中空工作表:

Dim colA As Long, colB As Long, colC As Long 
Dim r As Long 
With ActiveSheet 
    For colA = 11 To 12 
     For colB = 21 To 23 
      For colC = 31 To 34 
       r = r + 1 
       .Cells(r, "A").Value = colA 
       .Cells(r, "B").Value = colB 
       .Cells(r, "C").Value = colC 
      Next colC 
'The following statement will be executed AFTER processing colC as 34 
     Next colB 
'The following statement will be executed AFTER processing colB as 23 
    Next colA 
'The following statement will be executed AFTER processing colA as 12 
End With 
+0

這真的很有幫助!當有3個循環時,它是否完成了最內部循環並重新開始第一個循環?或者它移動到第二個循環?謝謝 ! :) – JBB

+0

@JBB - 每次達到「Next」語句時,該循環的計數器都會遞增,然後控制權返回循環內的第一條語句(如果您尚未超出最終值)或返回至以下語句(如果你有)。因此,在上面的例子中最內層的循環結束之後,控制移動到中間循環的「下一個」並且其計數器遞增,最內層的循環可能會再次執行。一旦最內層循環在中間循環中最後一次結束,則最外層循環的計數器遞增,中間循環再次開始,等等。 – YowE3K

+0

我明白了。謝謝! – JBB