VBA Dateinamen mit best. Wert in eine Listbox eintragen
Hallo Zusammen
Ich habe folgendes Problem: Ich möchte eine Maske mit 2 Knöpfen (Suchen und Markieren) und 1 Listbox erstellen.
1. Knopf --> Suchen : soll in einem Ordner (mit unterodner) "c:\test\" sämtliche Excel-Mappen öffnen und in der Tabelle "Eingabe" die Spalte X nach einem bestimmten Wert suchen z.B 05/07
Falls dieser Wert vorhanden ist soll das Makro die Namen von diesen Excel-Mappen in eine Listbox eintragen
2. Knopf --> Markieren: Später (nach der Bearbeitung dieser Mappen) möchte ich die gefundene Werte bzw. Zellen mit "Verarbeitet" überschreiben.
Für jede Hilfe bin ich dankbar!
gruss delium
Antwort schreiben
Antwort 1 von coros vom 15.05.2019, 11:27 Options
Hallo delium,
zu1. Kopiere nachfolgenden VBA-Code in das VBA-Projekt der UserForm, die den Button "Suchen" und die Listbox enthält.
[b]Option Explicit
Private Sub CommandButton1_Click()
Dim Dateityp$
Dim Verzeichnis As String, SearchKrit As String
Dim i As Integer
Application.ScreenUpdating = False
SearchKrit = "05/07"
Verzeichnis = "C:\Test\"
Dateityp = Dir(Verzeichnis & "\*.xls")
ListBox1.Clear
Do While Dateityp <> ""
GetObject (Verzeichnis & Dateityp)
For i = 1 To Workbooks(Dateityp).Sheets("Eingabe").Range("X65536").End(xlUp).Row
If Workbooks(Dateityp).Sheets("Eingabe").Cells(i, 24) = SearchKrit Then
ListBox1.AddItem Dateityp
Exit For
End If
Next
Workbooks(Dateityp).Close False
Dateityp = Dir()
Loop
End Sub[/b]
Hier wird jede Datei im Verzeichnis "C:\Test\" geöffnet und der Wert in Spalte X wird geprüft. Entspricht der Wert einer Vorgabe, wird er in der Listbox aufgeführt.
In dem Code musst Du in der Zeile
[b]SearchKrit = "05/07"[/b]
das Kriterium, nachdem gesucht werden soll, eintragen.
Zu 2.: Das habe ich nicht verstanden. Beschreibe das nochmal anders.
Solltest Du nicht wissen, wie Du den Code in Deine Datei bekommst, dann schau mal auf
meiner HP in der
Rubrik Anleitungen und dort dann in der
Anleitungsnummer 2 nach. Dort stelle ich dazu eine bebilderte Anleitung zur Verfügung, die Dir sicherlich helfen wird.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 2 von delium vom 15.05.2019, 11:54 Options
Hallo Oliver
danke erstmal für die schnelle Antwort.
zu 1: Also dein Code habe ich ausführen lassen
da kommt eine Laufzeitfehler:9
"index ausserhalb des gültigen Bereichs"
beim debuggen springt er auf die Zeile
For i = 1 To Workbooks(Dateityp).Sheets("Eingabe").Range("X65536").End(xlUp).Row
ne andere Frage -- > ist es möglich das Suchwort über die Maske zu steuern z.B mit einem Eingabefeld.
suchwort = TextBox10.Value oder sowas ähnliches?!!
zu 2 --> der Button soll nur die Werte die mit dem Button 1 rausgefunden wurde überschreiben also aus "05/07" soll er z.B "Verarbeitet" machen.
Danke im Voraus
mfg
Antwort 3 von coros vom 15.05.2019, 12:02 Options
Hallo delium,
im Verzeichnis "C:\Test\" liegen nur Exceldateien?
Diese Exceldateien enthalten alle das Tabellenblatt "Eingabe"?
In jeder der Dateien steht etwas in Spalte X?
Wenn das Suchkriterium in einer Textbox steht, so muss die Zeile
[b]SearchKrit = "05/07"[/b]
so
[b]SearchKrit = TextBox10.Text[/b]
abgeändert werden.
Zu 2.: Folgt später.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 4 von delium vom 15.05.2019, 12:05 Options
Hallo oliver
im Verzeichnis "C:\Test\" liegen nur Exceldateien?
--> Ja nur Exceldateien
Diese Exceldateien enthalten alle das Tabellenblatt "Eingabe"?
--> Ja
In jeder der Dateien steht etwas in Spalte X?
--> nein nicht immer.
gruss
Antwort 5 von coros vom 15.05.2019, 12:26 Options
Hallo delium,
es liegt daran, dass teilweise in Spalte X nichts steht. Was steht in den anderen Spalten. Gibt es eine Spalte, die Daten enthält bis zu der Zeile, in der auch in Spalte X nach dem Kriterium gesucht werden soll? Wenn ja, welche ist das?
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du
ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 6 von delium vom 15.05.2019, 12:44 Options
Hallo Olliver
Die Spalten von O bis X können evtl. die gesuchte Werte enthalten aber bei der Suche sollten Sie natürlich nicht auftauchen. Die andere Spalten haben verschiedene Überschriften z.B Bezeichnung, art, kennzahl etc.
PS:
Die Zellen mit den Werten, die für mich relevant sind bloß von X24 bis X33.
mfg
Antwort 7 von coros vom 15.05.2019, 12:53 Options
Hallo delium,
kopiere nachfelgende Codes in das VBA-Projekt Deiner UserForm.
[b]Option Explicit
Const Verzeichnis = "C:\Test\"
Private Sub CommandButton1_Click()
Dim Dateityp$
Dim i As Integer
Application.ScreenUpdating = False
Dateityp = Dir(Verzeichnis & "\*.xls")
ListBox1.Clear
Do While Dateityp <> ""
GetObject (Verzeichnis & Dateityp)
For i = 24 To 33
If Workbooks(Dateityp).Sheets("Eingabe").Cells(i, 24) = TextBox10.Text Then
ListBox1.AddItem Dateityp
Exit For
End If
Next
Workbooks(Dateityp).Close False
Dateityp = Dir()
Loop
End Sub
Private Sub CommandButton2_Click()
Dim i As Integer, j As Integer
For i = 0 To ListBox1.ListCount - 1
GetObject (Verzeichnis & ListBox1.List(i, 0))
For j = 24 To 33
If Workbooks(ListBox1.List(i, 0)).Sheets("Eingabe").Cells(j, 24) = TextBox10.Text Then
Workbooks(ListBox1.List(i, 0)).Sheets("Eingabe").Cells(j, 24) = "Verarbeitet"
Windows(ListBox1.List(i, 0)).Visible = True
Workbooks(ListBox1.List(i, 0)).Close True
Exit For
End If
Next
Next
End Sub[/b]
Das sollte jetzt funktionieren. Der Suchbegriff muss in TextBox10 stehen. Wenn nicht, den Code entsprechend abändern.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 8 von delium vom 15.05.2019, 13:47 Options
Hallo Oliver
Vielen Dank es funktioniert super..:-) bis auf paar Kleinigkeiten (zu mindest bei mir)
1) Unterordner werden nicht durchgesucht.
2) Der 2. Button markiert nur den ersten Wert. Rest wird nicht markiert.
ps: kann ich den Suchfeld erweitern z.B
anstatt
For i = 24 To 33 --> For i = 20 To 50
dementsprechend ändern sich die if Zeilen auch natürlich.
mfg
Antwort 9 von delium vom 15.05.2019, 13:48 Options
Hallo Oliver
Vielen Dank es funktioniert super..:-) bis auf paar Kleinigkeiten (zu mindest bei mir)
1) Unterordner werden nicht durchgesucht.
2) Der 2. Button überschreibt nur den ersten Wert. Rest bleibt weiterhin z.B "05/07".
ps: kann ich den Suchfeld erweitern z.B
anstatt
For i = 24 To 33 --> For i = 20 To 50
dementsprechend ändern sich die if Zeilen auch natürlich.
mfg
Antwort 10 von coros vom 15.05.2019, 14:02 Options
Hallo delium,
schreibe bitte mal, wass Du als Endresultat erwartest. Von Unterordner stand nirgends etwas. Außerdem stand
Zitat:
einem bestimmten Wert
und nicht, dass der Wert mehrfach in einer Datei vorkommt und überschrieben werden soll.
Außerdem weiß ich nicht, was Du mit der Erweiterung des Suchfeldes meinst?!?
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 11 von Delium vom 15.05.2019, 14:17 Options
Hallo Olliver
Tut mir leid wenn ich mich nocht so klar ausgedruckt habe..
Also der Ordner "Test" hat mehrere Unterordner. Jeder Unterordner hat Excel-Mappen die gleich aufgebaut sind z.B alle haben die Tabelle = "Eingabe" und alle haben die Spalte X mit Werten gefüllt, die Werte können mehrmals vorkommen untereinander usw.
mit deinem Code wird nur der erste gefundene Wert überschrieben wenn ich denn "Button 2" mehrmals drucke werden die anderen Werten natürlich auch überschrieben.(wäre einfacher mit einem Click alle Zellen mit "Verarbeitet" zu überschreiben)
Suchfeld erweitern:
Es kann sein dass in Zukunft eine oder zwei Zeilen dazu kommt die durchsucht werden soll d.h
Spalte X Zeile 24 bis Spalte X Zeile 40
Meine Frage war ob dies durch ändern der Variablen möglich ist?
mfg
Antwort 12 von Delium vom 15.05.2019, 14:27 Options
Zitat:
...(wäre einfacher mit einem Click alle Zellen mit "Verarbeitet" zu überschreiben)
Ich meine alle Zellen die gesuchten Wert enthalten.
Beispiel:
Ich suche "05/07"
als Ergebnis werden mehrere Excel-Mappen angezeigt.
mit dem "Button 2" alle Zellen die den Wert "05/07" haben werden überschrieben.
mfg
Antwort 13 von coros vom 15.05.2019, 14:41 Options
Hallo delium,
damit alle Werte einer Datei, die dem Suchkriterium entsprechen, überschrieben werden, lösche in dem Ereignis "CommandButton2_Click" den Befehl
[b]Exit For[/b]
der nach unter Befehl "Workbooks(ListBox1.List(i, 0)).Close True" steht heraus. Dann werden alle Werte überschrieben.
Zum Erweitern des Bereiches musst Du die Zaheln 24 bzw. 33 ändern. Diese Zeilen sagen aus, dass die Prüfung in Zeile 24 anfängt und nach Zeile 33 beendet ist.
Das mit den Unterverzeichnissen muss ich nachreichen. Wird aber erst heute Abend was, da ich jetzt weg muss (Termin). Ich melde mich dann wieder.
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 14 von Delium vom 15.05.2019, 14:43 Options
Hallo Oliver
Danke nochmal für den riesen Beitrag..:)
gruss
Antwort 15 von delium vom 15.05.2019, 15:55 Options
Hallo Oliver
wenn ich "Exit For" lösche kommt wieder die Laufzeitfehler:9
"index ausserhalb des gültigen Bereichs"
beim debuggen springt er auf die Zeile
If Workbooks(ListBox1.List(i, 0)).Sheets("Eingabe").Cells(j, 24) = TextBox1.Text Then
für den Unterordner suche habe ich einen Code gefunden aber konnte es nicht einbauen:
With Application.FileSearch
ChDir Pfad
.LookIn = Pfad
.SearchSubFolders = True
.FileType = msoFileTypeExcelWorkbooks
mfg
Antwort 16 von coros vom 15.05.2019, 17:20 Options
Hallo delium,
hier nun wie versprochen den Code, der alle Dateien in einem Verzeichnis und deren Unterverzeichnisse öffnet, nach dem Kriterium aus TextBox10 prüft und bei Betätigen des 2. Buttons die Daten überschreibt.
Kopiere nachfolgenden Codes wieder in das VBA-Prpjekt der UserForm.
[b]Option Explicit
Dim Obj As Object
Dim AnzDateien As Object
Dim Durchläufe As Object
Dim Dateityp As Object
Const Verzeichnis = "C:\Test\"
Private Sub CommandButton1_Click()
ListBox1.Clear
Prüfung_start
End Sub
Private Sub CommandButton2_Click()
Dim i As Integer, j As Integer
For i = 0 To ListBox1.ListCount - 1
Workbooks.Open (ListBox1.List(i, 0))
For j = 24 To 33
If ActiveWorkbook.Sheets("Eingabe").Cells(j, 24) = TextBox10.Text Then
ActiveWorkbook.Sheets("Eingabe").Cells(j, 24) = "Verarbeitet"
End If
Next
ActiveWorkbook.Close True
Next
End Sub
Private Sub Prüfung_start()
Set Obj = CreateObject("Scripting.FileSystemObject")
Set AnzDateien = Obj.getfolder(Verzeichnis)
Prüfung
End Sub
Private Sub Prüfung()
Application.ScreenUpdating = False
Dim i As Integer
For Each Dateityp In AnzDateien.Files
If Right(Dateityp.Name, 4) = ".xls" Then
Workbooks.Open (Dateityp.Path)
For i = 24 To 33
If ActiveWorkbook.Sheets("Eingabe").Cells(i, 24) = TextBox10.Text Then
ListBox1.AddItem Dateityp.Path
Exit For
End If
Next
ActiveWorkbook.Close True
End If
Next
For Each Durchläufe In AnzDateien.subfolders
Set AnzDateien = Durchläufe
Prüfung
Next
End Sub[/b]
MfG,
Oliver
Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 17 von delium vom 15.05.2019, 20:09 Options
Hallo Oliver
Es läuft einfach PERFEKT..:)
Danke
mfg
Antwort 18 von AdamFrank vom 22.05.2019, 21:22 Options
Hallo Oliver
Ich habe ein ähnliches Problem.. Kannst du mir da evtl. helfen wäre nett..
Ich habe in mehreren Ordnern .html dateien
Mit einem Makro möchte ich
1) ein Ordner auswählen können
2) und in diesem Ordner sämtliche .html dateien durchsuchen
3) falls in einer der Dateien der Begriff </Table> mehr als 3 mal vorkommt,
4) soll das Makro nach dem 4. </Tabel> bis auf das vor letzte die folgende Zeile einfügen
"<h3 style="page-break-before:always"></h3>"
Die .html dateien haben ca. 3 bis 20 Tabellen
Bsp. Html Datei:
<HTML>
<HEAD>
</HEAD>
<TABLE >
</TABLE>
-----> Hier nicht
<TABLE >
</TABLE>
-----> Hier nicht
<TABLE >
</TABLE>
-----> Ab Hier <h3 style="page-break-before:always"></h3>
<TABLE >
</TABLE>
-----> Hier <h3 style="page-break-before:always"></h3>
<TABLE >
</TABLE>
-----> und Hier <h3 style="page-break-before:always></h3>
<TABLE >
</TABLE>
-----> Hier nicht
</BODY>
</HTML>
Danke im Voraus.
mfg Adam