2016-05-18 6 views
0

Ich verwende eine Excel-Tabelle als Datentabelle für den Zeitraumverlauf. Die Struktur ist dies:Foreach über Excel-Zellen gibt nur die erste Zeile im Lauf zurück, funktioniert aber beim schrittweisen Durchlaufen der Methode ordnungsgemäß

ID Person  Start End 
1 Alan  5/1  5/3 
2 Bobbi  5/3  5/4 
3 Chuck  5/1  5/2 
5 Eugenia  5/3  5/6 
6 Chuck  5/10 5/12 

Start und End werden als Datumsfelder formatiert.

Ich schrieb eine Methode in einem VBA-Modul, um diese Tabelle abzufragen und alle Zeilen für eine bestimmte Person zurückzugeben, z. B. Chuck. In SQL ist dies einfach genug (select fields from History where Person = something). Ich verwende derzeit eine foreach Schleife und den Wert von Person testen. Meine Schleife lautet wie folgt:

Public Sub UpdatePeriod(currentPeriod as timePeriod) 

Dim indexCell As Range 
Dim colPeriods As New Collection 
Dim priorPeriod As timePeriod 

For Each indexCell in ThisWorkbook.Worksheets("History").Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row).Cells 
    If Not (indexCell Is Nothing) And IsNumeric(indexCell) = True Then 
     Set priorPeriod = GetPeriodObject(indexCell) 
     If (priorPeriod.Person = currentPeriod.Person) Then 
      colPeriods.Add priorPeriod 
     End If 
    End If 
Next 

'Do stuff with the entries in colPeriods.... 
End Sub 

Ich habe die Tabelle so einstellen, dass eine bestimmte das Blatt Worksheet_Change Ereignishandler ein timePeriod Objekt diese Methode übergeben wird. Bis jetzt funktioniert alles richtig (obwohl es wahrscheinlich einen besseren Weg gibt).

Wenn ich die Methode ohne vor dem For Each zu testen, wird die Schleife nur über Zeile 2 (wie Zeile 1 enthält die Header) ausgeführt. Aber wenn ich vor der Schleife breche, geht die Schleife richtig über alle Zeilen.

Wie kann ich diese Methode verbessern, um alle Zeilen von Interesse zurückzugeben?

(Anmerkung:.. Das Projekt wird mit VBA als Prototyp, und wird schließlich eine ordnungsgemäße Anwendung mit einer geeigneten Datenbank sein, die ich darauf abzielen die Datenschnittstelle zu machen genau gleich aussehen wie die Anwendung Implementierung)

Antwort

1

Die wahrscheinlichste Ursache ist, dass Sie den zweiten Range Anruf (oder Rows) nicht qualifiziert haben. Verwenden Sie:

Verwenden einer Variable für das Arbeitsblatt würde die Dinge vereinfachen!

+0

OK, ich werde ein 'With' in diesen Teil fallen lassen und Ihren Code ausprobieren. –

+0

Gewinner Gewinner Huhn Abendessen. Vielen Dank. (Alberner einzelner Zeichenfehler.) –

0
With ThisWorkbook.Worksheets("History") 
    For Each indexCell in .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row).Cells 
     .... 
    Next 
End With 
Verwandte Themen