Live-Forum - Die aktuellen Beiträge
Datum
Titel
23.04.2024 14:59:21
23.04.2024 14:47:39
23.04.2024 14:23:45
Anzeige
Archiv - Navigation
1772to1776
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
Inhaltsverzeichnis

VBA Zeilen aus verschiedenen Dateien kop

VBA Zeilen aus verschiedenen Dateien kop
04.08.2020 16:15:02
Tobias
Hallo
ich suche schon den Ganzen Tag nach einer Lösung, bin aber nur bedingt fündig geworden.
Ich habe einen Ordner in dem mehrere CSV-Dateien liegen. (Sie haben alle den selben Aufbau: Bezeichnung; Wert; Datum Zeit)
Ich möchte die 1. Spalte nach der Entsprechenden Bezeichnung suchen und mir dann diese Zeilen mit der entsprechendem Bezeichnung in eine Extra Tabelle kopieren.
Ich hab schon das Beispiel DatenImportieren ausprobiert das eigentlich das schon machen sollte, jedoch macht es bei CSV gar nichts. und mit den einzelnen Zeilen komme ich so auch nicht klar. Ich hab dan den Code mit dem Suchen und Zeilenrauskopieren mit eingebaut, das hat aber auch nicht funktioniert.
Ich hoffe ihr könnt mir weiterhelfen.
Anbei mal der Code. (Mit auskomentiertem zeilenrauschreiben da das auch nicht funktioniert hat)
Vielen Dank schon mal.
Sub DatenImportieren()
Dim sVerzeichnis$, sDatei$
Dim wbZiel As Workbook, wbQuelle As Workbook
Dim wksZiel As Worksheet, wksQuelle As Worksheet
Dim ZeileZ&, FileCount&
Dim Zelle As Range
Dim Anzahl As Long, A As Long
Dim Suchwert As String
'Const StartZelle$ = "G6" '1. Auszulesende Zelle in Tabelle 1
'Const Schritt& = 3 'Spaltenabstand der auszulesenden Zellen
Suchwert = InputBox("Welches Suchwort", "Suchwort eingeben")  'Suchbegriff
On Error GoTo Fehler
'Suchverzeichnis auswahlen
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "Bitte Ordner mit zu durchsuchenden Dateien wählen"
.ButtonName = "Auswälen"
If .Show = -1 Then
sVerzeichnis = .SelectedItems(1)
sDatei = Dir(sVerzeichnis & Application.PathSeparator & "*.xl*")
If sDatei  "" Then
'neue Datei mit einem Tabellenblatt für Ergebnisdaten erstellen
Set wbZiel = Workbooks.Add(Template:=xlWBATWorksheet)
'Zieltabellenblatt Objektvariable zuweisen
Set wksZiel = wbZiel.Worksheets(1)
ZeileZ = 1
With wksZiel
'Titelzeile ausfüllen
.Cells(ZeileZ, 1) = "Name"
.Cells(ZeileZ, 2) = "Wert"
.Cells(ZeileZ, 3) = "Datum"
End With
End If
Application.ScreenUpdating = False
Do Until sDatei = ""
FileCount = FileCount + 1
Application.StatusBar = "Datei, laufende Nr. " & FileCount & " wird bearbeitet."
'Quelldatei schreibgeschützt öffnen
Set wbQuelle = Workbooks.Open( _
Filename:=sVerzeichnis & Application.PathSeparator & sDatei, _
ReadOnly:=True)
'Tabelle1 Objektvariable zuweisen
Set wksQuelle = wbQuelle.Worksheets(1)
'Werte aus Blatt 1 auslesen
'Anzahl = Application.WorksheetFunction.CountIf(wksQuelle.Range("A1:A20"), Suchwert)
'For A = 1 To Anzahl
'If A = 1 Then
' Set Zelle = wksQuelle.Range("A:A").Find(Suchwert)
'Rows(Zelle.Row).Copy Destination:=wksZiel.Rows(A, 1) 'ganze Zeile Kopieren
'Else
' Set Zelle = wksQuelle.Range("A:A").FindNext(Zelle)
' Rows(Zelle.Row).Copy wksZiel.Cells(A, 1) 'ganze Zeile Kopieren
'End If
'Next A
Set Zelle = wksQuelle.Range(StartZelle)
Do Until IsEmpty(Zelle)
If Zelle.Value  0 Then
ZeileZ = ZeileZ + 1
With wksZiel
'Info aus Zeile 1 eintragen
.Cells(ZeileZ, 1) = wksQuelle.Cells(1, Zelle.Column).Value
'Stückzahl eintragen
.Cells(ZeileZ, 2) = Zelle.Value
'Dateiname eintragen
.Cells(ZeileZ, 3) = sDatei 'gespeicherter Dateiname
'              .Cells(ZeileZ, 3) = wksQuelle.Cells(1, 1).Value 'Dateinem in A1 des Quellblatts
End With
End If
'Nächste Zelle setzen
'Set Zelle = Zelle.Offset(0,Schritt)
Loop
wbQuelle.Close savechanges:=False
Set wksQuelle = Nothing
Set wbQuelle = Nothing
sDatei = Dir
Loop
Application.ScreenUpdating = True
MsgBox "Alle Dateien ausgelesen"
End If
End With
Fehler:
With Err
Select Case .Number
Case 0 'alles OK
Case Else
Application.ScreenUpdating = True
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
If Not wbQuelle Is Nothing Then wbQuelle.Close savechanges:=False
End Select
End With
Set wbZiel = Nothing
Set wbQuelle = Nothing
Application.StatusBar = False
End Sub

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Crash der Kulturen
04.08.2020 18:24:15
Fennek
Hallo Tobias,
ohne die Schleife über alle CSV könnte das so aussehen:

Daten
Bezeichner, wert, Datum
Maier, 120, 20.1.2020
Schulze, 300, 2.2.2020
---------- VBA -- sucht nach Maier ------------
Const Pfad As String = "c:\users\[xxxxx]\desktop\"
Sub F_en()
Dim Readfile As String, csv() As String
Open Pfad & "Tobias.csv" For Binary As #1
Readfile = Space(LOF(1))
Get #1, , Readfile
Close #1
csv = Split(Readfile, vbCrLf)
Debug.Print Join(Filter(csv, "Maier", True, vbBinaryCompare), vbNewLine)
End Sub
Schaun wir mal, ob Du dich mit so einem Code anfreunden kannst.
mfg
Anzeige
AW: Crash der Kulturen
05.08.2020 07:58:23
Tobias
Hallo
Vielen Dank für die Antwort, ich hab jetzt mal nur ein Makro mit deinem Code gemacht und den Pfad, den Suchbegriff und den Dateinamen geändert. Sollte das bei einer Datei dann schon funktionieren? Weil momentan passiert gar nichts.
Vielleicht hab ich auch was falsch gemacht.
Const Pfad As String = "C:\Users\luthnerto\Desktop\Neuer Ordner\"
Sub F_en()
Dim Readfile As String, csv() As String
Open Pfad & "Test.csv" For Binary As #1
Readfile = Space(LOF(1))
Get #1, , Readfile
Close #1
csv = Split(Readfile, vbCrLf)
Debug.Print Join(Filter(csv, "CW44", True, vbBinaryCompare), vbNewLine)
End Sub
Anbei ein Bild wie die Daten aussehen.
Userbild
Anzeige
AW: Debug-Fenster
05.08.2020 08:49:20
Fennek
Hallo,
hast du im Debug-Fenster nachgesehen?
Es wäre hilfreich mehr über die Rahmenbedingeung zu wissen:
- wie viele Dateien (Anzahl und kB)
- wie häufige Updates der Datenquelle
- wie oft werden verschiedene Variablen gesucht
Sei dir bewußt, dass in einem kostenlosen Forum Hinweise ("Hilfe zur Selbsthilfe"), aber keine Dienstleistungen erbracht werden.
mfg
AW: Debug-Fenster
05.08.2020 10:59:58
Tobias
Hallo
die Werte wurden in dem Direktbereich angezeit. (Das hat also doch funktioniert) Ich wusste das mit dem Debugg/Direktbereich nicht... Entschuldigung!
Zum Projekt selber.
Es werden Energiedaten in eine CSV geschrieben die dann von einem eingelesen und ausgewertet werden. Die CSVs werden nach dem einlesen abgelegt.
Jetzt kann es passieren das beim Einlesen manche Messwerte nochmal eingelesen werden sollen und um hier nicht jedes mal alle CSVs komplett neu einzulesen möchte ich mir aus den Abgelegten CSVs nur den entsprechenden Messwert rauskopieren.
Die Datengröße variert. (ich sag mal zwischen 1kb - 1mb) Die Anzahl kann bis zu 100 dateien sein.
Die Datenquelle wird in dem Fall gar nicht aktualisiert da ich die Dateien zuvor manuell in einen ordner lege und diesen dann durchsuchen lasse.
Funktioniert das so mit deinem Code bei so einem großen Datensatz?
Ich kenne mich in VBA mit den Befehlen null aus. Ich programmiere normal SPS im Structuriertem Text ich kann mich zwar ein bischen mit den Schleifen und Variablendeklarationen reindenken aber welcher befehl was macht und wie die Syntax aussieht weis ich nicht...
Ich erwarte keine fertige Lösung, mir wäre schon geholfen wenn mir jemand sagen könnte was ich an diesem Code Falsch mache damit ich nicht den Fehler-Nr.: 13 Typen unverträglich bekomme.
Denn soweit hab ich es jetzt schon am Laufen das er mir dei einzelnen CSVs aufmacht und dann durchsucht nur anscheinend passt hier beim kopieren was nicht.
Set Zelle = wksQuelle.Range("A1")
Do Until IsEmpty(Zelle)
If Zelle.Value = Suchwert Then
ZeileZ = ZeileZ + 1
With wksZiel
'Bezeichnung eintragen
.Cells(ZeileZ, 1) = wksQuelle.Cells(Zelle, 1).Value
'Wert eintragen
.Cells(ZeileZ, 2) = wksQuelle.Cells(Zelle, 2).Value
'Datum eintragen
.Cells(ZeileZ, 3) = wksQuelle.Cells(Zelle, 3).Value
End With
End If
'Nächste Zelle setzen
Set Zelle = Zelle.Offset(1, 0)
Anzeige
AW: Bearbeitungszeit
05.08.2020 11:20:28
Fennek
Hallo,
vor dem Schreiben der erste Zeile Code sollten die Rahmenbedingungen geklärt werden (wie in deinem 2. Text)
Der Ausgangspunkt der Programmierung sollte m.E. die Bearbeitungszeit sein. Ca 100 Dateien zeilenweise durchzugehen dauert "ewig" und ist sehr fehleranfällig.
Ein Ansatz könnte sein, alle CSV-Dateine in eine zu kopieren (cmd: copy *.csv all.text). Mit 100 Dateien a 1 kb geht das bestimmt gut, mit 100 Dateien a 1 mb könnte es schwierig werden.
Der Vorteil meines (noch sehr unausgereiften) Codes ist es, dass die Datei auf einmal eingelesen wird und im Array verarbeitet. Das verspricht sehr schnell zu sein, aber die Funktion "filter" könnte bei großen Dateien Probleme machen.
Ich werde es mir noch enmal ansehen.
Käme auch Powershell infrage?
mfg
Anzeige
AW: Bearbeitungszeit
05.08.2020 11:32:34
Tobias
Hallo
In Powershell kenne ich mich gar nicht aus. Aber wenn es mit Powershell gehen würde müsste ich mich halt einarbeiten.
Wenn 100 Daten zu Viel bzw. die Dateien zu groß sind kopiere ich halt einfach nicht so viele in den Ordner.
Mir hätte diese Lösung mit dem Macro jetzt schon gefallen, da ich die Datei nacher wieder als CSV einlesen lassen muss.
Vielen dank trotzdem schon mal.
VG
AW: VBA-Code
05.08.2020 11:52:11
Fennek
Hallo,
dieser Code sollte laufen. Wo die Kapazitätsgrenze ist, musst Du herausfinden:

Const Pfad As String = "c:\users\[xxxx]\desktop\"
Sub F_en()
Dim Readfile As String, csv() As String
f = Dir(Pfad & "*.csv")
Do While f  vbNullString
Open Pfad & f For Binary As #1
Readfile = Space(LOF(1))
Get #1, , Readfile
Close #1
csv = Split(Readfile, vbCrLf)
out = Filter(csv, "Maier", True, vbBinaryCompare)
lr = Cells(Rows.Count, 1).End(xlUp).Row + 1
For i = 0 To UBound(out)
Cells(lr + i, 1) = out(i)
Next i
f = Dir
Loop
End Sub
mfg
Anzeige
AW: VBA-Code
05.08.2020 13:58:23
Tobias
Hallo
Funktioniert einwandfrei hab jetzt mal so 200 Excel mit jeweils 200kb durchsucht und es dauert keine Sekunde und schon hab ich die Daten.
Die einzige Verbesserung wäre noch das sie getrennt in Spalten geschrieben werden.
(Das muss ich jeztt noch über Kopieren in Editor und wieder zurück über den Textkonvertierungsassistent machen).
Das wird aber nicht so einfach sein weil es ein String ist oder?
Vielen Dank Für die Funktion!!!
AW: Text-in-Spalten
05.08.2020 14:22:21
Fennek
Hallo,
schön, dass es ging. Den letzten Schritt, Aufteilen in Spalte, geht mit im Menü "Text-in-Spalte". Der Makro-Rekorder kann das aufzeichnen.
mfg
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige