2009-03-02 7 views
0

Ich habe eine Schleife, die durch jede Spalte verläuft und legt den Wert auf eine R1C1 Summe von ein paar Zeilen darüber. Ich benutze eine for-Schleife, aber ich möchte ein paar Spalten überspringen, da sie bereits in der Zelle enthaltene Formeln enthalten. Wie kann ich eine Schleife einrichten, die nur eine nicht zusammenhängende Menge oder Nummern durchläuft?For-Schleife mit nicht zusammenhängendem Bereich

Als Referenz möchte ich es, um durch Spalten 1 bis 80, aber 25 cols überspringen, 36, 37, 44, 60, 63, 64, 67, 68, 73, 75 und 76.

bearbeiten : Danke Jungs, aber ich habe es schon funktioniert wie du es beschrieben hast; Ich war auf der Suche nach einer kürzeren und eleganteren Methode.

Edit 2: Ist das überhaupt VBA ?!

+0

Wo Joel Spolsky ist, wenn man ihn braucht. –

+0

Wer sagt, dass wir ihn brauchen? – Ikke

+0

Bin ich der Einzige, der bemerkt hat, dass Q'er von 1 bis 70 iterieren will, aber 73, 75 und 76 überspringt? – paxdiablo

Antwort

4

Ein VBA-Version von Learnings C# Antwort auf iterieren: -

Dim col As Integer: For col = 1 To 70 

    Select Case col 

    Case 25, 36, 37, 44, 60, 63, 64, 67, 68, 73, 75, 76 
     'do nothing' 

    Case Else 
     'do something' 

    End Select 

Next col 
+0

Ich finde ein Array, wo Sie die collumnnumbers einfacher pflegen, und besser codestyle. Ein Codepath, der nichts tut, ist nicht wirklich gut. – Ikke

+0

@Ikke: Du kannst immer deine eigene Antwort posten. ;-) Es ist trivial, den Code so zu ändern, dass er auf Inklusion basierend statt auf Ausschluss basiert. Ein Code-Pfad, der * aktiv * nichts macht, ist keine schlechte Sache, IMHO. Nichts implizit zu tun (wie eine fehlende else-Klausel) ist schlimmer. – Tomalak

+0

Ich denke, das "aktive Nichts" ist in Ordnung; Ich würde gerne einen Kommentar sehen, der sagt warum, wie "Überspringe diese Fälle, da diese Zellen leer sind", aber selbst "tue nichts" impliziert Absicht (damit du weißt, dass der leere Fall kein Fehler ist). – paxdiablo

1

Ich würde eines von zwei Dingen tun. Die erste besteht darin, nur den Körper für bestimmte Schleifennummern ausführen:

for i = 1 to 70 
    skipIt = false 
    skipIt = skipIt or (i = 25) 
    : : : 
    skipIt = skipIt or (i = 76) 
    if not skipIt then 
     ' Put your body here. ' 
    end if 
next 

Oder Sie springen direkt zum nächsten:

for i = 1 to 70 
    if i = 25 goto nextIter 
    : : : 
    if i = 76 goto nextIter 

    ' Put your body here. ' 
nextIter: 
next 
+0

Sind Sie sicher, dass Sie GoTo empfehlen möchten? Sicher, es funktioniert, aber ... – Tomalak

+0

Ich empfehle es nicht, nur sagen, es ist eine Möglichkeit. Und GOTO wird oft ohne guten Grund verleumdet. Es ist die Übernutzung, die zu Spaghetti-Code führt, der böse ist. Ein einzelnes Ziel, wie das zweite Beispiel, unterscheidet sich nicht von der Suche nach dem Ende eines Falls. – paxdiablo

1

Sie ein, wenn am Anfang der Schleife setzen könnte, und überspringen Sie die Spalten Sie nicht wollen, durch

1
for i = 1 to 70 
    { 
    switch (i) 
    { 
     case 25, 36, 37, 44, 60, 63, 64, 67, 68, 73, 75 76 : break; 
     default : // process break; 
    } 
    } 
+0

Ich glaube, das ist nicht VBA. – Tomalak

+0

true ... Ich dachte nur an den Ablauf und vergaß die Sprache :( – Learning

+0

Sie waren nicht zu weit weg, aber. ;-) – Tomalak

1

Sie können ein Array mit den Spaltennummern einrichten, die Sie verarbeiten müssen.

Ihre Schleife kann dann die Array-Werte durchlaufen.

Eine andere Lösung besteht darin, ein boolesches Array mit einem Wert für jede Spalte zu definieren und die Spalten zu markieren, die Sie überspringen möchten. Überprüfen Sie in der Schleife über alle Spalten das boolesche Array.

Noch eine andere Lösung ist, wenn Sie in der Schleife erkennen können, ob die Spalte eine Spalte ist, die Sie überspringen müssen (durch Erkennen der Formel, die da ist).

+0

+1 für Array. Einfachste Art zu pflegen. – Ikke

+0

@Renze de Waal: Arrays sind ein Schmerz in VBA zu verwenden. Ihr Vorschlag (Ihre Schleife kann dann loopen ...) wäre ohne guten Grund O (n²). Wenn Sie ein Array mit booleschen Werten vorkonstruieren möchten, müssen Sie alle Werte im Voraus kennen, nicht nur diejenigen, die Sie ausschließen möchten, oder Sie erstellen eine Situation mit einem Index außerhalb des Bereichs. – Tomalak

+0

Interessant, wie würde ich einfach ein Array mit meinen Spaltennummern einrichten? Ohne cols = Array (1,2,3,4 ... 23, 26, 27, ...) usw., natürlich. Gibt es eine Möglichkeit, Array (1:23, 26:35 ...) zu akzeptieren? –

0

Dieser Ansatz verwendet die Bereichsobjektfunktionalität von Excel.

Definieren Sie Ihren Bereich mithilfe der UNION-Methode von Excel als eine Reihe nicht zusammenhängender Spalten.

Um die Schleife zu beschleunigen, können Sie den Bereich so reduzieren, dass nur die Zellen eingeschlossen werden, die Formeln mit der SpecialCells-Methode des Bereichsobjekts enthalten.

Funktion LoopColumns() Dim Ziel As Range Dim Zelle As Range

ein Range-Objekt erstellen "auf der Grundlage der Union der Spalten Sie Ziel festlegen = Union (Range ("A: D" wollen) , Bereich ("F: G"), Bereich ("J: L"), Bereich ("P: Q"))

'Wenn Sie nur Formeln verarbeiten möchten, reduzieren Sie den Bereich erneut, aber mit ' Excel Definieren Sie den Bereich als nur die Zellen, die eine Formel Set Target = Target enthalten.Special (xlCellTypeFormulas, 1)

For Each Cell In Target.Cells 
    'process cells here... 
Next Cell 

End Function