2016-07-26 5 views
0

Ich habe ein großes VBA-Projekt, das mit der Änderung beauftragt wurde, wie es einige Daten sammelt.Leere Zellen - Wie man ein VBA-Verfahren/eine Funktion mit einer leeren/Null-Zelle stoppt

Grundsätzlich werden die Daten in der Spalte W auf dem Blatt eingegeben und es ist Code in das Makro ist dies:

For Each rCell In Worksheets("REPORT").Range("W2:W50") 
Debug.Print rCell.Value: 
    sJob = rCell.Value 

Es packt die Daten, die ich es in Spalte W.

greifen wollen

Kurz darauf schlägt er eine Funktion aus, die in diesem Code-Block ist:

vJobFolders = Split(FindJobDir(strpathtofile & sJob), ",") 
For i = 0 To UBound(vJobFolders) 

Und diese Funktion, genannt FindJobDir, sieht dies wie:

Function FindJobDir(ByVal strPath As String) As String 
Dim sResult As String 

sResult = Dir(strPath & "*", vbDirectory) 
FindJobDir = UCase$(sResult) 
Do While sResult <> "" 
sResult = Dir 
If Len(sResult) > 0 Then FindJobDir = FindJobDir & "," & UCase$(sResult) 
Loop 
End Function 

Was geschieht, nachdem er alle Daten, packt sie es Spalte W finden können, ist es weiterhin einfach alles in den Job-Pfad hinzuzufügen. Es hört erst auf, wenn alle "Jobs" in diesem Pfad gefunden sind. Ich brauche es, damit aufzuhören, wenn Daten in Spalte W null/leer sind.

Kein Profi bei VBA, weiß nicht, was ich sagen soll oder wo ... irgendwelche Vorschläge?

+0

Sie können den Bereich begrenzen, indem Sie die letzte Zeile mit Werten in Spalte W finden, siehe hier: http://stackoverflow.com/questions/11169445/error-in-finding-last-used-cell-in-vba Oder Sie können eine IF-Anweisung vor die zweite Zeile im ersten Codeblock setzen, um diese Iteration zu überspringen, wenn 'rCell.Value =" "' –

Antwort

1

Wenn ich richtig verstehe, möchten Sie den Code stoppen, wenn der Wert in Spalte W leer ist. Wenn dies der Fall sollte die folgende bearbeiten für Sie arbeiten ...

ändern diese:

For Each rCell In Worksheets("REPORT").Range("W2:W50") 
Debug.Print rCell.Value: 
    sJob = rCell.Value 

dazu:

For Each rCell In Worksheets("REPORT").Range("W2:W50") 
If IsEmpty(rCell.Value) Then Exit Sub 
Debug.Print rCell.Value: 
    sJob = rCell.Value 
1

Statt Exit Sub würde ich nur Exit For verwenden aus der brechen für Schleife, falls Sie Code haben, der nach dieser for-Schleife läuft.

For Each rCell In Worksheets("REPORT").Range("W2:W50") 
    If IsEmpty(rCell.Value) Then Exit For 
    Debug.Print rCell.Value: 
    sJob = rCell.Value 
    ' ... 
Next 

Ich würde auch nicht hart Code Ihren Bereich auf 49 Zellen. Wenn Sie mehr oder weniger Daten eingeben, werden Sie auf Probleme stoßen, wie Sie es gerade getan haben. Die beste Lösung wäre, den Bereich, der Sie mit etwas arbeiten auf dem ersten auszuwählen wie

Dim reportSheet As Worksheet 
Set reportSheet = Worksheets("REPORT") 

Dim lastRow As Integer  
lastRow = reportSheet.Cells(reportSheet.Rows.Count, "W").End(xlUp).Row 

Dim jobRange As Range 
Set jobRange = reportSheet.Range("W2:W" & lastRow) 

For Each rCell In jobRange 
    Debug.Print rCell.Value ' colon is only needed for line breaks 
    sJob = rCell.Value 
    ' ... 
Next 

Siehe this answer für eine Erklärung, wie die letzte Zeile berechnet wird.

+0

Es war verrückt bei der Arbeit als SOLO IT-Typ für "alle Dinge IT", aber ich habe vergessen zu kommentieren wie das bei mir funktioniert hat und ich bin so dankbar dafür. – Brian

+0

Eine letzte Frage ... wie kann ich es zwingen, GENAU zu sein, was sie in Spalte W eingeben, mit dem obigen Code? Sie laufen auf ein Problem, wo sie einen Job eingeben, sagen 161616 und wenn dieser Job Phasen hat, die wir wie 161616A, 161616B usw. nennen, zieht er alle zugehörigen Jobs ein, beginnend mit 161616. Wir brauchen eine exakte Übereinstimmung. – Brian

+0

Der einzige Ort, an dem ich möglicherweise die Ursache sehe, ist 'strPath & '*" '. Je nachdem, was Ihr Verzeichnismuster ist, kann "strPath &" \ * "' es lösen, aber das ist mehr auf Ihre spezifische Aufgabe als die eigentliche Frage ausgerichtet. – cheezsteak

Verwandte Themen