Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
952to956
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
952to956
952to956
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Zusammenführung Daten aus Ordnerstrukturen

Zusammenführung Daten aus Ordnerstrukturen
18.02.2008 10:29:27
Bernd
Hallo zusammen,
ich würde gerne für jeden zurückliegenden Arbeitstag in 2008 bestimmte Werte aus historisch gespeicherten Tagesdateien in einer zentralen Übersichtsdatei zusammenführen.
Der Speicherpfad der Tagesdateien lautet c:\2008_01\02\ bis c:\2008_02\15\ . Der Dateiname lautet immer Tageswerte.xls, Registerblatt "Einzelwerte".
Die Werte, die ich gerne aus diesen Zulieferdateien beziehen möchte, stehen leider nicht immer an der selben Stelle, d.h. kein fester Zellbezug. In den Zulieferdateien sollte in der Spalte A jeweils nach bestimmten Werten gesucht werden und falls vorhanden, dann aus der selben Zeile den Wert aus Spalte B anziehen. Falls der Wert nicht vorhanden ist, sollte "0" ausgewiesen werden.
Ich habe noch eine Mustervorlage mit Anmerkungen erstellt und angehängt. Daraus geht die Form der Zusammenführungsdatei hervor und ich hoffe, damit sind alle "Unklarheiten" beseitigt!
https://www.herber.de/bbs/user/49982.xls
Viele Grüße
Bernd
PS: Auch Teillösungen, insbesondere wie man die Werte in den Zulieferdateien per VBA sucht (also im Prinzip "Sverweis") sind willkommen. Ich denke, dass eine Lösung mit Excel-Hausmitteln aufgrund der Pfadproblematik (gleiche Dateien) wohl ausscheidet, oder?

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zusammenführung Daten aus Ordnerstrukturen
18.02.2008 12:57:49
fcs
Hallo Bernd,
hier mein Lösungsvorschlag. Die Tagesdateien werden entsprechend dem eingegegebenen Datumsbereich nach einander geöffnet, ausgelesen und wieder geschlossen.
Für korrekte Funktion müssen die Produktnamen in den Tageswert-Dateien genau mit den Namen in der Zeile 1 der Übersicht übereinstimmen.
Gruß
Franz

Sub DatenEinlesen()
Dim wbZiel As Workbook, wksZiel As Worksheet, ZeileZiel As Long, SpalteZiel As Integer
Dim wbQuelle As Workbook, wksQuelle As Worksheet
Dim strQuelle As String, strProdukt As Variant, Zelle As Range, strPfadQuellen As String
Dim DatumStart As Date, DatumEnde As Date
Eingabe1:
Eingabe = InputBox("Bitte Startdatum eingeben", "Tagesdaten-Import", _
"1.1." & Year(Date))
If Eingabe = "" Then Exit Sub
If IsDate(Eingabe) Then
DatumStart = CDate(Eingabe)
Else
MsgBox "Eingabe ist kein gültiges Datum, Eingabe wiederholen!"
GoTo Eingabe1
End If
Eingabe2:
Eingabe = InputBox("Bitte Enddatum eingeben", "Tagesdaten-Import", _
Format(Date - 1, "D.M.YYYY"))
If Eingabe = "" Then Exit Sub
If IsDate(Eingabe) Then
DatumEnde = CDate(Eingabe)
Else
MsgBox "Eingabe ist kein gültiges Datum, Eingabe wiederholen!"
GoTo Eingabe2
End If
Set wbZiel = ThisWorkbook
Set wksZiel = wbZiel.Worksheets(1)
'Zeile mit Startdatum suchen
With wksZiel
For ZeileZiel = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row + 1
If .Cells(ZeileZiel, 1) = DatumStart Then Exit For
If ZeileZiel = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 Then
MsgBox "Startdatum nicht gefunden, Makro wird abgebrochen!"
Exit Sub
End If
Next
Application.ScreenUpdating = False
Do
'Name der Quelldatei
strPfadQuellen = "C:\" 'Basisverzeichnis der Tagesdateien
'      strPfadQuellen = "C:\Lokale daten\Test\" 'Basisverzeichnis der Tagesdateien
strQuelle = strPfadQuellen & Year(.Cells(ZeileZiel, 1).Value) & "_" _
& Format(.Cells(ZeileZiel, 1).Value, "MM") & "\" _
& Format(.Cells(ZeileZiel, 1).Value, "DD") & "\" & "Tageswerte.xls"
'Prüfen ob Quelldatei vorhanden
If Dir(strQuelle)  "" Then
'Quelldatei öffnen und Quellblatt zuweisen
Set wbQuelle = Workbooks.Open(Filename:=strQuelle, ReadOnly:=True)
Set wksQuelle = wbQuelle.Worksheets("Einzelwerte")
'Produktnamen in Zeile 1 abarbeiten
For SpalteZiel = 2 To .Cells(1, .Columns.Count).End(xlToLeft).Column
strProdukt = .Cells(1, SpalteZiel).Text
'Produkt in Quelle Spalte A suchen
Set Zelle = wksQuelle.Columns(1).Find(what:=strProdukt, LookIn:=xlValues, _
lookat:=xlWhole)
If Zelle Is Nothing Then
'Nullwert eintragen wenn Produkt nicht vorhanden
.Cells(ZeileZiel, SpalteZiel).Value = 0
Else
'Wert aus Spalte B für Produkt eintragen
.Cells(ZeileZiel, SpalteZiel).Value = Zelle.Offset(0, 1).Value
End If
Next
wbQuelle.Close savechanges:=False
Else
'Nullwerte eintragen wenn keine Tagesdatei vorhanden
For SpalteZiel = 2 To .Cells(1, .Columns.Count).End(xlToLeft).Column
.Cells(ZeileZiel, SpalteZiel).Value = 0
Next
End If
ZeileZiel = ZeileZiel + 1
Loop Until .Cells(ZeileZiel, 1) > DatumEnde _
Or ZeileZiel > .Cells(.Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = True
End With
Set Zelle = Nothing: Set wbQuelle = Nothing: set wksQuelle = Nothing
Set wbZiel = Nothing: Set wksZiel = Nothing
End Sub


Anzeige
AW: Zusammenführung Daten aus Ordnerstrukturen
18.02.2008 14:35:00
Bernd
Hallo Franz,
ich bin gerade dabei, das Makro noch ein wenig zu modifizieren (Verzeichnisstruktur ist noch ein wenig komplizierter als in der Mustervorlage), scheitere aber leider bereits bei der Erstellung der Stichtage.
Das Makro bricht nach Eingabe des Datumsbereiches bei der folgenden Anweisung ab mit der entsprechenden Meldung, dass er das Startdatum nicht gefunden hat:
'Zeile mit Startdatum suchen
With wksZiel
For ZeileZiel = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row + 1
If .Cells(ZeileZiel, 1) = DatumStart Then Exit For
If ZeileZiel = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 Then
MsgBox "Startdatum nicht gefunden, Makro wird abgebrochen!"
Exit Sub
End If
Next
Viele Grüße
Bernd

Anzeige
AW: Zusammenführung Daten aus Ordnerstrukturen
18.02.2008 14:49:42
fcs
Hallo Bernd,
ich hab das Makro in deiner Beispieldatei getestet. Das funktionierte.
Das Makro muss du in ein allgemeines Modul in der Datei mit der Übersicht einfügen.

Set wbZiel = ThisWorkbook
Set wksZiel = wbZiel.Worksheets(1) 'ggf anpassen
'Zeile mit Startdatum suchen


Prüfe, ob wksZiel (das Tabellenblatt, in das die Daten eingetragen werden sollen) korrekt gesetzt wird. z.Zt. ist es das 1. Tabellenblatt. Hier die Nummer anpassen oder den Namen eintragen.
Set wksZiel = wbZiel.Worksheets("Tabelle2")
Gruß
Franz

Anzeige
AW: Zusammenführung Daten aus Ordnerstrukturen
18.02.2008 15:24:00
Bernd
Hallo Franz,
ich habe einen Teil meiner Daten (nur 1.2- 15.2.2008) mal so strukturiert, wie in meiner Beschreibung angegeben. Wenn ich nun das Modul starte, dann erhalte ich die obige Fehlermeldung. Trage ich in Spalte A der Zusammenführungsdatei manuell das Datum vom 1.2 bis 15.2.2008 ein, dann bricht das Makro zumindest nicht ab, füllt mir jedoch alle Felder mit 0! Deine Hinweise habe ich beachtet!
Die Zulieferdateien sind so strukturiert:
https://www.herber.de/bbs/user/49987.xls
Kannst Du das bitte nochmal prüfen, vielleicht haben wir uns missverstanden.
Gruß
Bernd

Anzeige
AW: Zusammenführung Daten aus Ordnerstrukturen
19.02.2008 11:21:00
fcs
Hallo Bernd,
ich hab im Makro jetzt noch eine Meldung eingebaut, die angezeigt wird, wenn eine Datei mit Tageswerten nicht gefunden wird.
Irgendwie wird bei dir der Dateiname falsch berechnet, oder du hast den Basispfad für die Dateien nicht korrekt im Code eingetragen.
Die kritischen Zeilen sind:

'Name der Quelldatei
'Basisverzeichnis der Tagesdateien
strPfadQuellen = "C:\Lokale daten\Test\"                    '###anpassen!!
'Pfad + Dateiname der Quell-Datei berechnen
strQuelle = strPfadQuellen & Year(.Cells(ZeileZiel, 1).Value) & "_" _
& Format(.Cells(ZeileZiel, 1).Value, "MM") & "\" _
& Format(.Cells(ZeileZiel, 1).Value, "DD") & "\" & "Tageswerte.xls"


Hier muss du anpassen, wenn der in der Meldung angezeigte Pfad+Dateiname nicht korrekt sind. Ggf. muss du auch prüfen, ob die aus dem Datum berechneten Unterverzeichnisse auch tatsächlich so angelegt sind, wie sie berechnet werden.
https://www.herber.de/bbs/user/50013.xls
Gruß
Franz

Anzeige
Vielen Dank und noch eine Ergänzungsfrage
19.02.2008 15:20:59
Bernd
Hallo Franz,
vielen Dank.jetzt klappt es! Hatte sich leider, wie vermutet, doch ein kleiner Fehler bei der Pfadangabe eingeschlichen, sorry für die Konfusion! Die Gültigkeitsprüfung durch die Erweiterung war sehr hilfreich!
Vielleicht noch eine Frage:
Kann man das Makro insofern optimieren, dass er das Datum automatisch aus der gegebenen Verzeichnisstruktur in Spalte A der Zusammenführungsdatei einträgt? Also z. B. Ich starte das Makro, dann werde ich nach dem Zeitraum gefragt und dann sollte das Makro automatisch alle Stichtage in Spalte A eintragen, für die tatsächlich auch ein entsprechender "Tagesordner" in der Verzeichnisstruktur existiert?
Viele Grüße
Bernd

Anzeige
AW: Vielen Dank und noch eine Ergänzungsfrage
19.02.2008 17:50:47
fcs
Hallo Bernd,
hier die von dir gewünschte Optimierung. Die Daten werden jeweils unterhalb der letzten in Spalte A ausgefüllten Zeile eingetragen. Ggf. muss du vorher die Daten ab Zeile 2 (unterhalb der Spaltentitel) oder ab einem bestimmten Datum löschen.
Für Spalte A muss du das gewünschte Datumsformat einstellen.
Gruß
Franz

Sub DatenEinlesen()
Dim wbZiel As Workbook, wksZiel As Worksheet, ZeileZiel As Long, SpalteZiel As Integer
Dim wbQuelle As Workbook, wksQuelle As Worksheet
Dim strQuelle As String, strProdukt As Variant, Zelle As Range, strPfadQuellen As String
Dim DatumStart As Date, DatumEnde As Date, Datum As Date
Eingabe1:
Eingabe = InputBox("Bitte Startdatum eingeben", "Tagesdaten-Import", _
"1.1." & Year(Date))
If Eingabe = "" Then Exit Sub
If IsDate(Eingabe) Then
DatumStart = CDate(Eingabe)
Else
MsgBox "Eingabe ist kein gültiges Datum, Eingabe wiederholen!"
GoTo Eingabe1
End If
Eingabe2:
Eingabe = InputBox("Bitte Enddatum eingeben", "Tagesdaten-Import", _
Format(Date - 1, "D.M.YYYY"))
If Eingabe = "" Then Exit Sub
If IsDate(Eingabe) Then
DatumEnde = CDate(Eingabe)
Else
MsgBox "Eingabe ist kein gültiges Datum, Eingabe wiederholen!"
GoTo Eingabe2
End If
Set wbZiel = ThisWorkbook
Set wksZiel = wbZiel.Worksheets(1)
'Zeile mit Startdatum suchen
With wksZiel
'Startzeile in Zieltabelle ermitteln (nächste Leere in Spalte A)
ZeileZiel = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
Application.ScreenUpdating = False
For Datum = DatumStart To DatumEnde
'Name der Quelldatei
'Basisverzeichnis der Tagesdateien
strPfadQuellen = "C:\Lokale daten\Test\"                    '###anpassen!!
'Pfad + Dateiname der Quell-Datei berechnen
strQuelle = strPfadQuellen & Year(Datum) & "_" & Format(Datum, "MM") & "\" _
& Format(Datum, "DD") & "\" & "Tageswerte.xls"
'Prüfen ob Quelldatei vorhanden
If Dir(strQuelle)  "" Then
'Quelldatei öffnen und Quellblatt zuweisen
Set wbQuelle = Workbooks.Open(Filename:=strQuelle, ReadOnly:=True)
Set wksQuelle = wbQuelle.Worksheets("Einzelwerte")
'Datum in Spalte 1 eintragen
.Cells(ZeileZiel, 1).Value = Datum
'Produktnamen in Zeile 1 abarbeiten
For SpalteZiel = 2 To .Cells(1, .Columns.Count).End(xlToLeft).Column
strProdukt = .Cells(1, SpalteZiel).Text
'Produkt in Quelle spalte 1 suchen
Set Zelle = wksQuelle.Columns(1).Find(what:=strProdukt, LookIn:=xlValues, _
lookat:=xlWhole)
If Zelle Is Nothing Then
'Nullwert eintragen wenn Produkt nicht vorhanden
.Cells(ZeileZiel, SpalteZiel).Value = 0
Else
'Werte aus Spalte B für Produkt eintragen
.Cells(ZeileZiel, SpalteZiel).Value = Zelle.Offset(0, 1).Value
End If
Next
wbQuelle.Close savechanges:=False
Else
'Die folgende Zeile in eine Bemerkung umwandeln, wenn alles funktioniert
MsgBox "Quelldatei für Datum """ & Format(Datum, "DD.MM.YYYY") _
& """ ist nicht vorhanden." & vbLf & vbLf _
& "Dateiname wäre: " & strQuelle
End If
ZeileZiel = ZeileZiel + 1
Next Datum
Application.ScreenUpdating = True
End With
Set Zelle = Nothing: Set wbQuelle = Nothing: Set wksQuelle = Nothing
Set wbZiel = Nothing: Set wksZiel = Nothing
End Sub


Anzeige
AW: Vielen Dank und noch eine Ergänzungsfrage
20.02.2008 11:54:00
Bernd
Hallo Franz,
es ist nochmal 2 Fragen aufgetaucht:
gl.
1.) Kann man unterbinden, das Excel beim Öffnen der Zulieferdateien pro Datei nachfragt bzgl. der Aktualisierung von verknüpften Daten? Die Daten sollten nicht aktualisiert werden.
2.) Kann man das Makro noch so optimieren, dass in der Zusammenführungsdatei z. B. die Spalten B-H mit Werten aus bestimmten Zulieferdateien aus Verzeichnisstruktur 1 und die Spalten I-P z.B. aus anderen Zulieferdateien aus einer Verzeichnisstruktur " gefüllt werden?
Ansonsten würde ich das Makro eben kopieren und das in einem separaten Tabellenblatt ablaufen lassen und anschließend manuell zusammenkopieren!
Viile Grüße
Bernd

Anzeige
AW: Vielen Dank und noch eine Ergänzungsfrage
20.02.2008 12:07:00
Bernd
Hallo Franz,
das mit der Aktualisierung konnte ich lösen (UpdateLinks:=0).
Leider noch eine kleiner Hürde beim Einlesen der zweiten Zuliefer-Datei (en). Dort sollte nicht in der Spalte A nach den Überschriften der Zusammenführungsdatei gesucht werden, sondern in der Zeile der Zeile 1, die relevanten Werte sind dann jeweils in Zeile 2 in der jeweligen Spalte enthalten.
Gruß
Bernd

AW: Vielen Dank und noch eine Ergänzungsfrage
20.02.2008 13:40:19
fcs
Hallo Bernd,
du kannst beide Einlesevorgänge in ein Makro einbauen. Die Pfade und ggf. die Berechnung des Dateinamens muss du im Code noch anpassen.
Gruß
Franz

Sub DatenEinlesen()
Dim wbZiel As Workbook, wksZiel As Worksheet, ZeileZiel As Long, SpalteZiel As Integer
Dim wbQuelle As Workbook, wksQuelle As Worksheet
Dim strQuelle As String, strProdukt As Variant, Zelle As Range, strPfadQuellen As String
Dim DatumStart As Date, DatumEnde As Date, Datum As Date
Eingabe1:
Eingabe = InputBox("Bitte Startdatum eingeben", "Tagesdaten-Import", _
"1.1." & Year(Date))
If Eingabe = "" Then Exit Sub
If IsDate(Eingabe) Then
DatumStart = CDate(Eingabe)
Else
MsgBox "Eingabe ist kein gültiges Datum, Eingabe wiederholen!"
GoTo Eingabe1
End If
Eingabe2:
Eingabe = InputBox("Bitte Enddatum eingeben", "Tagesdaten-Import", _
Format(Date - 1, "D.M.YYYY"))
If Eingabe = "" Then Exit Sub
If IsDate(Eingabe) Then
DatumEnde = CDate(Eingabe)
Else
MsgBox "Eingabe ist kein gültiges Datum, Eingabe wiederholen!"
GoTo Eingabe2
End If
Set wbZiel = ThisWorkbook
Set wksZiel = wbZiel.Worksheets(1)
'Zeile mit Startdatum suchen
With wksZiel
'Startzeile in Zieltabelle ermitteln (nächste Leere in Spalte A)
ZeileZiel = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
Application.ScreenUpdating = False
For Datum = DatumStart To DatumEnde
'Tages-Daten für Produkte in Spalten B bis H einlesen
'Name der Quelldatei
'Basisverzeichnis der Tagesdateien
strPfadQuellen = "C:\Lokale daten\Test\"                    '###anpassen!!
'Pfad + Dateiname der Quell-Datei berechnen
strQuelle = strPfadQuellen & Year(Datum) & "_" & Format(Datum, "MM") & "\" _
& Format(Datum, "DD") & "\" & "Tageswerte.xls"
'Prüfen ob Quelldatei vorhanden
If Dir(strQuelle)  "" Then
'Quelldatei öffnen und Quellblatt zuweisen
Set wbQuelle = Workbooks.Open(Filename:=strQuelle, ReadOnly:=True)
Set wksQuelle = wbQuelle.Worksheets("Einzelwerte")
'Datum in Spalte 1 eintragen
.Cells(ZeileZiel, 1).Value = Datum
'Produktnamen in Zeile 1 abarbeiten
For SpalteZiel = 2 To 8
strProdukt = .Cells(1, SpalteZiel).Text
'Produkt in Quelle spalte 1 suchen
Set Zelle = wksQuelle.Columns(1).Find(what:=strProdukt, LookIn:=xlValues, _
lookat:=xlWhole)
If Zelle Is Nothing Then
'Nullwert eintragen wenn Produkt nicht vorhanden
.Cells(ZeileZiel, SpalteZiel).Value = 0
Else
'Werte aus Spalte B für Produkt eintragen
.Cells(ZeileZiel, SpalteZiel).Value = Zelle.Offset(0, 1).Value
End If
Next
wbQuelle.Close savechanges:=False
Else
'Die folgende Zeile in eine Bemerkung umwandeln, wenn alles funktioniert
MsgBox "Quelldatei für Datum """ & Format(Datum, "DD.MM.YYYY") _
& """ ist nicht vorhanden." & vbLf & vbLf _
& "Dateiname wäre: " & strQuelle
End If
'Daten für Produkte in Spalten I bis P einlesen
'Name der Quelldatei
'Basisverzeichnis der Tagesdateien
strPfadQuellen = "C:\Lokale daten\Test\"                    '###anpassen!!
'Pfad + Dateiname der Quell-Datei berechnen
strQuelle = strPfadQuellen & Year(Datum) & "_" & Format(Datum, "MM") & "\" _
& Format(Datum, "DD") & "\" & "Tageswerte.xls"        '###ggf. Anpassen
'Prüfen ob Quelldatei vorhanden
If Dir(strQuelle)  "" Then
'Quelldatei öffnen und Quellblatt zuweisen
Set wbQuelle = Workbooks.Open(Filename:=strQuelle, ReadOnly:=True)
Set wksQuelle = wbQuelle.Worksheets("Einzelwerte")
'Produktnamen in Zeile 1 der Zieltabelle abarbeiten
For SpalteZiel = 9 To 16
strProdukt = .Cells(1, SpalteZiel).Text
'Produkt in Quelle Zeile 1 suchen
Set Zelle = wksQuelle.Rows(1).Find(what:=strProdukt, LookIn:=xlValues, _
lookat:=xlWhole)
If Zelle Is Nothing Then
'Nullwert eintragen wenn Produkt nicht vorhanden
.Cells(ZeileZiel, SpalteZiel).Value = 0
Else
'Wert aus Zeile 2 für Produkt eintragen
.Cells(ZeileZiel, SpalteZiel).Value = Zelle.Offset(1, 0).Value
End If
Next
wbQuelle.Close savechanges:=False
Else
'Die folgende Zeile in eine Bemerkung umwandeln, wenn alles funktioniert
MsgBox "Quelldatei für Spalte I bis P ist nicht vorhanden." & vbLf & vbLf _
& "Dateiname wäre: " & strQuelle
End If
ZeileZiel = ZeileZiel + 1
Next Datum
Application.ScreenUpdating = True
End With
Set Zelle = Nothing: Set wbQuelle = Nothing: Set wksQuelle = Nothing
Set wbZiel = Nothing: Set wksZiel = Nothing
End Sub


Anzeige
AW: Vielen Dank und noch eine Ergänzungsfrage
20.02.2008 16:29:00
Bernd
Hallo Franz,
ich konnte Dein Makro sehr individuell anpassen, es werden nun tatsächlich Daten aus 2 verschiedenen Zulieferdateien angezogen! Viellleicht noch 2 Dinge, die für Dich bestimmt ein Klacks sind :-)
1.) Bei fehlenden Tagen (Wochenende) werden Leerzeilen erzeugt, kann man das noch abstellen?
2.) Ich muss nun die Werte aus den Zulieferdateien 1 mit den Werten aus Zulieferdateien 2 vergleichen und zwar in der Form, das immer genau 10 Stichtage(oderDatensätze) dazwischenliegen: Also möchte ich Werte aus der Zulieferdatei 1 (z.B. 19.2.08) mit den Werten aus Zulieferdatei 2 vom 5.2.08 vergleichen. Kann man in der Übersichtsdatei pro Zeile auflisten?
3.) Ist es eventuell aus Transparenzgründen auch möglich, statt nur die Werte anzuzeigen, auch die "Links" anzuzeigen in der Zusammenführungsdatei?
Viele Grüße
Bernd

AW: Vielen Dank und noch eine Ergänzungsfrage
21.02.2008 00:50:32
fcs
Hallo Bernd,
Frage1: Hierzu muss die Erhöhung des Zeilenzählers für ZeileZiel angepasst werden. Im nacfolgenden Code hab ich die zu ändernden/einzufügenden Zeilen markiert.
Frage2: Wenn du die Daten im Bereich I bis P mit den Daten des bereichs B bis H 10 Datensätze weiter oben vergleichen willst, dann kannst du das in den Spalten ab Q in Zeile 12 und folgende per Formel machen oder auch per Makro (siehe Ergänzung am Ende des Code-Beispiels).
Der Vergleich mit einem 10 besser 14 Tage zurückliegendem Datum ist eigentlich nur per Makro zu bewältigen, da durch fehlende Wochenendtage unterschiedlich viele Zeilen zwischen den zu vergleichenden Daten liegen können; ggf. kommt man hier aber auch mit der SVERWEIS-Funktion weiter, aber das wird relativ kompliziert, da auch auf fehlendes Datum geprüft werden muss.
Frage 3: Was meinst du mit "Links anzeigen"?
Den Namen der Datei aus der die Daten für den jeweiligen Tag eingelesen wurden?
Das ist prinzipiell möglich. Hinter der Zeile, in der das Datum in die Zieltabelle geschrieben _ wird kannst du auch den Pfad+Namen der Quelldatei ins Zielblatt schreiben. Beispiel:

'Datum in Spalte 1 eintragen
.Cells(Zeile_B_H, 1).Value = Datum                              '######## ändern
'Pfad und Name der Quelldatei in Spalte Q eintragen
.Cells(Zeile_B_H, 17).Value = wbQuelle.FullName


In ähnlicher Weise kannst du den Namen der 2. Quelldatei im 2. Code-Teile eintragen
Gruß
Franz


Sub DatenEinlesen()
Dim wbZiel As Workbook, wksZiel As Worksheet, ZeileZiel As Long, SpalteZiel As Integer
Dim wbQuelle As Workbook, wksQuelle As Worksheet
Dim strQuelle As String, strProdukt As Variant, Zelle As Range, strPfadQuellen As String
Dim DatumStart As Date, DatumEnde As Date, Datum As Date
Dim Zeile_B_H As Long, Zeile_I_P As Long                '######## Zeile einfügen
Eingabe1:
Eingabe = InputBox("Bitte Startdatum eingeben", "Tagesdaten-Import", _
"1.1." & Year(Date))
If Eingabe = "" Then Exit Sub
If IsDate(Eingabe) Then
DatumStart = CDate(Eingabe)
Else
MsgBox "Eingabe ist kein gültiges Datum, Eingabe wiederholen!"
GoTo Eingabe1
End If
Eingabe2:
Eingabe = InputBox("Bitte Enddatum eingeben", "Tagesdaten-Import", _
Format(Date - 1, "D.M.YYYY"))
If Eingabe = "" Then Exit Sub
If IsDate(Eingabe) Then
DatumEnde = CDate(Eingabe)
Else
MsgBox "Eingabe ist kein gültiges Datum, Eingabe wiederholen!"
GoTo Eingabe2
End If
Set wbZiel = ThisWorkbook
Set wksZiel = wbZiel.Worksheets(1)
'Zeile mit Startdatum suchen
With wksZiel
'Startzeile in Zieltabelle ermitteln (nächste Leere in Spalte A)
ZeileZiel = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
Application.ScreenUpdating = False
For Datum = DatumStart To DatumEnde
Zeile_B_H = ZeileZiel                                   '######## Zeile einfügen
Zeile_I_P = ZeileZiel                                   '######## Zeile einfügen
'Tages-Daten für Produkte in Spalten B bis H einlesen
'Name der Quelldatei
'Basisverzeichnis der Tagesdateien
strPfadQuellen = "C:\Lokale daten\Test\"                    '###anpassen!!
'Pfad + Dateiname der Quell-Datei berechnen
strQuelle = strPfadQuellen & Year(Datum) & "_" & Format(Datum, "MM") & "\" _
& Format(Datum, "DD") & "\" & "Tageswerte.xls"
'Prüfen ob Quelldatei vorhanden
If Dir(strQuelle)  "" Then
'Quelldatei öffnen und Quellblatt zuweisen
Set wbQuelle = Workbooks.Open(Filename:=strQuelle, ReadOnly:=True)
Set wksQuelle = wbQuelle.Worksheets("Einzelwerte")
'Datum in Spalte 1 eintragen
.Cells(Zeile_B_H, 1).Value = Datum                              '######## ändern
'Produktnamen in Zeile 1 abarbeiten
For SpalteZiel = 2 To 8
strProdukt = .Cells(1, SpalteZiel).Text
'Produkt in Quelle spalte 1 suchen
Set Zelle = wksQuelle.Columns(1).Find(what:=strProdukt, LookIn:=xlValues, _
lookat:=xlWhole)
If Zelle Is Nothing Then
'Nullwert eintragen wenn Produkt nicht vorhanden
.Cells(Zeile_B_H, SpalteZiel).Value = 0                      '######## ändern
Else
'Werte aus Spalte B für Produkt eintragen
.Cells(Zeile_B_H, SpalteZiel).Value = Zelle.Offset(0, 1).Value '######## ändern
End If
Next
wbQuelle.Close savechanges:=False
ZeileZiel = Zeile_B_H + 1                                         '######## ändern
Else
'Die folgende Zeile in eine Bemerkung umwandeln, wenn alles funktioniert
MsgBox "Quelldatei für Datum """ & Format(Datum, "DD.MM.YYYY") _
& """ ist nicht vorhanden." & vbLf & vbLf _
& "Dateiname wäre: " & strQuelle
End If
'Daten für Produkte in Spalten I bis P einlesen
'Name der Quelldatei
'Basisverzeichnis der Tagesdateien
strPfadQuellen = "C:\Lokale daten\Test\"                        '###anpassen!!
'Pfad + Dateiname der Quell-Datei berechnen
strQuelle = strPfadQuellen & Year(Datum) & "_" & Format(Datum, "MM") & "\" _
& Format(Datum, "DD") & "\" & "Tageswerte.xls"            '###ggf. Anpassen
'Prüfen ob Quelldatei vorhanden
If Dir(strQuelle)  "" Then
'Quelldatei öffnen und Quellblatt zuweisen
Set wbQuelle = Workbooks.Open(Filename:=strQuelle, ReadOnly:=True)
Set wksQuelle = wbQuelle.Worksheets("Einzelwerte")
'Produktnamen in Zeile 1 der Zieltabelle abarbeiten
For SpalteZiel = 9 To 16
strProdukt = .Cells(1, SpalteZiel).Text
'Produkt in Quelle Zeile 1 suchen
Set Zelle = wksQuelle.Rows(1).Find(what:=strProdukt, LookIn:=xlValues, _
lookat:=xlWhole)
If Zelle Is Nothing Then
'Nullwert eintragen wenn Produkt nicht vorhanden
.Cells(Zeile_I_P, SpalteZiel).Value = 0              '######## ändern
Else
'Wert aus Zeile 2 für Produkt eintragen
.Cells(Zeile_I_P, SpalteZiel).Value = Zelle.Offset(1, 0).Value '######## ändern
End If
Next
wbQuelle.Close savechanges:=False
ZeileZiel = Zeile_I_P + 1  '######## diese Zeile einfügen
Else
'Die folgende Zeile in eine Bemerkung umwandeln, wenn alles funktioniert
MsgBox "Quelldatei für Spalte I bis P ist nicht vorhanden." & vbLf & vbLf _
& "Dateiname wäre: " & strQuelle
End If
'       ZeileZiel = ZeileZiel + 1    '############ Diese Zeile löschen #######
Next Datum
'Vergleich der Daten Bereich I-P  mit B-H 10 Zeilen oberhalb
With wksZiel
For ZeileZiel = 12 To .Cells(.Rows.Count, 1).End(xlUp).Row
'Differenz Spalte I - Spalte B
.Cells(ZeileZiel, 19).Value = .Cells(ZeileZiel, 9).Value - .Cells(ZeileZiel - 10, 2)
'Differenz Spalte J - Spalte C
.Cells(ZeileZiel, 20).Value = .Cells(ZeileZiel, 10).Value - .Cells(ZeileZiel - 10, 3)
'u.s.w.
Next
End With
Application.ScreenUpdating = True
End With
Set Zelle = Nothing: Set wbQuelle = Nothing: Set wksQuelle = Nothing
Set wbZiel = Nothing: Set wksZiel = Nothing
End Sub


Super Lösung, vielen Dank nochmal!
21.02.2008 14:41:00
Bernd
Hallo Franz,
vielen Dank für die Mühe! Die Sache mit dem Vergleich bekomme ich auch mit den Excel-Hausmitteln hin! Es ist schon eine große Erleicherung, dass ich im Grunde genommen nun die Quelldaten völlig flexibel aus der Historie anziehen kann, ansonsten wäre ich quasi jeden Tag mit der Zusammenführung der Daten beschäftigt gewesen und so kann ich das nun bei Bedarf auch für beliebige Zeiträume nachträglich "laufen lass". Meine Frage zur Integration von Links war ein wenig mißverständlich bzw. fehlerhaft gestellt, ich dachte eigentlich an Zellbezüge, aber die kann es ja aufgrund der Suche nach Spaltenköpfen gar nicht geben. Insofern war Deine Lösung mit Anzeige des Pfades schon eher zielführend und man kann ja auch schön sehen, dass tatsächlich die Daten aus den jeweiligen Dateien gezogen werden!
Vielen Dank nochmal für die am Ende sehr individuelle Lösung!
Viele Grüße
Bernd

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige