Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1588to1592
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

Makro für Exceltabellenauslesung/Zusammenfassung

Makro für Exceltabellenauslesung/Zusammenfassung
30.10.2017 10:11:57
Sebastian
Guten Morgen,
Makros sind überhaupt nicht mein Ding.
Vielleicht könnte mir jemand auf die Sprünge helfen :-/
Ich möchte in einem Ordner alle Exceltabellen eine bestimmte Spalte nach Namen durchsuchen lassen und den Wert der direkt daneben steht in einer Gesamtübersicht (andere Exceltabelle, in einer bestimmten Reihenfolge) zusammenfassen.
Die Quelltabellen in dem Ordner sind inhaltlich (bis auf den Wert) immer gleich und sehen immer so aus:
Produktionsbericht vom XX.XX.XXXX
Produktionsbericht vom XY.XX.XXXX
etc.
Daten stehen jeweils im Reiter 2 (Name:Eingabe Zeiten) des jeweiligen Produktionsberichtes:
Spalte 1________Spalte 2
Abteilung1______Stundenanzahl
Abteilung2______Stundenanzahl
etc_____________etc
Ziel ist es eine Übersichtstabelle zu erstellen die immer automatisch im Ordner alle Produktionsberichte im Reiter2 nach den Abteilungsnamen sucht und sich die Werte merkt.
Diese sollen dann wie folgt in der Zieldatei ausgegeben werden:
Dateiname____________________________Abteilung1__Abteilung 2 etc
Produktionsbericht vom XX.XX.XXXX_________Wert_______Wert
Produktionsbericht vom XY.XX.XXXX_________Wert_______Wert
....
Kann mir bitte bitte jemand helfen ?
Danke, Sebastian

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 1000 x gefragt
30.10.2017 10:35:11
Fennek
Hallo,
für diese Problemstellung ist VBA bestens geeignet und eine ähnliche Frage kommt mehrfach pro Woche. Falls hier jemand Lust hat, zum x-ten Mal so einen Code zu schreiben, wird die sicher geholfen werden.
mfg
AW: 1000 x gefragt
30.10.2017 11:22:05
Sebastian
Hallo,
danke für die Antwort.
Suchfunktion nutzen kann ich auch, Module bereits kopiert habe ich.
Jedoch funktioniert es nicht so wie ich will.
Könnte es jemand abändern ?
Sub GetData()
Dim oMe As Object, sSuchbegriff(), sBereich As String, iZeile As Integer, sKennz As String
Dim iSbMax As Integer, iLK As Integer, i As Integer, sWbName As String, rFound As Range, vWert  _
As Variant
Dim oFS As Object, oDatei As Object, wsTabelle As Worksheet, bEintrag As Boolean
Set oMe = ThisWorkbook.Worksheets("Tabelle1") 'Zieltabelle (in der gerade geöffneten Datei)
iZeile = 2 'ab dieser Zeile Ergebnisse in die Zieltabelle eintragen
Const sDateiPfad As String = "C:\Test\" 'Pfad für zu durchsuchende Excel-Dateien; mit Backslash  _
am Ende
sKennz = "Produktionsbericht" 'Nur Tabellen, deren Name mit dem Kennzeichen beginnt,  _
verarbeiten
sSuchbegriff = Array("Produktionsleitung spät:", "Produktionsleitung früh:", "Sortierung:") ' _
Liste der Suchbegriffe
sBereich = "A1:A100"
iSbMax = UBound(sSuchbegriff) 'Höchster Index der Suchbegriffmatrix
iLK = Len(sKennz) 'Länge des Tabellennamen-Kennzeichens
Set oFS = CreateObject("Scripting.FileSystemObject")
For Each oDatei In oFS.GetFolder(sDateiPfad).Files
sWbName = oDatei.Name
Workbooks.Open (oDatei.Path)
For Each wsTabelle In Workbooks(sWbName).Worksheets()
If StrComp(Left(wsTabelle.Name, iLK), sKennz, vbTextCompare) = 0 Then
bEintrag = False
For i = 0 To iSbMax
Set rFound = wsTabelle.Range(sBereich).Find(sSuchbegriff(i), LookIn:=xlValues)
If Not rFound Is Nothing Then
vWert = wsTabelle.Cells(rFound.Row, rFound.Column + 1).Value
oMe.Cells(iZeile, i + 1).Value = vWert
bEintrag = True
End If
Next
If bEintrag Then iZeile = iZeile + 1 'mindestens ein Eintrag erfolgt, daher neue  _
Zeile
End If
Next
Workbooks(sWbName).Saved = True
Workbooks(sWbName).Close
Next
End Sub
Suche nur im Reiter 2 (Eingabe Zeiten) in jeder Datei im Ordner und Formatierung / Anordnung in der Zieldatei klappt nicht so, wie ich es in der Anfrage formuliert hatte.
Könnte es mir jemand abändern, bitte ?
Gruß
Anzeige
AW: Bsp-DAtei
30.10.2017 14:07:14
Fennek
Hallo,
falls du diesen Code selbst geschrieben hast, solltest du fit genug sein für das abschließende Debugging.
M.E. passt der Code aber nicht zu der beschriebenen Aufgabe, deshalb lade bitte eine Bsp-Datei mit ca 10 Datensätzen hoch.
mfg
AW: Bsp-DAtei
30.10.2017 15:10:09
Sebastian
Hi Fennek,
nein hab ich natürlich nicht :-/
Wie gesagt Makros sind nicht so mein Ding. Hangel mich momentan von einem Code snippet zum andern. Und
versuche es zu verstehen.
Hier die Bsp-Dateien.
Nehme dich in mein Gebet auf, wenn es funktioniert :-D
Quelldatei Bsp 1: https://www.herber.de/bbs/user/117306.xls
Quelldatei Bsp 2: https://www.herber.de/bbs/user/117307.xls
Zieldatei: https://www.herber.de/bbs/user/117305.xls
Dankeschön,
Gruß,
Sebastian
Anzeige
AW: Makro für Exceltabellenauslesung
30.10.2017 14:11:27
mmat
Hallo,
probier das mal, das sollte besser zur Aufgabe passen. Ich kanns leider nicht richtig testen ...
Function GetColumn(ws As Worksheet, a As String) As Long
Dim s As String, c As Long
c = 2: s = ws.Cells(1, c)
While s  ""
If s = a Then GetColumn = c: Exit Function
c = c + 1: s = ws.Cells(1, c)
Wend
GetColumn = c
End Function
Sub GetData()
Const Quellpfad As String = "C:\Test\" 'Pfad zum durchsuchen mit Backslash hinten
Const Dateimaske As String = "Produktionsbericht vom *.xlsx"
Dim Datei As String, Quellsheet As Worksheet, qr As Long
Dim Ausgabe As Worksheet, r As Long, c As Long
Dim s As String
Workbooks.Add
Set Ausgabe = ActiveWorkbook.Worksheets("Tabelle1")
r = 2 'ab dieser Zeile Ergebnisse in die Zieltabelle eintragen
Datei = Dir(Quellpfad + Dateimaske, vbNormal)
While Datei  ""
Workbooks.Open Quellpfad + Dateimaske
Set Quellsheet = ActiveWorkbook.Worksheets("Tabelle2")
qr = 1: s = Cells(qr, 1)
While (s  "")
If Left(s, 9) = "Abteilung" Then
Ausgabe.Cells(r, 1) = Datei
c = GetColumn(Ausgabe, s)
Ausgabe.Cells(r, c) = Quellsheet.Cells(qr, 2)
r = r + 1
End If
qr = qr + 1: s = Cells(qr, 1)
Wend
ActiveWorkbook.Close False
Datei = Dir()
Wend
End Sub

Anzeige
AW: omG, aber sollte kein Problem sein
30.10.2017 15:21:24
Fennek
Hallo,
nach dem ersten Blick: wer Daten so strukturiert, sollte den PC-Führerschein verlieren!
Sollte aber kein Problem sein, die Daten zusammen zu fassen.
Nur zur Besstätigung: Der Dateiname entspricht dem "Produktionsbericht xx.yy.zz"?
mfg
AW: omG, aber sollte kein Problem sein
30.10.2017 15:34:56
Sebastian
Hi,
das Format der Datei ist:
"Produktionsbericht vom xx.yy.zzzz"
Danke Fennek
AW: omG, aber sollte kein Problem sein
30.10.2017 15:36:30
Sebastian
Hi,
das Format der Datei ist:
"Produktionsbericht vom xx.yy.zzzz"
Danke Fennek
AW: Makro für Exceltabellenauslesung/Zusammenfassung
30.10.2017 16:06:55
Fennek
Hallo,
für die gezeigten Bsp-Dateien hilft dieser Code. Der Makro gehört in die Zieldatei (muss als *.xlsm gespeichert werden) und sollte im selben Verzeichnis wie die Quell-Dateien gespeichert sein.
Da das Forum die Dateinamen umändert, habe ich die Namen "Sebastian Bsp*.xlsx" vergeben. Das muss angepasst werden.

Sub iFen()
Dim WSZ As Worksheet: Set WSZ = ActiveSheet
Dim WBQ As Workbook 'Quelle
iPath = ThisWorkbook.Path & "\"
iFile = Dir(iPath & "Sebastian Bsp*.xlsx") '>>>>
lrZ = WSZ.Cells(Rows.Count, "A").End(xlUp).Row '1. freie Zeile im Ziel-Blatt
Do While Len(iFile)
lrZ = lrZ + 1
Set WBQ = Workbooks.Open(iPath & iFile)
With WBQ.Sheets("Eingabe Zeiten")
lr = .Cells(Rows.Count, "B").End(xlUp).Row
With .Range("B14:B" & lr)
.Value = .Value
.SpecialCells(2).Copy
End With
WSZ.Cells(lrZ, 1) = iFile
WSZ.Cells(lrZ, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=True
End With
WBQ.Close 0
iFile = Dir
Loop
End Sub
mfg
(es gibt (noch) keine Fehlerprüfung)
Anzeige
AW: kurzer Code
31.10.2017 10:46:28
Fennek
Hallo,
im Versuch möglichst kurze Codes zu schreiben, kam ich auf folgende Idee:

Sub iFen()
Dim WSZ As Worksheet: Set WSZ = ActiveSheet
Dim WBQ As Workbook 'Quelle
iPath = ThisWorkbook.Path & "\"
iFile = Dir(iPath & "Produktionsbericht*.xls") '>>>>
lrZ = WSZ.Cells(Rows.Count, "A").End(xlUp).Row '1. freie Zeile im Ziel-Blatt
Do While Len(iFile)
lrZ = lrZ + 1
WSZ.Cells(lrZ, 1) = iFile
Set WBQ = Workbooks.Open(iPath & iFile)
WBQ.Sheets("Eingabe Zeiten").Range(cells(14,2),cells(rows.count, "B").end(xlup).row).value. _
specialcells(2).copy
WSZ.Cells(lrZ, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=True
WBQ.Close 0
iFile = Dir
Loop
End Sub
Da aber heute der PC "down" ist, habe ich den Code nicht getestet.
mfg
Anzeige
AW: kurzer Code
31.10.2017 13:27:21
Sebastian
Hey Fennek,
vielen vielen Dank schon mal !!!!
Ich probiere morgen den Code aus.
Heute ist Pause, bekomme sonst Ärger mit meiner Frau :D
LG Sebastian
AW: kurzer Code
31.10.2017 13:50:36
Sebastian
kurze Frage dennoch:
Du hast geschrieben, dass die xlsm im selben Verzeichnis wie die Quell-Dateien sein soll.
Könnte ich sie nicht im Hauptverzeichnis speichern und dann im Code definieren das er in allen Unterordnern suchen soll ?
Gruß,
Sebastian
AW: geht alles
31.10.2017 13:57:47
Fennek
Hallo,
natürlich geht das, sofern man richtig referenziert.
Für mich war es am einfachsten, alle Dateien in einen ORdner zu packen.
Bei "allen Unterordenern" ist es wichtig zu wissen, ob es EINE Unterebene gibt, oder mehrere.
Bei EINER Unterebene kann man gut mit "FSO.Subfolder" arbeiten, bei mehreren mit "Dir /s".
mfg
Anzeige
Code geht leider nicht nicht, was fehlt ?!
01.11.2017 08:57:41
Sebastian
Hi Fennek,
habe den Code ausprobiert,funktionierte erst gar nicht.
Habe dann WBQ.Sheets in Tabelle2abgeändert. (Tabelle2=Name "Eingabe Zeiten".
Dann ging es schon mal weiter, er öffnet den ersten Produktionsbericht und dann kommt
eine Fehlermeldung "Index ausserhalb des gültigen Bereiches" und das Script endet in Zeile 31 im korrekten Tabellenblatt.
Ausgegeben hat er auch nichts.
Die Datei liegt soweit im Verzeichnis mit den ganzen Produktionsberichten.
Hier dein Code den ich verwendet habe:
Sub iFen()
Dim WSZ As Worksheet: Set WSZ = ActiveSheet
Dim WBQ As Workbook 'Quelle
iPath = ThisWorkbook.Path & "\"
iFile = Dir(iPath & "Produktionsbericht*.xls") '>>>>
lrZ = WSZ.Cells(Rows.Count, "A").End(xlUp).Row '1. freie Zeile im Ziel-Blatt
Do While Len(iFile)
lrZ = lrZ + 1
Set WBQ = Workbooks.Open(iPath & iFile)
With WBQ.Sheets("Tabelle2")
lr = .Cells(Rows.Count, "B").End(xlUp).Row
With .Range("B14:B" & lr)
.Value = .Value
.SpecialCells(2).Copy
End With
WSZ.Cells(lrZ, 1) = iFile
WSZ.Cells(lrZ, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=True
End With
WBQ.Close 0
iFile = Dir
Loop
End Sub

Anzeige
AW: WBQ.Sheets
01.11.2017 09:18:44
Fennek
Hallo,
in meiner Datei steht:
With WBQ.Sheets("Eingabe Zeiten")
(in der Beispieldatei sollte auch With "WBQ.Tabelle2" gehen, ist aber zu unsicher)
mdf
AW: WBQ.Sheets
01.11.2017 10:02:48
Sebastian
Hi Fennek,
mit WBQ.Tabelle2 bekomme ich einen Laufzeitfehler 438 "Objekt unterstützt die Eigenschaft oder Methode nicht"
AW: WBQ.Sheets
01.11.2017 11:44:06
Sebastian
Hab den Code jetzt noch mal original ausgeführt.
Führe ich das Makro aus dem Excel Tabellenblatt heraus (Entwicklertools, Makros, Makro ausführen) öffnet er zwar den ersten Produktionsbericht, aber dann kommt sofort Fehlermeldung, "400"
Für ich das Makro aus dem VB Editor heraus aus, kommt nur ein "Anwendungs oder Objektdefinierter Fehler".
Irgendwas stimmt nicht :-/
Kannst du bitte noch mal schauen ?
Gruß,
Sebastian
Anzeige
AW: final version
01.11.2017 11:59:21
Fennek
Hallo,
für die Bsp-Dateien habe ich es noch einmal mit Erfolg getestet. Ich kann nicht nachvollziehen, wo "Tabelle2" herkommt.
Die Anpassung des Pfades für die Quelldateien musst du leisten!

Sub iFen()
Dim WSZ As Worksheet: Set WSZ = ActiveSheet
Dim WBQ As Workbook 'Quelle
iPath = ThisWorkbook.Path & "\"
'iPath = "c:\temp\" '>>>>
lrZ = WSZ.Cells(Rows.Count, "A").End(xlUp).Row '1. freie Zeile im Ziel-Blatt
Do While Len(iFile)
lrZ = lrZ + 1
Set WBQ = Workbooks.Open(iPath & iFile)
With WBQ.Sheets("Eingabe Zeiten")
lr = .Cells(Rows.Count, "B").End(xlUp).Row
With .Range("B14:B" & lr)
.Value = .Value
.SpecialCells(2).Copy
End With
WSZ.Cells(lrZ, 1) = iFile
WSZ.Cells(lrZ, 2).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=True
End With
WBQ.Close 0
iFile = Dir
Loop
End Sub
mfg
Anzeige
AW: final version
01.11.2017 12:23:19
Sebastian
Hi Fennek,
mit der Bsp Datei, die ich hochgeladen hatte funktioniert es nun auch. Komisch !
Allerdings nicht mit den Original Dateien, obwohl diese gleich aufgebaut sind.
Da kommen die Fehler.
Hier mal eine alte "Original-Datei", weißt du wo der Fehler sein könnte ?
https://www.herber.de/bbs/user/117348.xls
Ich erkenn das Problem nicht, Zellen, Spalten und Arbeitsblatt gleich definiert.
AW: alles ok
01.11.2017 12:47:25
Fennek
Hallo,
auf meinem Rechner läuft auch die neue, Originaldatei problemlos durch.
Vorschlag:
- kopiere 1-3 Dateien in einen neuen Ordner
- alt-F11 öffnet den VBA-Editor
- führe den Code im Einzelschritt-Modus (F8-Taste) aus
Es ist möglich jederzeit in eine der offenen Dateien zu wechseln und den Status zu prüfen.
mfg
(falls ein Fehler auftritt, SEHR genaue Beschreibung, z.B. in welcher VBA-Zeile der Fehler auftritt, ob eine Datei geöffnet wurde)
AW: xl-Version? (2016)
01.11.2017 12:57:47
Fennek
ich nutze xl2016, du (vermutlich) 2003.
Da VBA "uralt" ist und keine "besonderen" Code genutzt wurden, sollte mein Makro auch unter 2003 laufen.
Aber prüfe einmal, ob das verschachtelte "With" läuft.
AW: alles ok
01.11.2017 13:06:06
Sebastian
Ich denke, ich hab es rausgefunden,
Die alten original Dateien (.xls 97-2003) werden von Excel 2013 im Kompatibilitätsmodus geöffnet.
Dann funktioniert das Makro scheinbar nicht. (Laufzeitfehler)
Speichere ich jetzt die alten Dateien neu ab und er konvertiert die in das neue .xlsx Format dann läuft das Makro einwandfrei durch.
Was kann ich da machen ?
Kann man es so programmieren, dass er beim öffnen der Dateien diese quasi vorab konvertiert und bei der Stapelverarbeitung aber nicht abspeichert ?
Oder gibts einen anderen weg.
gruß,
Sebastian
AW: Rekorder
01.11.2017 13:12:36
Fennek
Hi,
meine xl-Version schafft es auch im Kompatibilitäts-Modus.
Mit einen neuen Makro kann man alle xls öffen und als xlsx speichern. Versuche es mit dem Makro-Rekorder.
mfg

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige