Excel-VBA Problem mit If-Schleife
lima-city → Forum → Programmiersprachen → Basic
abarbeiten
abfrage
anzahl
code
element
ende
fehler
file
inhalt
liste
modul
not
problem
rang
referenzliste
schleife
set
url
verwenden
zeile
-
Hey,
hier mal die Ausgangsdaten. Ich habe eine Liste die bei L8 beginnt, die Summe der Einträge ist in O1 eingetragen. Anschließend lese ich die Dateien eines Ordners (Pfad in A5) aus und lasse ihn ab E8 ausgeben.
Funktionierte soweit alles perfekt, nur ist es zum Abarbeiten ungeeignet, da ich gleiche Werte nicht in der gleichen Zeile habe.
Hab danach in der Ausgabeschleife (If Not objDatei Is Nothing Then) eine weitere If-Abfrage hinzugefügt und genau hier muss irgendwo der Fehler liegen.
Zum Verdeutlichen: https://imgur.com/a/xfOuY
Die Ausgabe soll so erfolgen wie im unteren Bild zu sehen. Die aktuelle Ausgabe ist im mittleren Bild zu sehen. Das obere Bild zeigt die Ausgabe vor der If-Abfrage.
Hier der VBA Code:
Sub DateienAuflistenA5() Dim lngZeile As Long Dim objFileSystem As Object Dim objVerzeichnis As Object Dim objDateienliste As Object Dim objDatei As Object Set objFileSystem = CreateObject("scripting.FileSystemObject") Set objVerzeichnis = objFileSystem.GetFolder(Cells(5, 1)) Set objDateienliste = objVerzeichnis.Files lngZeile = 8 lngZeile2 = Cells(1, 15) + lngZeile For Each objDatei In objDateienliste If Not objDatei Is Nothing Then If ActiveSheet.Cells(lngZeile, 12).Value = objDatei.Name Then ActiveSheet.Cells(lngZeile, 5) = objDatei.Name ActiveSheet.Cells(lngZeile, 10) = Right(objDatei.Name, 3) lngZeile = lngZeile + 1 Else ActiveSheet.Cells(lngZeile2, 5) = objDatei.Name ActiveSheet.Cells(lngZeile2, 10) = Right(objDatei.Name, 3) lngZeile2 = lngZeile2 + 1 End If End If Next objDatei End Sub
Beitrag zuletzt geändert: 4.12.2017 13:28:50 von vb1185700 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Bin mir nicht ganz sicher...
Kann es sein, daß Du die Variablen nicht nur dimensionieren, sondern auch initialisieren (also auf Default-Werte setzen) mußt? -
Sry, verstehe leider 0,0 was du meinst.
Ich weiß jetzt wo das Problem ist, aber nicht wie ich es umgehen soll ...
Es wird z.b. beim ersten Datensatz geprüft ob 0E.txt dem Inhalt von L8 entspricht (01.txt).
Das tifft nicht zu und darum kommt es ans Ende.
Das Script sollte davor aber erst noch prüfen ob 0E.txt in den anderen Zeilen (L9, L10, usw) vorkommt und dann erst, wenn es nicht im Zellenbereich vorkommt, ans Ende setzen.
Ich kann aber jetzt keine 100 elfeif reinpacken, da ich ja nie weiß wie lange die Liste ist die ich zur Überprüfung bekomme.
Wie löse ich das jetzt bloß? -
In der Regel setzt man für Variablen Ausgangswerte, damit bestimmte, nicht beabsichtigte Situationen (z.B. Division durch 0) nicht eintreten. Das macht man bei strukturiertem Basic in dem Block, indem die Variablen für das Programm angemeldet werden. Das Ganze nennt sich Initialisierung. Nur für lokale Variablen macht man das ggf. "vor Ort", also am Beginn des jeweiligen Moduls.
Zu prüfen wäre jetzt:
- ob Du durch Belegung einer von Dir gebrauchten Variablen mit einem bestimmten Wert
- durch Änderung der Reihenfolge bei der Abfrage der Bedingungen
- durch eine andere Form der Bedingungsabfrage (while-wend-Schleife z.B.)
oder durch eine Ergänzung um weitere Bedingungsüberprüfungen
Deinem Problem auf die Pelle rücken kannst, es löst oder ihm auf auf die Spur kommst.
Zwischen Fehler und Mist liegt jede Menge Tierverdauung.
Beitrag zuletzt geändert: 4.12.2017 15:53:11 von john-gunn -
Wenn man nicht 100 elseif verwenden will, kann man auch eine Schleife verwenden, würde ich behaupten wollen. Wenn du alle Dateien unterhalb prüfen willst, würde ich als Abbruchkriterium der Schleife verwenden, ob die Zelle leer ist (also ein Dateinamen vorhanden ist oder nicht). Wenn einer vorhanden, soll auch dort noch geprüft werden, ansonsten ist Ende Gelände.
-
Nach langem hin und her bin ich zu einer Lösung gekommen. Allerdings hab ich noch ein Problem. Es funktioniert wunderbar, wenn der Dateiname mit der Liste übereinstimmt (wird in die richtige Zeile geschrieben).
Kommt allerdings der erste Wert, der nicht in der Liste ist, bricht das Script ab bevor es den "else" Befehl anwendet. Fehlermeldung: Objektvariable oder with-blockvariable nicht festgelegt
Sub DateienAuflistenA5() Dim lngZeile As Long Dim objFileSystem As Object Dim objVerzeichnis As Object Dim objDateienliste As Object Dim objDatei As Object Set objFileSystem = CreateObject("scripting.FileSystemObject") Set objVerzeichnis = objFileSystem.GetFolder(Cells(5, 1)) Set objDateienliste = objVerzeichnis.Files lngZeile = 8 lngZeile2 = Cells(1, 15) + lngZeile For Each objDatei In objDateienliste If Not objDatei Is Nothing Then If ActiveSheet.Range("L8:L22").Find(objDatei.Name) = objDatei.Name Then intRow = lngZeile Do While Not ActiveSheet.Cells(intRow, 12) = objDatei.Name intRow = intRow + 1 Loop ActiveSheet.Cells(intRow, 5) = objDatei.Name ActiveSheet.Cells(intRow, 10) = Right(objDatei.Name, 3) MsgBox "gefunden! Zeile:" & intRow Else ActiveSheet.Cells(lngZeile2, 5) = objDatei.Name ActiveSheet.Cells(lngZeile2, 10) = Right(objDatei.Name, 3) lngZeile2 = lngZeile2 + 1 End If End If Next objDatei End Sub
-
Eine Schleife wiederholt einen Vorgang.
Ein Wenn Dann Konstrukt selbst ist keine Schleife, er wird selbst nur einmal aufgerufen! -
oportal schrieb:
Eine Schleife wiederholt einen Vorgang.
Ein Wenn Dann Konstrukt selbst ist keine Schleife, er wird selbst nur einmal aufgerufen!
Es sei denn es startet sich selbst als Funktion neu. Das sieht hier aber nicht so aus ;) -
Mag sein, daß ich Dein Problem falsch verstanden habe. Deshalb mag auch die Lösung falsch sein:
Du kennst zu Anfang die Anzahl der Elemente in Deiner Liste?
Wenn nicht Anzahl Elemente ermitteln!
Für jedes Element in der Liste
----Vergleich mit Deiner Referenzliste
----Übereinstimmung ja - Modul Übereinstimmung abarbeiten
----sonst Modul "keine Übereinstimmung" abarbeiten
nächstes Element
Wenn Du die Anzahl der Elemente nicht kennst, aber die Anzahl der Listenplätze könntest Du vor die Überprüfung auf Übereinstimmung noch eine Überprüfung darauf einfügen, ob die Zelle der Liste überhaupt einen Inhalt hat
Für jedes Element in der Liste
___Element leer? dann zum Schleifenende
------sonst: Vergleich mit Referenzliste
---------Inhalt gleich? dann Modul "Übereinstimmung" abarbeiten
---------sonst Modul "keine Übereinstimmung" abarbeiten
nächstes Element
Willst DU zusätzlich prüfen, ob Dein Text in einer anderen Zeile der Referenzliste vorkommt:
für jedes Element in der Liste
___Element leer? dann zum Schleifenende
_____sonst: Für jedes Element der Referenzliste
_________Vergleich mit Element
_____________gleich? dann Modul "übereinstimmung" abarbeiten
---------------------sonst
_____nächstes Element der Referenzliste
Schleifenende
"keine Übereinstimmung" abarbeiten
nächstes Element
Modul "Übereinstimmung"
---Element in richtiger Zeile?
___ dann: entsprechende Ausgabe
____Modulausgang
__sonst: entsprechende Ausgabe
Modulausgang (Rückkehr zum Aufruf)
coden mußte das selber. -
Funktioniert einwandfrei. Hier der fertige Code falls jemand so was gebrauchen kann:
Sub DateienAuflistenA5() Dim lngZeile As Long Dim objFileSystem As Object Dim objVerzeichnis As Object Dim objDateienliste As Object Dim objDatei As Object Set objFileSystem = CreateObject("scripting.FileSystemObject") Set objVerzeichnis = objFileSystem.GetFolder(Cells(5, 1)) Set objDateienliste = objVerzeichnis.Files lngZeile = 8 lngZeile2 = Cells(1, 15) + lngZeile For Each objDatei In objDateienliste If Not objDatei Is Nothing Then If Not ActiveSheet.Range("L8:L22").Find(objDatei.Name) Is Nothing Then If ActiveSheet.Range("L8:L22").Find(objDatei.Name) = objDatei.Name Then intRow = lngZeile Do While Not ActiveSheet.Cells(intRow, 12) = objDatei.Name intRow = intRow + 1 Loop ActiveSheet.Cells(intRow, 5) = objDatei.Name ActiveSheet.Cells(intRow, 10) = Right(objDatei.Name, 3) MsgBox objDatei.Name & " gefunden in Zeile: " & intRow End If Else ActiveSheet.Cells(lngZeile2, 5) = objDatei.Name ActiveSheet.Cells(lngZeile2, 10) = Right(objDatei.Name, 3) lngZeile2 = lngZeile2 + 1 MsgBox objDatei.Name & " nicht gefunden, Name wird in neue Zeile geschrieben." End If End If Next objDatei End Sub
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage