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

Syntax um mehrere Excel-Dateien auszuwerten

Syntax um mehrere Excel-Dateien auszuwerten
15.06.2016 12:40:27
Matthias
Aus irgendeinem mir unbekannten Grunde wurde der von mir eröffnete Thread geschlossen bzw. archiviert. Daher stelle ich meine nachfolgende Frage hier erneut, in einem neuen Thread:
Geehrte Forum-Gemeinde,
Ich wende mich bezüglich einer etwas komplizierten Anfrage an Euch. Ausserdem bin ich ein VBA-Einsteiger, möchte jedoch gerne dazulernen weil mich die (a priori noch theoretischen) Möglichkeiten faszinieren.
In einem Hauptordner existieren ca. 20 Unterordner, die allesamt an die 20-30 Excel-Dateien enthalten.
Mittels VBA sollen die diversen Excel-Dateien, die alle samt identisch aufbereitet sind (also die gleiche Struktur haben), ausgewertet werden und die Auswertungen in ein zentrales Excel-File kopiert werden.
Verschiedene Abteilungen bzw. Mitarbeiter führten Listen mit verkauften Artikeln, bereits bezahlten Artikel und wieder stornierten Artikeln. Dazu wurde eine Artikel-Nr. und eine Artikel-Bezeichnung erfasst. Diese versch. Dateien sollen nun quasi für Auswertungen, Vergleiche etc. zusammengeführt bzw. ausgewertet werden. Ausserdem will man zukünftig weg von dieser Methodik bzw. eine etwas einfachere/standardisiertere Methode wählen.
Die Dateibeschriftungen der Excel-Files sehen so aus (als Beispiel):
12_SalesReg_32_LAG.xlsx
Die Inhalte der Excel-Dateien weisen folgende Struktur auf:
In Spalte A: (+/-); In Spalte B: Zusammengesetzte Nr. oder -----; Spalce C: Artikelname & Code oder ------
Alle Produkte bezahlt
------ ------
+ 4547.7755 Artikel ABC
+ 4354.9677 Artikel XYZ
+ 3632.1254 Artikel MNO
+ 4100.0201 Artikel PQR
- 9698.3300 Artikel EFG
- 7810.2500 Artikel TUV
Alle Produkte bezahlt
------ ------
+ 4547.7755 Artikel ABC
+ 4354.9677 Artikel XYZ
- 3632.1254 Artikel MNO
- 4100.0201 Artikel PQR
- 9698.3300 Artikel EFG
- 7810.2500 Artikel TUV
+ ------ ------
+ 2705.6301 Artikel KLM
+ 5454.0004 Artikel WER
- 3201.1707 Artikel HIJ
- 6022.7405 Artikel BMN
- 9698.3300 Artikel EFG
- 7810.2500 Artikel TUV
Alle Produkte bezahlt
------ ------
+ 4547.7755 Artikel ABC
+ 4354.9677 Artikel XYZ
- 3632.1254 Artikel MNO
- 6022.7405 Artikel BMN
- 9698.3300 Artikel EFG
Alle Produkte bezahlt
Was ausgewertet werden soll:
1) Aus Dateiname; erste Zahl (zwei Stellen): 12_SalesReg_32_LAG.xls = 12
--> Ins zentrale Excel-File in die Spalte mit Bezeichnung "AbtNr"
--> Dies wollte ich über den FileDialog mit folgendem Eintrag lösen:
Debug.Print Right("ABCD", 2)
CD
2) Aus Dateiname; zweite Zahl (zwei Stellen): 12_SalesReg_32_LAG.xls = 32
--> Ins zentrale Excel-File in die Spalte mit Bezeichnung "PeriodNr"
--> Auch dies wollte ich über den FileDialog mit dem o.g. Eintrag lösen.
3) Dichotomisierte Ausgabe, beim Eintrag "Alle Produkte bezahlt": wenn "Alle Produkte bezahlt" steht = 1; Sonst = 0)
--> Ins zentrale Excel-File in die Spalte mit Bezeichnung "AllSold"
4) Auswerten ob in Spalte A (+/-) ein + oder - steht und übertrag ins zentrale Excel-File in Spalte mit Bezeichnung "+/-"
5) Erste vier Ziffern (vor dem Punkt) der Artikel-Nr. (z.b 6022.7405: "6022" davon auswerten bzw. ins zentrale Excel-File kopieren)
6) Letzten vier Ziffern (nach dem Punkt) der Artikel-Nr. (z.b 6022.7405: "7405" davon auswerten bzw. ins zentrale Excel-File kopieren)
7) Kopieren der Artikelbezeichnung ins zentrale Excel-File; z.B. Artikel ABC kopieren
Idealerweise könnte man eine VBA-Syntax auf mehrere versch. Dateien (die allesamt aber ident. strukturiert sind; selbe Spaltenpositionen, selbe Formate) anwenden und VBA wertet die gewünschten Einträge ins zentrale Excel-File aus. Ich stelle mir vor, dass ich via VBA angebe, dass er alle xlsx im besagten Haupt- bzw. Unterordner durchgeht und dabei die Syntax anwendet. Dabei würde ich pro Zeile jede einzelne Spalte durchgehen:
Dim Zeile as Integer
Do
...
Zeile = Zeile + 1
loop until ...
Mir ist aber noch nicht ganz klar, welche Befehle für die oben aufgeführten 7 Punkte überhaupt nötig wären, damit die Auswertungen auch korrekt vorgenommen und das zentrale Excel-Sheet kopiert werden.
Das zentrale Excel-File, verfügt über folgende Spaltenbeschriftungen:
AbtNr PeriodNr ArtKrzel RegNr AllSold -/+ ArtListe ArtNr ArtTitle
Ich hatte bereits versucht, dies über "SelectCase" bzw. über die "BedingteKopieZeilen()" zu lösen. Dies scheint wohl aber nicht zu funktionieren bzw. ist nicht der korrekte Weg.
Z.B.
Public Sub Zeilen2()
Dim i As Integer
Dim cell As Range
i = 1
For Each cell In Eingabe.Range("C71:C877")
If Not cell Is Nothing Then
If cell.Value > "0" Then
cell.EntireRow.Copy 'Destination:=Tabelle2.Rows(i)
Tabelle1.Cells(i, 1).PasteSpecial , Paste:=xlPasteValues
i = i + 1
End If
End If
Next cell
End Sub
Oder Ansätzen wie
If .Cells(Zeile, 3).Value = "+" Then
.Rows(Zeile).Copy Destination:=Tabelle2.Rows(n)
Leider bisher ziemlich erfolglos - Evtl. setze ich als kompletter Neuling auch völlig am falschen Ort an.
Hätte jemand von Euch nützliche Tipps bzw. geeignete Formeln um dieses Problem zu lösen?
Vielen Dank im Voraus.
Freundliche Grüße
Matthias G.
----------------------
Hallo,
nur zum ersten Teil, um die Zahlen aus dem Dateinamen auszulesen:
Sub Matthias()
Tx = Cells(12, "A")
Ta = Split(Tx, "_")
Debug.Print "AbtNr = " & Ta(0), "PeriodNr = " & Ta(2)
End Sub Im Text ober ist die Rede von "20 Unterordner mit jeweils 20-30 Dateien": die erste Aufgabe wäre eine Abfrage für die Dateinamen. Wie heißt der "Basis-Ordner", gibt es in dieser Struktur auch andere xlsx-Dateien?
mfg
----------------------
Hallo,
Herzlichen Dank für diesen ersten wertvollen Input!
Der Basis-Ordner heisst:
Datenaufbereitung
(Kann evtl. noch ändern bzw. könnte ich dann immernoch in der Syntax entspr. anpassen)
In diesem Ordner sind dann Unterordner drin, wie z.B.
01_Abteilung_1
02_Abteilung_2
etc.
In diesen Unterordnern dann jeweils xlsx-Dateien, wie z.B.:
01_SalesReg_21_LAG.xlxs
02_SalesReg_22_LAG.xlsx
03_SalesReg_23_LAG.xlsx
04_SalesReg_17_LAG.xlsx
..
.
51_SalesReg_32_LAG.xls
Alle Dateien in den Unterordnern müssten anhand der Syntax ausgewertet und die entsprechenden Werte in die zentrale Excel-Datei kopiert werden. Es sind keine anderen Dateien vorhanden, welche nicht in der Gesamtauswertung erscheinen sollen.
----------------------
Hallo,
folgender Code liest die DateiNamen und daraus abgeleitet die AbtNr und PeriodNr aus.
Da ich die Datei nicht kenne werden die Werte in die Spalten A-C geschrieben.
Der Pfad muss komplett angegeben werden, also z.B. C:\users\Matthias\Datenaufbereitung\
Sub Fen_dir()
'Pfad anpassen sn = Split(CreateObject("wscript.shell").exec("cmd /c dir ""c:\...\Datenaufbereitung\*.xls*"" _
/b/s").stdout.readall, vbCrLf)
For i = 0 To UBound(sn)
Cells(i + 1, "A") = sn(i)
Cells(i + 1, "B") = Split(sn(i), "_")(0)
Cells(i + 1, "C") = Split(sn(i), "_")(2)
Next i
End Sub mfg
(Deine anderen Fragen sollen andere beantworten)
----------------------
Hallo Matthias,
hier ein Versuch, der zeigt, wie es gehen könnte. Für die Demo habe ich die Daten in eine TXT-Datei geladen und dann importier. Dies müsste durch ein workbooks.open ersetz werden. Auch die Spalten in der Master-Datei müssen noch modifiziert werden.
https://www.herber.de/bbs/user/106105.xls
mfg
------------------------

26
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Syntax um mehrere Excel-Dateien auszuwerten
15.06.2016 12:41:12
Matthias
Hier die aktuelle Frage, welche nicht publiziert bzw. aufgrund des archivierten Threads nicht mehr erschienen ist:
Hallo
Besten Dank für deinen tollen Einsatz!
Vorab, meine Anwort wurde offensichtlich nicht gepostet. Deshalb hier nochmal:
Wenn ich dich richtig verstanden habe, muss ich deine Syntax noch anpassen:
workbooks.open einfügen, damit alle Excel-Dateien in den jeweiligen Unterordnern abgegriffen werden?
Wo füge ich den Pfad des Masterfiles ein, damit alle ausgewiesenen Daten an den richtigen Zielort gelangen? Bezüglich den Spalten im Masterfile: Reicht es, die Bezeichnungen korrekt in der Syntax einzugeben und im Masterfile einzutragen, damit dies funktioniert?
sPath entspricht ja dem Ursprungsordner, der abgegriffen werden soll?
sPath = "c:\tmp\datenaufbereitung\"
sn = Split(CreateObject("wscript.shell").exec("cmd /c dir ""c:\tmp\datenaufbereitung\*.txt"" /b/s").stdout.readall
Im Bereich dir geb ich an, dass alle *.xls genommen werden sollen, ja?
Ich müsste dann wohl auch die Angaben mit .Cells anpassen?
.Cells(m, "A") = AbtNr
.Cells(m, "B") = PeriodNr
.Cells(m, "C") = Allsold
Spaltenzahl zur entsprechenden Bezeichnung, oder? Kann ich dies hier unterhalb weiterführen?
Besten Dank!
Viele Grüsse
Matthias

Anzeige
AW: Syntax um mehrere Excel-Dateien auszuwerten
15.06.2016 14:07:16
Fennek
Hallo Matthias,
ich kann mich noch (dunkel) an deine Anfrage erinnert. Wenn ich ein paar Minuten Zeit finde, werden ich es mir noch einmal ansehen.
mfg

AW: Syntax um mehrere Excel-Dateien auszuwerten
15.06.2016 14:52:09
Fennek
Hallo,
da ich das an einem anderen PC gemacht habe, kann ich zwar im Moment den Code sehen, aber nicht ausführen/testen.
Der Code ist für *.txt Dateien geschrieben, die du - vermutlich richtig - in *.xlsx gewechselt hast.
Eine weiter Änderung müsste sein:
Anstelle with sheets.add
sollte stehen
with workbooks.open(Pfad & d) 'd ist der Datei-Name im Array sn
Inwiewweit noch Zell-Addresse angepasst werden müssen, kann ich im Moment nicht überblicken.
mfg

Anzeige
AW: Syntax um mehrere Excel-Dateien auszuwerten
15.06.2016 20:53:31
Matthias
Hallo
Genau, ich hatte den xls-Suffix bereits eingetragen.
In deiner Syntax hatte ich folgende Änderungen vorgenommen, also auch das workbooks.open eingesetzt mit dem Pfad, den ich im sn eingetragen habe. Allerdings scheint die Pfadangabe wohl fehlerhaft zu sein:
Sub Matthias()
Application.DisplayAlerts = False
m = 1 'Zeile des Mastersheets
sPath = "C:\Users\MG\Desktop\Datenaufbereitung"
sn = Split(CreateObject("wscript.shell").exec("cmd /c dir ""C:\Users\MG\Desktop\Team_1 *.xls""  _
/b/s").stdout.readall, vbCrLf)
For Each d In sn
If Len(d) > 0 Then
Tx = Split(d, "\")
Ta = Split(Tx(UBound(Tx)), "_")
AbtNr = Ta(0)
PeriodNr = Ta(2)
Debug.Print "AbtNr = " & Ta(0), "PeriodNr = " & Ta(2)
With Workbooks.Open("C:\Users\MG\Desktop\Datenaufbereitung" & ""C:\Users\MG\Desktop\Team_1 * _
.xls"" )
If .Cells(1, 1) = "Alle Produkte bezahlt" Then Allsold = 1
lr = .Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lr
If InStr(1, .Cells(i, "A"), "Artikel") > 0 Then
Tx = Split(.Cells(i, "A"))
With Sheets("Master")
m = m + 1
.Cells(m, "A") = AbtNr
.Cells(m, "B") = PeriodNr
.Cells(m, "C") = Allsold
For j = 0 To UBound(Tx)
.Cells(m, "D").Offset(, j) = Tx(j)
Next j
End With
End If
Next i
.Delete
End With
End If
Next d
Application.DisplayAlerts = True
End Sub
-----------------------
Was mir auch noch nicht klar scheint: Das Masterfile ist dann jeweils das offene Excel-File, welches dann in der Tabelle "Master" die Auswertungen eingetragen bekommen soll - So ist es ja zumindest im Code definiert?
Klar, kein Problem. Lass' es mich dann bitte wissen, sobald du an einem Computer sitzt, der die Syntax ausführen kann. Über die Anpassungen der Zelladressen bzw. Angaben wäre ich dir auch sehr dankbar.
Nochmal besten Dank & freundliche Grüsse
Matthias

Anzeige
AW: Syntax um mehrere Excel-Dateien auszuwerten
15.06.2016 21:44:36
Fennek
Hallo,
das kann so nicht funktionieren:
With Workbooks.Open("C:\Users\MG\Desktop\Datenaufbereitung" & ""C:\Users\MG\Desktop\Team_1 * _
.xls"" )
versuche:
With Workbooks.Open("C:\Users\MG\Desktop\Datenaufbereitung" & d)
d ist der Filename aus dem array sn.
mfg
ps da ich in den letzten Wochen geschätz mehr als ein dutzend Mal Aufgaben "lade alle Dateien des Ordners" beantwortet habe, bin ich der Meinung, dass ich diese Theman genug geübt habe, und werde mich auf andere, für mich neuere Theman konzentrieren.

AW: Syntax um mehrere Excel-Dateien auszuwerten
16.06.2016 17:47:33
Matthias
Nach einer ersten Anpassung sieht das File wie folgt aus. Ich erhalte beim Durchführen allerdings die Fehlermeldung: Laufzeitfehler '9': Index liegt ausserhalb des gültigen Bereichs. Und zwar bei der Zeile
PeriodNr = Ta(2)
Schreibweisen bzw. Syntaxabschlüsse ("", ", ) etc.) hab' ich geprüft, sollten i.O. sein. Hast du eine Idee?
Sub Matthias()
Application.DisplayAlerts = False
m = 1 'Zeile des Mastersheets
sPath = "C:\Users\DD\Desktop\Datenaufbereitung\"
sFile = "*.xls"
' sn = Split(CreateObject("wscript.shell").exec("cmd /c dir ""C:\Users\DD\Desktop\ _
Datenaufbereitung\Solothurn_1\*.xls"" / _
b/s").stdout.readall, vbCrLf)
sn = Split(CreateObject("wscript.shell").exec("cmd /c dir " & sPath & sFile & "/b/s").stdout.  _
_
readall, vbCrLf)
For Each d In sn
Debug.Print d
If Len(d) > 0 Then
Tx = Split(d, "\")
Ta = Split(Tx(UBound(Tx)), "_")
AbtNr = Ta(0)
PeriodNr = Ta(2)
Debug.Print "AbtNr = " & Ta(0), "PeriodNr = " & Ta(2)
'    With Sheets.Add(, , , d)
With Workbooks.Open("C:\Users\DD\Desktop\Datenaufbereitung" & d)
With .Sheets(1)
If .Cells(1, 1) = "Alle Produkte bezahlt" Then Allsold = 1
lr = .Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lr
If InStr(1, .Cells(i, "A"), "Artikel") > 0 Then
Tx = Split(.Cells(i, "A"))
With Sheets("Master")
m = m + 1
.Cells(m, "A") = AbtNr
.Cells(m, "B") = PeriodNr
.Cells(m, "C") = Allsold
For j = 0 To UBound(Tx)
.Cells(m, "D").Offset(, j) = Tx(j)
Next j
End With
End If
Next i
End With
'.Delete
.Close 0
End With
End If
Next d
Application.DisplayAlerts = True
End Sub

Besten Dank.
Matthias

Anzeige
bitte überprüfen
18.06.2016 14:12:54
Michael
Hi,
ich sehe keinen Sinn in den DisplayAlerts=false, erst Recht nicht während der Entwicklung.
Außerdem sollte jedes Modul IMMER
Option explicit
in der ersten Zeile stehen haben, auf daß die Variablen alle sauber deklariert werden.
Aber abgesehen davon: ich würde mal sn nach dem Einlesen ausgeben lassen, also:
for i=0 to ubound(sn) : debug.print sn(i) : next
da wirst Du nämlich vermutlich sehen, daß relativ wenig ausgegeben wird, wenn in Deinem Ordner _ Dateien mit der Endung .xlsx stehen, Du aber nach *.xls suchst:

sFile = "*.xls"

Da fehlt das x (bzw. ein *).
Schöne Grüße,
Michael

Anzeige
AW: bitte überprüfen
18.06.2016 23:43:26
Matthias
Hallo Michael
Besten Dank für deine Rückmeldung.
1) Das mit der Dateiendung stimmt nun, die Files sind allesamt .xls
2) Ich habe den Code nun wie folgt angepast:
Option Explicit
Sub Matthias()
Application.DisplayAlerts = False
m = 1 'Zeile des Mastersheets
sPath = "c:\users\dd\desktop\datenaufbereitung\"
sFile = "*.xls"
' sn = Split(CreateObject("wscript.shell").exec("cmd /c dir ""c:\users\dd\desktop\ _
datenaufbereitung\*.xls"" / _
b/s").stdout.readall, vbCrLf)
sn = Split(CreateObject("wscript.shell").exec("cmd /c dir " & sPath & sFile & "/b/s").stdout.  _
_
readall, vbCrLf)
For i = 0 To UBound(sn): Debug.Print sn(i): Next
For Each d In sn
Debug.Print d
If Len(d) > 0 Then
Tx = Split(d, "\")
Ta = Split(Tx(UBound(Tx)), "_")
AbtNr = Ta(0)
PeriodNr = Ta(2)
Debug.Print "AbtNr = " & Ta(0), "PeriodNr = " & Ta(2)
'    With Sheets.Add(, , , d)
With Workbooks.Open(d)
With .Sheets(1)
If .Cells(1, 1) = "Alle Produkte bezahlt" Then Allsold = 1
lr = .Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lr
If InStr(1, .Cells(i, "A"), "Artikel") > 0 Then
Tx = Split(.Cells(i, "A"))
With Sheets("Master")
m = m + 1
.Cells(m, "A") = AbtNr
.Cells(m, "B") = PeriodNr
.Cells(m, "C") = Allsold
For j = 0 To UBound(Tx)
.Cells(m, "D").Offset(, j) = Tx(j)
Next j
End With
End If
Next i
End With
'.Delete
.Close 0
End With
End If
Next d
Application.DisplayAlerts = True
End Sub

3) Der Fehler erscheint nun nicht mehr. Aber ich habe nach wie vor das Problem, dass ich die gewünschten Auswertungen, die im Code angegeben sind, nicht in mein Masterfile bekomme. VBA arbeitet zwar die einzelnen Files im Zielordner ab (das sehe ich im Modul, die werden einzelnen geöffnet/abgerufen). Das Masterfile bleibt leer.
Muss ich hierbei das Masterfile noch speziell definieren? Oder weitere Angaben bez. Zielordner/Datei vornehmen?
Ganz banal: Ich habe den Code über das VBA-Modul des Masterfiles (dort wo die Auswertungen dann rein müssten) eingefügt. Als Code der Tabelle 1 ("Master") sozusagen. Dies wäre schon korrekt, oder?
Besten Dank.
Matthias

Anzeige
AW: bitte überprüfen
18.06.2016 23:46:58
Matthias
Nachtrag:
Wenn ich "Option Explicit" an den Anfang stelle, erhalte ich beim Ausführen:
"Fehler beim Komplilieren. Variable nicht definiert"
Markiert wird dann die Zeile "m = 1", Gelb markiert ist dann "Sub Matthias"

AW: bitte überprüfen
18.06.2016 23:50:32
Matthias
-

AW: bitte überprüfen
19.06.2016 15:40:36
Michael
Hi Matthias,
genau das ist der Punkt: in dem Code ist KEINE Variable sauber deklariert.
Was wurde denn bei dem debug.print ausgegeben? Eine Reihe Dateinamen oder nur ein "Datei nicht gefunden"?
Weil Du nicht darauf eingegangen bist, vermute ich, daß Du gar nicht weißt, was der Befehl bedeutet (obwohl er ja bereits vorher vorhanden war!): das "debug"-Fenster öffnet sich unter dem Code-Fenster, wenn Du Strg+g drückst, und dort sind dann alle mit debug.print ausgegebenen Sachen zu sehen...
Probiere mal das:
Option Explicit
Sub Matthias()
Dim m As Long, i As Long, lr As Long, j As Long
Dim sPath As String, sFile As String, d As Variant
Dim sn As Variant, Tx As Variant, Ta As Variant
Dim abtnr As Variant, periodnr As Variant, allsold As Long
Dim aus0(0, 2) As Variant, aus1() As Variant           ' *** neu ***
' das ist ein Array, das erst mit Werten gefüllt und
' dann komplett geschrieben wird
Dim aM As Worksheet                   ' *** neu ***
Set aM = Sheets("Master")
' Application.DisplayAlerts = False
m = 1 'Zeile des Mastersheets
sPath = "c:\users\dd\desktop\datenaufbereitung\"
sFile = "*.xls"
sn = Split(CreateObject("wscript.shell").exec("cmd /c dir " & _
sPath & sFile & "/b/s").stdout.readall, vbCrLf)
For i = 0 To UBound(sn): Debug.Print sn(i): Next
Stop
' stoppt die Abarbeitung des Skripts, mit F5 oder F8 geht's weiter
' An der Stelle kannst Du nachsehen, was im Debug-Fenster steht...
For Each d In sn
Debug.Print d
Stop
' hier auch ...
If Len(d) > 0 Then
Tx = Split(d, "\")
Ta = Split(Tx(UBound(Tx)), "_")
abtnr = Ta(0)
periodnr = Ta(2)
aus0(0, 0) = abtnr: aus0(0, 2) = periodnr
Debug.Print "AbtNr = " & Ta(0), "PeriodNr = " & Ta(2)
' und was kommt hier?
Stop
With Workbooks.Open(d)
With .Sheets(1)
' hier stimmt die Logik nicht:
' If .Cells(1, 1) = "Alle Produkte bezahlt" Then Allsold = 1
' Allsold bleibt auf 1, auch wenn in der nächsten Datei
' nicht alles bezahlt ist. Richtig wäre es so:
If .Cells(1, 1) = "Alle Produkte bezahlt" Then _
allsold = 1 Else allsold = 0
aus0(0, 1) = allsold
' ich bevorzuge die Range-Schreibweise, außerdem hat
' der . vor rows.count gefehlt
lr = .Range("A" & .Rows.Count).End(xlUp).Row
For i = 2 To lr
If InStr(1, .Cells(i, "A"), "Artikel") > 0 Then
Tx = Split(.Cells(i, "A"))
' da frage ich mich, wie die Datei wohl aussieht!
With Sheets("Master")
m = m + 1
ReDim aus1(0, UBound(Tx) + 3)
For j = 0 To 2: aus1(0, j) = aus0(0, j): Next
For j = 0 To UBound(Tx)
'                             .Cells(m, "D").Offset(, j) = Tx(j)
aus1(j + 3) = Tx(j)
Next j
.Range("A" & m).Resize(1, UBound(aus1, 2)) = aus1
End With
End If
Next i
End With
.Close 0
End With
End If
Next d
' Application.DisplayAlerts = True
End Sub
Wobei das reiner "Blindflug" ist: lade uns doch mal so eine einzulesende Datei mit ein paar Beispielwerten hoch.
Schöne Grüße,
Michael

Anzeige
<>Formel1? owT
19.06.2016 16:01:45
MB12
:-)

AW: <>Formel1? owT
19.06.2016 20:06:21
Michael
Hi Margarete,
sorry, ich stehe auf der Leitung & verstehe den Witz nicht.
Aber ich muß fort, schöne Grüße,
Michael

AW: bitte überprüfen
19.06.2016 22:44:29
Matthias
Hallo Michael
Besten Dank für deine hilfreiche Rückmeldung.
Anmerkung: Die vorangehenden Antworten haben vermutlich nichts mit meinem Thread zu tun.
Anbei die Ausgabe der Debug-Datei und im Anhang eine Beispieldatei.
Debug:
c:\users\dd\desktop\1_Abteilung_17_PRA.xls
c:\users\dd\desktop\1_Team_1_AKG.xls
c:\users\dd\desktop\1_Abteilung_17_PRA.xls
AbtNr = 1 PeriodNr = 17
c:\users\dd\desktop\1_Team_1_AKG.xls
AbtNr = 1 PeriodNr = 1
Es wurde also eine Reihe Dateinamen ausgegeben, keine Fehler. Aber nach wie vor besteht das Problem, dass ich die Auswertungen, die abgearbeitet werden, nirgends in das Masterfile reinkriege.
Freundliche Grüsse
Matthias

Anzeige
mit Datei isses schon mal VIEL besser
20.06.2016 08:24:00
Michael
Hi,
beim Debuggen habe ich grad gesehen, daß ich die Zeile
Tx = Split(.Cells(i, "A"))

einfach übernommen hatte: sie ist natürlich Quatsch, derweil dem Split der 2. Parameter fehlt, nämlich wonach er splitten soll.
Wenn ich mir Deine Daten aber so ansehe...
1. .Cells(i, "A") ist die Zelle in Spalte A in der i-ten Zeile: in A steht NIE "Artikel", womit das If bzw. Then in der Zeile vor dem Tx=split auch NIE ausgeführt wird.
Deshalb erscheint auch nichts in Deiner Master...
2. Wozu überhaupt HIER ein split? Wenn Du "Artikel thi" in "Artikel" und "thi" trennen willst, ok, aber wenn sowieso überall "Artikel" steht, nimmst Du besser Mid(.Range("C" & i),9), dann hast Du alles rechts vom Leerzeichen.
So, ich weiß nicht, was "dichotomisiert" heißt, und ich will's auch gar nicht wissen: wenn Du jetzt noch eine Beispieldatei von Deinem Master hochlädst, kriegen wir's hin.
Bis dahin nimm mal das, da "kommt mal was rein":
Sub Matthias_Michael()
Dim m As Long, i As Long, lr As Long, j As Long
Dim sPath As String, sFile As String, d As Variant
Dim sn As Variant, Tx As Variant, Ta As Variant
Dim abtnr As Variant, periodnr As Variant, allsold As Long
Dim aus0(0, 3) As Variant
' das ist ein Array, das erst mit Werten gefüllt und
' dann komplett geschrieben wird
Dim aM As Worksheet                   ' *** neu ***
Set aM = Sheets("Master")
' Application.DisplayAlerts = False
m = 1 'Zeile des Mastersheets
' sPath = "c:\users\dd\desktop\datenaufbereitung\"
sPath = "c:\A_Herber\Matthias\"
sFile = "*.xls"
sn = Split(CreateObject("wscript.shell").exec("cmd /c dir " & _
sPath & sFile & "/b/s").stdout.readall, vbCrLf)
' For i = 0 To UBound(sn): Debug.Print sn(i): Next
Stop
' stoppt die Abarbeitung des Skripts, mit F5 oder F8 geht's weiter
' An der Stelle kannst Du nachsehen, was im Debug-Fenster steht...
For Each d In sn
'   Debug.Print d
'   Stop
' hier auch ...
If Len(d) > 0 Then
Tx = Split(d, "\")
Ta = Split(Tx(UBound(Tx)), "_")
abtnr = Ta(0)
periodnr = Ta(2)
aus0(0, 0) = abtnr: aus0(0, 2) = periodnr
Debug.Print "AbtNr = " & Ta(0), "PeriodNr = " & Ta(2)
' und was kommt hier?
'     Stop
With Workbooks.Open(d)
With .Sheets(1)
If .Cells(1, 1) = "Alle Produkte bezahlt" Then _
aus0(0, 1) = 1 Else aus0(0, 1) = 0
lr = .Range("A" & .Rows.Count).End(xlUp).Row
' wieso erst ab 2? In der Datei ist keine Überschrift!
For i = 1 To lr
If InStr(1, .Range("C" & i), "Artikel") > 0 Then
'                  Stop
m = m + 1
aus0(0, 3) = Mid(.Range("C" & i), 9)
aM.Range("A" & m).Resize(1, UBound(aus0, 2) + 1) = aus0
End If
Next i
End With
.Close 0
End With
End If
Next d
' Application.DisplayAlerts = True
End Sub
Schöne Grüße,
Michael

Anzeige
AW: mit Datei isses schon mal VIEL besser
20.06.2016 11:08:20
Matthias
Hallo Michael
Toll, vielen Dank für deine Mühe!
Zu 1) Du hast Recht bez. Spalte A in der i-ten Zeile. Danke für den Hinweis - Ich glaube da wurde was verschoben.
Zu 2) Wenn ich die Artikel inkl. deren Zusatz mal später nicht ab Leerzeichen getrennt bzw. die Bezeichnung wie sie ist haben will (z.B. "Artikel thi" kann ich die Zeile aus0(0, 3) = Mid(.Range("C" & i), 9) einfach weglassen, oder?
3) Im Anhang dann ein Masterfile als Beispiel.
In diesem Beispiel sind nun die Artikel & Artikelbezeichnung zusammengefasst. Dies könnte mMn auch so beibehalten werden (alles in 1 Zelle).
Zeile B der gestrigen Beispieldatei beinhaltet ja die Zahlenwerte z.B. 17.03 etc.
Diese sollten dann im Masterfile gesplittet werden in 17 & 03 (17 = ArtListe; 03 = ArtNr).
Beste Grüsse
Matthias

AW: ok, bitte testen
20.06.2016 22:29:14
Matthias
Hallo Michael
Super, das von dir hochgeladene File sieht gut aus!
Ich habe den Pfad auf dem Sheet angepasst, also der, welcher dann unter "M_Pfad" abgefragt wird.
Die Dateien im Ordner werden auch abgearbeitet, das seh' ich ja im linken Bereich deines Sheets.
Aber im rechten Block werden keine Auswertungen hinein geschrieben.
Hier als Bsp. aus dem linken Block:
lfd. Nr. Datei Zeilen ges. Zl. m. Artikel
0 10_Team_10_Graf.xls 16 0
1 10_Team_22_Meier.xls 24 0
2 10_Abteilung_5_Peter.xls 59 0
3 10_Produktion_10_Theiler.xls 34 0
Hast du eine Idee, weshalb?
Beste Grüsse
Matthias

AW: ok, bitte testen
20.06.2016 22:45:27
Matthias
Nachtrag:
Ich habe gesehen, dass die Zeile
If InStr(1, w(j, 3), "Artikel")
...
explizit "Artikel" erwähnt wird bzw. das erste Auftreten eines Strings mit diesen Charakteristika prüft.
Nur um spätere Eventualitäten bzw. Änderungen auszuräumen: Es kann sein, dass Artikelbezeichnungen hinzukommen bzw. in Dateien drin sind, die nicht mit "Artikel" beginnen.
Könnte man dies "neutral" halten, in dem Sinne, dass der Befehl halt einfach die Bezeichnung in Spalte C rüberkopiert, mit Ausnahme natürlich, dass da "Alle Produkte bezahlt" steht, ohne dass "Artikel" o.ä. geprüft wird?
Besten Dank.
Matthias

AW: ok, bitte testen
21.06.2016 15:03:27
Michael
Hi Matthias,
statt dem InStr mit "Artikel" kannst Du, wie einige Zeilen vorher, das Konstrukt
If w(j, 3) = "Alle Produkte bezahlt"

verwenden: dann hast Du allerdings die "----" mit dabei:
Userbild
Insofern würde es sich anbieten, es so zu machen:
If w(j, 1)  ""
Schöne Grüße,
Michael

AW: ok, bitte testen
21.06.2016 15:47:07
Matthias
Hallo Michael
Genial, ich habe die Zeile nun entsprechend angepasst. Die ausgewerteten Angaben in der besagten Spalte stimmen nun überein.
Der einzige Fehler, den ich noch entdeckt habe ist die Spalte "Allsold": Da müsste ja bei "Alle Produkte bezahlt" eine 1 erscheinen bzw. eine 0 bei Nichterfüllen.
If w(1, 1) = "Alle Produkte bezahlt" Then _
allsold = 1 Else allsold = 0
Aktuell habe ich im ausgewerteten Bereich rechts alles nur "0", obwohl einige Dateien die Bezeichnung "Alle Produkte bezahlt" in Spalte C aufweisen.
Braucht es hier noch weitere Definitionen bzw. Anpassungen?
Nochmal besten Dank für deine Mühe und deine grandiose Hilfsbereitschaft!
Matthias

tja, geht auch noch...
22.06.2016 00:03:23
Michael
Hi Matthias,
vielen Dank, daß Du die "grandiose Hilfsbereitschaft" von mir (und anderen Helfern) zu schätzen weißt.
Anscheinend bezieht sich das "Alle bezahlt" immer auf einen Datenblock zwischen jeweils "---" oben und unten...
Ich habe mal das Makro so geändert, daß es in der geöffneten Datei Formeln in Spalte D schreibt (siehe Kommentare im Code), die je nach dem 0 oder 1 ergeben. Da die Datei sowieso readonly geöffnet und auch nicht gespeichert wird, ist das am einfachsten, außerdem kannst Du so selbst mit der Formel experimentieren und vielleicht noch andere Erweiterungen auf so einer Basis einbauen:
.Sheets(1).Range("D1:D" & lr).FormulaLocal = _
"=WENN(C1=""Alle Produkte bezahlt"";1;WENN(LINKS(C1;2)=""--"";0;D2))"
Stop  ' diese Zeile mit dem Stop bitte später wieder löschen...

Die "" werden als " in die Zellen geschrieben. So verwendet man " innerhalb eines Strings; z.B. kannst Du im "Direktbereich" (Strg+g in VBA) testen:
debug.Print "Dies ist ""ein"" Text."
Dies ist "ein" Text.

Datei: https://www.herber.de/bbs/user/106391.xlsm
Schöne Grüße,
Michael

AW: Syntax um mehrere Excel-Dateien auszuwerten
16.06.2016 09:15:42
Fennek
Hallo,
nach nochmaliger Ansicht des Code (und testen), waren doch noch ein paar kleine Hürden drin. Es war das erste Mal, dass ich die Formel in dieser Form eingesetzt (mit Unterverzeichnissen).
Dieser Code sollte vom File-Handling für xls-Datei funktionieren.

Sub Matthias()
Application.DisplayAlerts = False
m = 1 'Zeile des Mastersheets
sPath = "c:\tmp\datenaufbereitung\"
sFile = "*.xls"
' sn = Split(CreateObject("wscript.shell").exec("cmd /c dir ""c:\tmp\datenaufbereitung\*.txt"" / _
b/s").stdout.readall, vbCrLf)
sn = Split(CreateObject("wscript.shell").exec("cmd /c dir " & sPath & sFile & "/b/s").stdout. _
readall, vbCrLf)
For Each d In sn
Debug.Print d
If Len(d) > 0 Then
Tx = Split(d, "\")
Ta = Split(Tx(UBound(Tx)), "_")
AbtNr = Ta(0)
PeriodNr = Ta(2)
Debug.Print "AbtNr = " & Ta(0), "PeriodNr = " & Ta(2)
'    With Sheets.Add(, , , d)
With Workbooks.Open(d)
With .Sheets(1)
If .Cells(1, 1) = "Alle Produkte bezahlt" Then Allsold = 1
lr = .Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lr
If InStr(1, .Cells(i, "A"), "Artikel") > 0 Then
Tx = Split(.Cells(i, "A"))
With Sheets("Master")
m = m + 1
.Cells(m, "A") = AbtNr
.Cells(m, "B") = PeriodNr
.Cells(m, "C") = Allsold
For j = 0 To UBound(Tx)
.Cells(m, "D").Offset(, j) = Tx(j)
Next j
End With
End If
Next i
End With
'.Delete
.Close 0
End With
End If
Next d
Application.DisplayAlerts = True
End Sub
mfg

AW: Syntax um mehrere Excel-Dateien auszuwerten
16.06.2016 17:08:11
Matthias
Hallo
Grossartig! Nochmal besten Dank für deinen tollen Einsatz!
Kurze Nachfrage:
1)
Müsste ich noch in deinem angepassten Code die Zeile
With Workbooks.Open(d)
Mit der angesprochenen
With Workbooks.Open("C:\Users\MG\Desktop\Datenaufbereitung" & d)
ersetzen?
2)
Konntest du noch ausfindig machen, ob ich die einzelnen Zellangaben entsprechend anpassen muss?
.Cells(m, "A") = AbtNr
.Cells(m, "B") = PeriodNr
.Cells(m, "C") = Allsold
Also die Spaltenzahl zur entsprechenden Bezeichnung, oder? Kann ich dies hier unterhalb von C weiterführen?
3)
Das Masterfile ist dann jeweils das offene Excel-File, welches dann in der Tabelle "Master" die Auswertungen eingetragen bekommen soll - So ist es ja zumindest im Code definiert? D.h. den Code kann ich im entspr. Master-Excel ausführen, oder?
Freundliche Grüsse
Matthias

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige