Microsoft Excel

Herbers Excel/VBA-Archiv

Verständnisfrage: 8 Zeilen VBA-Code nachvollziehen

Betrifft: Verständnisfrage: 8 Zeilen VBA-Code nachvollziehen von: Martin
Geschrieben am: 24.09.2014 10:20:31

Hallo Excelfreunde,

ich habe im Archiv eine passende Lösung zum Durchsuchen eines Verzeichnisses nach Dateien eines vorgegebenen Dateitypes gefunden. Es klappt auch wunderbar:

Sub ReadDirectory()
    Dim strFile As String
    strFile = Dir("C:\Test\*.xls")
    Do Until strFile = ""
        Debug.Print strFile
        strFile = Dir() 'diese Zeile verstehe ich absolut nicht
    Loop
End Sub
Leider vestehe ich den Code nicht und bitte euch deshalb um Erklärung des Codes. Es geht mir besonders um die Dir-Funktion. Warum liefert die Dir() bei jedem Durchlauf einen anderen Wert, obwohl innerhalb der Loop-Schleife keinerlei Parameter (z.B. ein Index) an die Dir-Funktion übergeben werden?
(Nach meinem Verständnis müsste die Variable strFile eigentlich immer denselben Wert von Dir() zugewiesen bekommen).

Viele Grüße

Martin

  

Betrifft: AW: Verständnisfrage: 8 Zeilen VBA-Code nachvollziehen von: Rudi Maintaire
Geschrieben am: 24.09.2014 10:24:48

Hallo,
ein Blick in die Hilfe bringt oft weiter.
Die Dir-Funktion gibt den ersten Dateinamen zurück, der mit dem Argument Pfadname übereinstimmt. Weitere mit dem Argument Pfadname übereinstimmende Dateinamen erhalten Sie durch das erneute Aufrufen der Dir-Funktion ohne Angabe von Argumenten.

Gruß
Rudi


  

Betrifft: AW: Verständnisfrage: 8 Zeilen VBA-Code nachvollziehen von: Martin
Geschrieben am: 24.09.2014 10:44:11

Hallo Rudi,

vielen Dank für deine schnelle und hilfreiche Antwort. Dann Frage ich gleich mal neugierig weiter: Kann man bei einer User Defined Function eine Art "Index" in Form einer Variable ohne zwangsweise modul- oder globalweiten Gültigkeitsbereich hochzählen lassen? (Also meine Frage lautet, ob man soetwas wie die Dir-Funktion auch benutzerdefiniert umsetzen kann.)

Viele Grüße

Martin


  

Betrifft: AW: ggf mit Static von: Daniel
Geschrieben am: 24.09.2014 12:47:07

Hi

du kannst sog. Statische Variablen verwenden.
diese gelten wie normale Variablen nur innerhalb der Funktion (also nix global), sondern behalten ihren Wert nach Makro/Funktionsende und haben dann diesen Wert beim Makro-Start.

Hier mal ein beispiel:
bei einem erneunten Aufruf der funktion ohne Parameter wird der zuletzt eingegebne Wert verwendet

Function Test(Optional EingabeAnwender As String = "xxx") As String
Static Wert As String
Dim bolNeuerWert As Boolean

If EingabeAnwender = "xxx" Then
    bolNeuerWert = False
Else
    Wert = EingabeAnwender
    bolNeuerWert = True
End If

Test = IIf(bolNeuerWert, "neu: ", "alt: ") & Wert

End Function
die Rücksetzung der Static-Variablen erfolgt:
- bei Start von Excel
- nach einem Fehlerabbruch
- nach dem Befehl END
- nach Ausführen der Buttons "Zurücksetzen" im VBA-Editor

Gruß Daniel


  

Betrifft: AW: ggf mit Static von: Martin
Geschrieben am: 24.09.2014 18:27:08

Hallo Daniel,

ich bin immer begeistert, wenn ich dazulerne! DANKE!
Ich habe nachgeschlagen und festgestellt, dass ich beim Lesen meines schlauen Excelbuches entweder nicht richtig aufgepasst oder es einfach wieder vergessen habe. Ich tippe mal auf Ersteres, weil kein Beispielcode abgedruckt wurde und ich es deshalb nicht verinnerlicht (oder verstanden) habe.

Viele Grüße

Martin


  

Betrifft: AW: ggf mit Static von: Martin
Geschrieben am: 24.09.2014 21:37:54

Hallo Daniel,

so, ich habe gleich mal eine praktische (sinnlose) Übung gemacht, die mir so durch den Kopf gegangen ist. Eine Ermittlung des Wochentages, wobei der Wochentag bei fehlender Argumentenangabe einfach um einen Tag nach oben gesetzt wird:

Sub Beispiel()
    Dim i As Integer
    
    Debug.Print Wochentag(Date)
    
    For i = 1 To 20
        Debug.Print Wochentag
    Next
    
End Sub

Function Wochentag(Optional dteDatum As Date) As String
    Static intWeekday As Single
    Dim arrWeekdays()
    
    arrWeekdays = Array("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", " _
Sonntag")
    
    If dteDatum = 0 Then
        If intWeekday = 0 Then
            Error (5)
        Else
            intWeekday = intWeekday + 1
            If intWeekday = 8 Then intWeekday = 1
        End If
    Else
        intWeekday = Weekday(dteDatum, vbMonday)
    End If
    
    Wochentag = arrWeekdays(intWeekday - 1)
    
End Function
Viele Grüße

Martin


  

Betrifft: AW: Verständnisfrage: 8 Zeilen VBA-Code nachvollziehen von: Jack_d
Geschrieben am: 24.09.2014 10:30:20

Hallo Martin,

ganz einfach

Beim ersten Aufruf der Dir-Funktion müssen Sie einen PathName angeben. Um das nächste Element abzurufen, können Sie die Dir-Funktion nachfolgend ohne Parameter aufrufen
vgl.

http://msdn.microsoft.com/de-de/library/dk008ty4%28v=vs.90%29.aspx


  

Betrifft: AW: Verständnisfrage: 8 Zeilen VBA-Code nachvollziehen von: Martin
Geschrieben am: 24.09.2014 10:46:17

Danke, Jack_d!

Ich habe gleich noch eine Frage nachgeschoben, vielleicht kannst du diese auch beantworten?
https://www.herber.de/forum/messages/1383131.html

Viele Grüße

Martin


 

Beiträge aus den Excel-Beispielen zum Thema "Verständnisfrage: 8 Zeilen VBA-Code nachvollziehen"