kostenloser Webspace werbefrei: lima-city


Excel-VBA Problem mit If-Schleife

lima-cityForumProgrammiersprachenBasic

  1. Autor dieses Themas

    v*******0

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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?
  4. Autor dieses Themas

    v*******0

    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ß?
  5. 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
  6. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    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.
  7. Autor dieses Themas

    v*******0

    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
  8. Eine Schleife wiederholt einen Vorgang.

    Ein Wenn Dann Konstrukt selbst ist keine Schleife, er wird selbst nur einmal aufgerufen!
  9. h***********r

    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 ;)
  10. 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.
  11. Autor dieses Themas

    v*******0

    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
  12. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!