Anzeige
Archiv - Navigation
788to792
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
788to792
788to792
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
nur Dateinamen in Listbox schreiben
10.08.2006 18:58:44
Wastl
Hallo,
ich lese mir die Dateien, welche in einem Verzeichnis liegen per Makro ein. Ich möchte allerdings nur einen Teil des Dateinamens aufgelistet bekommen, der zwischen den beiden Punkten steht (Die Punkte sind in jedem Dateinamen enthalten).
.xxx.
angezeigt soll werden: xxx
Danke schon mal im Voraus,
Gruß,
Wastl

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: nur Dateinamen in Listbox schreiben
10.08.2006 19:31:14
ingUR
Hallo, Wastl,
generell sind die Funktionen Instr, Mid und Left zur Lösung Deiner Aufgabe einzusetzen. Leider hast Du nicht geschrieben, ob die Punkte eindeutig als Marken gelten können oder ob es mehrere Möglichkeiten gibt, da die Dateierweiterung fest den Punkt as Trennzeichen hat.
Hier ein Beilspiel, dass Du vielleicht nach Deinen Wünschen anpassen kannst oder die notwendigen Anweisungen herausfiltern kannst:

Sub Test()
Dim Teil
Teil = CutString("c:\temp\dfväoeägj\ggggde.123.sdffdgv.exe")
End Sub
Function CutString(QString As String) As String
Dim p As Integer
p = InStr(QString, ".")
If p > 0 Then
QString = Mid(QString, p + 1)
p = InStr(QString, ".")
If p > 0 And p = 4 Then  'ggf. And p = 4 streichen, wenn Musterlänge nicht fest ist
QString = Left(QString, p - 1)
End If
End If
If p > 0 Then CutString = QString Else QString = ""
End Function

Gruß,
Uwe
Anzeige
AW: nur Dateinamen in Listbox schreiben
11.08.2006 09:28:43
Wastl
Hallo Uwe,
danke für deine schnelle Antwort. Allerdings versteh ich leider den Code nicht ganz.
Was bedeutet z.B. diese Zeile:
Teil = CutString("c:\temp\dfväoeägj\ggggde.123.sdffdgv.exe")
Die Musterlänge steht nicht fest und die Punkte stehen z.B. folgendermaßen im Dateinamen:
_Klasse A.aktiv.txt
_Auto.defekt.txt
_Fahhrad.rot.txt
Vielen Dank und Grüße,
Wastl
AW: nur Dateinamen in Listbox schreiben
11.08.2006 11:46:56
ingUR
Hallo, Wastl,
wenn Du die beiden Prozeduren in ein Modul eingefügt hast, dann hast Du eine Programmroutine Sub Test, das nur als Test der Function-Prozedur dient.
Nach Deinen Fragen und Angaben zum Level vermute ich, dass es nützlich ist, detaillierter auf den Verlauf einzugehen. Dazu wäre es gut, wenn du gleichfalls das "Makro" Test schrittweise durchgehst (Makroaufruf:Schritt), so dass Du im VBA-Editor im Debug-Modus die Wirkunksweise der Einzelzeilen verfolgen kannst.
Das aufgerufene Programmteil wird im Code-Fenster angezeigt und die Fortschrittsmarke steht auf dem Eingang" der Prozedur Sub Test(). Danach kommt der Deklarationteil, in dem die Variabliennmaen dieser Prozedur definiert werden.
Mit der Funktionstaste [F8] wir die erste ausführbare Anweisung der Prozedur angesprungen, die hier in einem Funktionsaufruf besteht, deren Rückgabewert in dei Variable Teil gespeichert wird.
Fahre mit dem Mauszeiger auf den Varablennamen Teil und in einem Infofenster zur Variablen erhältst Du den momentanen Inhalt dieser Variablen, der z.Z. noch Leer ist. Hier soll also das hineingelegt werden, was auf der Rechten Seite des Gleichheitszeichen (Zuweisungszeichen) geliefert wird. Dort steht hier der Name einer Function-Prozedur, die einen Rückgabe wert liefert, der dann der Variablen zugewiesen wird.
Eine Function ist eine spezielle Prozedur, die mit ihrem Namen gleichzeitig eine Varible mit diesem Namen zur Verfügung stellt (Rückgabewert). Der Aufruf erfolgt der Art:
Function funcName(Param.-Liste mit Typenangaben) As Rückgabetyp
Für den vorliegenden Fall lautet der Funktionsname CutString, die Paramererliste besteht aus einem Übergabewert vom Typ String, der innerhalb der Funcuntion-Prozedur mit dem Namenen QString angesprochen wird. Als Rückgabewert wird ein Elemt mit dem Datentyp String benannt, die Prozedur ist also gemäß Deklaration eine Function vom Typ String.
Aufgerufen wird also die Funktion also im Programmteil Test auf der rechten Seite des Zuweisungszeichen in der Zeile, in der der Fortschritttszeiger des Debugger z.Z. stehen sollte. Der Aufruf erfolt durch Angabe des Funktion-Namens und der Parameterliste (ohne Datentypangabe).

Teil = CutString("c:\temp\dfväoeägj\ggggde.123.sdffdgv.exe")

Damit ist wohl gleich ein Teil Deine erste Frage beantwortet, Wastl, nämlich die, was den die Zeile zu bedeuten hätte, denn wenn Du nun [F8] betätitig, wird die Funktion aufgerufen. Doch damit nicht genug der Erklärung.
Bei diesem Schritt, wird der String "c:\temp\dfväoeägj\ggggde.123.sdffdgv.exe" an den Parameter der Funktion übergeben (mit dem Mauszeiger auf den Parameternamen QString fahren und im Info-Fenster den aktuellen Inhalt einsehen) und gleichzeitig intern eine Variable mit dem Namen CutString, also dem Namen der Funktion, angelegt.
Natürlich wird in Deinem QString so etwas wie "...._Auto.defekt.txt" drin stehen.
Das nächste Betätigen der [F8]-Taste führt zur Anweisung p = InStr(QString, "."), der Anweisung, die rechts die VB(A)-eigene-Funktion InStr mit den Parametern QString (Quellstring) und Suchstring aufruft. Als Rückgabewert liefert diese Funktion die Zeichenposition, an der der Suchstring im Quellstring zum ersten(!) Mal vorkommt.
Zurück zur Ausführung. In der Variablen p soll also die Stelle des ersten Vorkommens eines Punktes im QString geschrieben werden. Z.Z ist der Wert Null (Mausszeiger auf p stellen (Alternativ kan zur Überwachung der Ausdrücke hier gutr auch das Lokal-Fenster aus dem VBA-Editormenü "Ansicht" geöffnet werden, was Du jetzt auch bitte nachvollziehen solltest).
Stellts Du den Mauszeiger jedoch auf den Funktionsnamen rechts vom Zuweisungszeichen, so siehst Du bei VBA-Funktionen bereist das Resultat der Ausführung, also den Rückgabewert der Funktion InStr, obwohl die Zuweisung in der markierte Zeile noch nicht ausgeführt worden ist. Du siehst also den Zuweisungswert an p.
Der nächste Programmschritt [F8] führt die VBA-Funktion InStr aus und liefert in p die Stelle des ersten Punktes in QString. Ist dieser größer als 0, dann ist ein Punkt in QString gefunden (siehe auch Lokal-Fenster) und da es der erste Punkt ist, wird nun davon ausgegangen, dass nun nur noch der rechte Tei hinter dem Punkt für die weitere Untersuchung von Bedeutung ist.
Daher wird in der nächsten Anweisung,[F8] ist gedrückt worden, der QString ab der Position hinter dem gefundenen Punkt (p+1) bis zum Ende als nunmehriger Untersuchzngsstring AString gesetzt.
Nach [F8] in dieser Zeile ist das Ergenis (Rückgabewert) der VB(A)-Funktion auch im Lokal-Fenster zu sehen.
Erneut muss in diesem String nach einem Punkt gesucht werden. Wieder wird die VB(A)-Funktion InStr auf den "Reststring" QString angewandt.
Bevor nun in der nächsten Programmzeile die IF-Abfrage ausgeführt werden soll, ist der Teil " And p = 4" aus der Befehlszeile zu löschen, da Du mitgeteilt hast, dass der durch die beiden Punkte begrenzte TeilString nicht unbedingt vier Zeichen lang sein muß. Anderseits kannst Du aber auch gleich verhinder, dass zwei aufeinanderfolgende Punkte eine Leerstring als Suchergebnis liefern, indem untersucht, ob p größer MLEN+1 ist, also der Suchstring wenigstens MLEN Zeichen lang ist.
Wird ein zweiter Punkt gefunden, ist also p größer Null, dann wird nur der linke Teil vor dem Punkt für das Ergebnis von Bedeutung sein - es ist das Ergebnis! (siehe wieder im Lokalfenster oder Mauszeiger auf QString.
Die abschließende IF-Frage setzt nun das Ergebnis in die Funktions-Variable, jedoch nur dann, wenn p > Null ist, denn nur dann sind mindestens zwei Punkte in QString
gefunden worden. Und da ist dann auch schon ein Schönheitsfehler zu korrigieren, denn wenn kein gültiger Rückgabestring gefunden wurde, dann soll die Funktions-Rückgabevariable CutString leer bleiben.

If p > 0 Then CutString = QString Else CutString = ""

Schließlich gelangt die schrittweise Ausführung zum End Function. Hier werden, soblad diese Anweisung ausgeführt werden, alle lokalen Variablen "gelöscht", sie sind nicht mehr ansprechbar, verlieren ihre Gültigkeit, da ihr Gültigkeitsbereich verlassen wird.
Einzig die Funktionsvariable mit dem Namen der Funktion bleibt für die Dauer der Rückgabe erhalten, so dass sie direkt im aufrufendem Programm als Rechtswert (Zuweisungswert) einer Zuweisung benutzt werden kann, denn noch ist die Zeile, in der die Funktion CurString in der Prozedur Test aufgerufen wurde noch nicht follständig abgeschlossen.
Mit [F8] wird in diesem Fall der Abschluß erreicht. Es wird in das aufrufende Programm zurückgekehrt und gleich der Rückgabewert an Teil übergeben. Der Rückgabewert CutString ist extrem "kurzlebig", denn nur im Augenblick der Rückkehr ersetzt er einmalig den Funktionsaufruf in der aufrufenden Programmzeile; dannach erlischt dieser Rückgabewert.
Nun hoffe ich, dass es mir einigermaßen gelungen ist, die Zeile

Teil = CutString("c:\temp\dfväoeägj\ggggde.123.sdffdgv.exe")

vollständig aufzuschlüsseln und Du es so nachvollziehen konntest, dass Du die Funktion nutantis mutandis in Deinem Programmteil einsetzen kannst, ansonten hoffe ich nicht, dass ich mit den Erläuterung verschreckt oder zuviel Dir Altbekanntes vorgetragen habe.
Gruß,
Uwe
P.S.
Mögliche Aufrufe der Funktion in Deinem Fall:

DIM LName as sting, MPart as String
LName = "_Klasse A.aktiv.txt"
MPart = CutString(LName, ".")
' Ergebnis: MPart := "aktiv"
MPart = CutString("_Auto.defekt.txt", ".")
' Ergebnis: MPart := "defekt"
CutString("_Fahhrad.rot.txt",".")
' (!)Ergebnis: MPart := "aktiv" (denn Rückgabewert wurde nicht einer gültigen Variablen in diesem Gültkeitsbereich zugewiesen!)

Anzeige
AW: nur Dateinamen in Listbox schreiben
11.08.2006 21:36:27
Wastl
Hallo Uwe,
das ist ja vielleicht ein wunderbarer Service von dir!! Da war ich schon sehr überrascht so einen Profi gefunden zu haben, der einem so kleinen Lichtlein wie mir, die Tiefen der Makro-Programmierung näher bringt. Das hast du schon ganz richtig erkannt, dass ich ungefähr bei Null anfange!
Allerdings, wie könnte es anders sein, hab ich natürlich noch eine Frage:
Du gibst ja in eben dieser Zeile
Teil = CutString("c:\temp\dfväoeägj\ggggde.123.sdffdgv.exe")
einen festen Pfad vor. Bei mir wird der Pfad allerdings vom User selbst mit folgendem Code gewählt:
Function getdirectory(Optional msg) As String
'****************Funktion um ein Verzeichnis von Benutzer angeben zu lassen.
Dim bInfo As BROWSEINFO
Dim Path As String
Dim r As Long, X As Long, pos As Integer
bInfo.pidlRoot = 0&
If IsMissing(msg) Then
bInfo.lpszTitle = "Wählen Sie bitte einen Ordner aus."
Else
bInfo.lpszTitle = msg
End If
bInfo.ulFlags = &H1
X = SHBrowseForFolder(bInfo)
Path = Space$(512)
r = SHGetPathFromIDList(ByVal X, ByVal Path)
If r Then
pos = InStr(Path, Chr$(0))
getdirectory = Left(Path, pos - 1) & "\"
Else
getdirectory = ""
End If
End Function

Private Sub Pfad_Click()
xDIR = getdirectory()
Dim strFile As Variant
Dim datChanged As Variant
Dim i As Integer
Dim START_PATH As String
START_PATH = xDIR
Me.ListBox1.Clear
i = 0
strFile = Dir(START_PATH & "\*.*", vbNormal)
Do While Len(strFile) > 0
'datChanged = FileDateTime(START_PATH & "\" & strFile)
'If datChanged >= #12/5/2001# And datChanged <= #12/7/2006 11:59:59 PM# Then
Me.ListBox1.AddItem strFile, i
'Me.ListBox1.List(i, 1) = Format(datChanged, "dd.mm.yyyy hh:nn")
i = i + 1
'End If
strFile = Dir
Loop
End Sub

---------------------------
Wie kann ich dann diesen Pfad deinem Code übergeben?
Dann müsste ich wohl noch deine Vorschläge einbauen, um die Funktion aufzurufen! NUR WIE?
Ich hab mich ja schon fast nicht mehr getraut, dir eine weitere Frage zu schicken. Wenn man dich persönlich treffen könnte, würd ich dich glatt auf eine Maß Bier einladen.
Viele Grüße und herzlichen Dank,
Wastl
Anzeige
AW: nur Dateinamen in Listbox schreiben
12.08.2006 00:51:10
ingUR
Hallo, Wastl,
so wie ich das nachvollziehen kann, wählst Du eine Dateinamen aus der ListBox ListBox1 auf.
In diesem Objekt Listbox1 wird eine eine Liste verwaltet, deren Einträge der Reihe nach mit den ListBox1.ListIndex-Werten 0 bis ListBox1.ListCount durchnumeriert sind. Gefüllt wurde diese List in der Procedur Pfad_Click() durch die Anweisung Me.ListBox1.AddItem strFile.
Als erstes hättest Du den Prozedurcode der Funktion CurString in ein Modul des Projektes einzufügen.

Public Function CutString(QString As String) As String
Dim p As Integer
p = InStr(QString, ".")
If p > 0 Then
QString = Mid(QString, p + 1)
p = InStr(QString, ".")
If p > 1 Then QString = Left(QString, p - 1)
End If
If p > 0 Then CutString = QString Else CutString = ""
End Function

Nun hängt es von Deiner Aufgabenstellung ab, ob Du
(a) die Einzeleinträge von Nutzer manuell anwählen will ider
(n) alle Einträge ind der Liste automatisch bearbeiten möchtest.
Fall (a)
Durch die Auswahl eines Dateinamens durch Mausklick auf den betreffenden Eintag in der Liste, wird der Eingenschaftswert ListBox1.ListIndex gesetzt, gleichzeitig wird das Ereignis ListBox1_Click() ausgelöst und die entsprechende private Prozedur wird angesprungen.
Nur wenn die Ereignisprozedur Private Sub ListBox1_Click() noch nicht im Bereich der UserForm1 existiert, kann der nachfolgende Code direkt in den Programmbereich der Userform1 hineinkopiert werden:

Private Sub ListBox1_Click()
'auskommentierte Zeilen sind nur zu Verdeutlichung des Inhaltes
'der entsprechenden Eigenscchaftswerte der ListBox1 eingefügt und belassen
'Dim SelIdx As Long, SelFName As String
Dim Teil As String
'SelIdx = ListBox1.ListIndex
If ListBox1.ListIndex < 0 Then
MsgBox "Keine gültige Auswahl"
Exit Sub
End If
'SelFName = ListBox1.Text
Teil = CutString(ListBox1.Text)
End Sub

Andernfalls ist der Programmkörper zwischen den Begrenzungszeilen (Private Sub ListBox1() ... End Sub) in dei bestehende Prozedur an geeignete Stelle zu kopieren, und ist darauf zu achten, dass keine Namenskonflikte entstehen.
Damit hättest Du den Teil in Dein Programm eingebeit, der bisher durch den Programmteil Sub Test() erledigt wurde, also der Aufruf der Funktion CutString.
Wie Du das Ergebnis, als die Variable Teil behandelst hängt wieder von Deiner Aufgabenstellung ab. Legst Du z.B. auf der UserForm1 eine Bezeichnugsfeld mit dem Namen Label1an, so kannst Du das Egebnis der Caption-Eigenschft in der Prozefur Private Sub ListBox1_Click() zuweisen:
Label1.Caption = Teil
oder eben direkt - bei Streichung der Zeile Zeril = CutString( .... ) -
Label1.Caption = CutString(ListBox1.Text)
Anders sehen die Anweisungen aus, wenn der gefundene Teilstring in eine anders Objekt (Datenfeld, Listbox, ...) gespeicht werden soll. Es hängt auch davon ab, wo das Ergenis im Programm noch gebraucht wird.
Fall (b)
Sollen alle Einträge der Liste der ListBox1 automatisch untersucht werden, dann kann direkt im (DO ... LOOP)-Block der Prozedur Private Sub Pfad_Click() die Arbeit erledigt werden:

Do While Len(strFile) > 0
Me.ListBox1.AddItem strFile, i
Teil = CutString(strFile)   '***
'hier ist noch nachzutragen, wo die Ergebnisse
'eines jeden Schleifendurchgangs gespeichert
'bzw. angezeigt werden sollen.
i = i + 1
strFile = Dir
Loop

Soweit die Schritte zum Einbinden und Aufrufen der Funktion in Deine Projekt.
Gutes Gelingen nd Gruß,
Uwe
Anzeige
AW: nur Dateinamen in Listbox schreiben
12.08.2006 15:40:00
Wastl
Hallo Uwe,
Super, Perfekt!!!! Jetzt läuft die Sache! Ich hab dann die Variante b) eingebaut und jetzt läuft das Ding wie eine eins!
Machst du das eigentlich beruflich, oder wie wird man sonst so fit wie du in Sachen VBA? In welcher Region Deutschlands wohnst du denn? Ich würd mich gern erkenntlich zeigen und dich auf ein Bier oder gerne auch in ein 5 Sterne Restaurant einladen!
Wirklich toll von dir, dass du mir so geholfen hast!!
Vielleicht können wir ja in eMail-Kontakt treten. Mich erreichst du unter wastl.In@freenet.de
Also nochmal herzlichen Dank für deine Mühen!
Gruß,
Wastl
Anzeige
AW: nur Dateinamen in Listbox schreiben
13.08.2006 01:07:23
ingUR
Hallo, Wastl,
erfreulich zu lesen, dass die Aktion zum Einfpgen der Funktion erfolgreich und zu Deiner Zufriedenheit verlaufen ist.
Nein, Wastle, beruflich arbeite ich nicht als Programmierer, wenngleich ich die Kenntnisse beruflich nutzen kann um kleine Hilfsanwendungen mir zu schreiben, und um die wirklichen Feinheiten und Expertentricks zu erfahren, muß ich hier noch einiges lesen.
Herzlichen Dank für die Einladung, doch es ist auch schon Belohnung genug, wenn ich, ein Berliner, helfen konnte.
Danke, Wastl, das Angebot werde ich gerne annehmen, da mich doch der RAhmen der aufgabe interessiert, in dem dieses Teilproblem zu lösen war.
Auf jeden Fall ist wohl Dein Tatkraft zu würdigen, sich an einen derartiges Programm heranzuwagen, denn wenn es nur darum ginge, aus Dateinamen die Teilstrings herauszufiltern, so wäre das auch jedes VBA als Excel-Tabellenlösunng möglich, wobei man als Ausgansliste die Verzeichnisliste genutzt hätte, die man mit dem DOS-Befehl
dir *.txt > DirList.txt
als Textdatei erstellt haben würde. Alles weitere wären, nach dem Einlesen und Aufteilen in Spalten dieser Datei, Zellenformeln, die entsprechend auch in VBA zur Aufsplittung des Strings eingesetzt wurden.
Gruß,
Uwe
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige