2017-06-07 5 views
0

enter image description here Ich versuche, alle Pläne in Spalte A und alle Bereiche für jeden Plan in Spalte B aufzulisten. So wäre es Plan 1 mit Bereich 1 und 2, Plan 2 mit Bereich 1 und 2, usw. Meine Codes listen derzeit Plan 1, Plan 2, usw. in Spalte A auf, aber es listet nur Bereich 1 und 2 für Plan 1 auf und hört dort auf. Wie schaffen Sie es weiterzumachen und Bereich 1 und 2 für den Rest der Pläne aufzulisten? Danke :))3 Verschachtelt für Schleife in Makro

Also Spalte A hätte Plan 1, Plan 2, etc. in Reihenfolge. Und Spalte B Bereich wäre 1, Bereich 2, Bereich 1, Bereich 2, etc

'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 

(Die auf der linke Seite in Bild ist das, was ich jetzt habe, und ich versuche, um das Bild zu bekommen auf der rechten Seite. Danke :))

+1

Zeigen deine Daten. Ein Bild würde reichen. – Masoud

+0

Hallo Masoud, wie fügst du ein Bild hinzu? Danke :) – JBB

+0

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

Antwort

3

Angesichts der Anzahl der Schleifen, die Sie haben, klingt es wie Sie besser wäre nur mit einem Zähler für Ihre Ausgangszeile.

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 

Alternativ OutputRow könnte jedes Mal berechnet werden, es benötigt wird:

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 

Wenn Sie nicht mit dem Steuerfluss von Schleifen verwendet werden, versuchen Sie das folgende Beispiel in einer Lauf leeres Arbeitsblatt:

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

Das ist wirklich hilfreich !! Wenn es 3 Loops gibt, beendet es die innerste Schleife und startet die erste Schleife erneut? Oder bewegt es sich in die zweite Schleife? Vielen Dank ! :) – JBB

+0

@JBB - jedes Mal, wenn eine 'Next'-Anweisung erreicht wird, wird der Zähler für diese Schleife inkrementiert und die Steuerung kehrt dann zur ersten Anweisung innerhalb der Schleife (wenn Sie den Endwert nicht überschritten haben) oder zur folgenden Anweisung (Wenn Sie haben). Nachdem die innerste Schleife im obigen Beispiel endet, bewegt sich die Steuerung zum "Next" der mittleren Schleife und ihr Zähler wird inkrementiert und die innerste Schleife wird möglicherweise erneut ausgeführt. Sobald die innerste Schleife zum letzten Mal in der mittleren Schleife endet, wird der Zähler der äußersten Schleife inkrementiert, und die mittlere Schleife beginnt erneut usw. – YowE3K

+0

Ich sehe. Vielen Dank! – JBB

Verwandte Themen