![]() |
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 SubLeider 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?
![]() ![]() |
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 Functiondie Rücksetzung der Static-Variablen erfolgt:
![]() ![]() |
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 FunctionViele Grüße
![]() ![]() |
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 aufrufenvgl.
![]() ![]() |
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
![]() |