Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1508to1512
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

Tabelle mit Ordnerinhalt abgleichen und ergänzen

Tabelle mit Ordnerinhalt abgleichen und ergänzen
24.08.2016 10:19:31
Felix
Hallo zusammen,
ich melde mich hier mit einem etwas kniffligen Fall. Dieses Forum hat mir bisher immer sehr gut weitergeholfen, aber ich finde für mein Problem einfach keine passende Lösung. Ich hoffe Ihr könnt mir weiterhelfen!
Ausgangssituation:
- Ich habe eine Tabelle in Excel als Übersicht erstellt.
- Per VBA wird ein bestimmter Ordner ausgelesen, d.h. es werden die Dateinamen die im Ordner vorhanden sind untereinander in die Übersicht gezogen. Danach werden die Dateien (alles Excel Sheets) chronologisch geöffnet, einzelne Felder kopiert, auch in die Übersicht eingetragen und dann werden die Dateien geschlossen.
Soweit alles schön und gut. Das klappt auch alles wunderbar.
Mein Problem (IST-Zustand):
Mein Problem besteht darin, dass wenn in den Ordner jetzt neue Excel-Dateien dazu kommen und ich das Makro erneut ausführe, die ganze Tabelle überschrieben wird.
- Ich schaffe es nicht die Ordnerstruktur mit der Excel Übersicht abzugleichen
- Ich schaffe es nicht die Prozedur ab der nächsten freien Zelle laufen zu lassen, aber NUR für die neuen Dateien im Ordner, die noch nicht in der Übersicht aufgenommen sind
Gewünschtes Ergebnis (SOLL-Zustand):
Es soll geprüft werden, ob der Dateiname aus dem Ordner bereits in der Excel vorhanden ist, wenn ja überspringen, wenn nein in die nächste freie Zeile aufnehmen und die Prozedur, die ich unter Ausgangssituation beschrieben habe soll erneut ausgeführt werden aber immer nur für die neuen Dateien im Ordner.
Wie kann ich das umsetzen ? Ich hoffe ihr könnt mir weiterhelfen.
Anbei mein bisheriger Code:
Auch für Verbesserungsvorschläge im existierenden Code bin ich immer dankbar.

Private Sub CommandButton1_Click()
'Button "Analysieren"
'Variablen Deklaration
Dim app_pfadabfrage As Object
Dim pfad_suche As Variant
Dim pfad_auswahl As String
Dim dateisystem As Object
Dim dateiverzeichnis As Object
Dim fDatei As Object
Dim fdateien As Object
Dim strDat As String
Dim zeile As Integer
Dim teil_pfad_1 As String
Dim dateiname_komplett As String
Dim wb As Workbook
Dim rngEinfüg As Range
Dim kopierzeile As String
Dim einfügezeile As String
Dim zelle As Object
Dim Spalte_dateiname As Range
Dim teil_pfad_2 As String
Dim dateiname As String
Dim hyper As Object
'Pfadabfrage
'ruft den "Verzeichnis-Dialog" auf damit der Benutzer den Pfad bzw. Ordner
wählen kann, der analysiert werden soll.
Set app_pfadabfrage = CreateObject("Shell.Application")
Set pfad_suche = app_pfadabfrage.BrowseForFolder
(0, "Ordner auswählen", &H1000,17)
'führt den Benutzer durch die Abfrage und speichert den ausgewählten Pfad für
einen späteren Zugriff im Tabellenblatt "Parametereinstellungen" in der Zelle B1
On Error Resume Next
pfad_auswahl = pfad_suche.items().Item().Path
Worksheets("Parametereinstellungen").Range("B1").Value = pfad_auswahl & "\"
If pfad_auswahl = "" Then Exit Sub
On Error GoTo 0
'Dateinamen ziehen
'nimmt den vorher gewählten Pfad als Basis
pfad_auswahl = Worksheets("Parametereinstellungen").Range("B1").Value
'Grundlage zur Abfrage der Ordnerstruktur, scripting stellt die Typbibliothek dar
Set dateisystem = CreateObject("scripting.FileSystemObject")
'gibt dem System an welcher Ordner zur Analyse herangezogen werden soll, in
diesem Fall wieder Verweis auf den bereits ausgewählten Pfad
Set dateiverzeichnis = dateisystem.getFolder(pfad_auswahl)
'zieht sich die einzelnen Dateien aus dem Ordner
Set fdateien = dateiverzeichnis.Files
'setzt in der Übersicht den Start in der Menüleiste und arbeitet sich dann runter
zeile = 3
'zieht sich nun die Dateinamen
For Each fDatei In fdateien
If InStr(fDatei, "") > 0 Then
zeile = zeile + 1
Cells(zeile, 8) = fDatei.Name
End If
Next fDatei
'Kopier-/Einfüge-Prozess; mit diesen Schritten zieht sich das Programm eine
Vielzahl von Feldern aus den jeweiligen Dokumenten im Ordner
'nimmt den vorher gewählten Pfad als Basis
pfad_auswahl = Worksheets("Parametereinstellungen").Range("B1").Value
'Pfadnamen anpassen
dateiname_komplett = Dir(pfad_auswahl & "*.xlsm")
'Deklaration vor Schleife, ab dieser Zeile werden die Daten in die
Übersichtstabelle übernommen
einfügezeile = 4
'Kernprozess, Schleife, läuft solange, bis kein Dateiname bzw. keine Datei mehr
im Ordner gefunden wird
While dateiname_komplett  ""
Application.ScreenUpdating = False
'öffnet zum Start die erste Datei
Set wb = Workbooks.Open(pfad_auswahl & dateiname_komplett)
'kopiert, wechselt das Fenster, fügt ein, wechselt wieder das Fenster
usw. (bei den nachfolgenden Blöcken analog nur die kopierten und
eingefügten Werte sind anders)
'Stammnummer ziehen
ActiveWorkbook.Worksheets("Laufzettel").Range("E35").Copy
Windows("GB-BHF-Stammdaten_Erfassung_Laufzettel_Übersicht.xlsm").Activate
ActiveWorkbook.Worksheets("Übersicht").Range("J" &
einfügezeile).PasteSpecial Paste:=xlValues
Windows(dateiname_komplett).Activate
'Kennung ziehen
ActiveWorkbook.Worksheets("Laufzettel").Range("D4").Copy
Windows("GB-BHF-Stammdaten_Erfassung_Laufzettel_Übersicht.xlsm").Activate
ActiveWorkbook.Worksheets("Übersicht").Range("C" &
einfügezeile).PasteSpecial Paste:=xlValues
Windows(dateiname_komplett).Activate
'Name Altsystem ziehen
ActiveWorkbook.Worksheets("Laufzettel").Range("D28").Copy
Windows("GB-BHF-Stammdaten_Erfassung_Laufzettel_Übersicht.xlsm").Activate
ActiveWorkbook.Worksheets("Übersicht").Range("I" &
einfügezeile).PasteSpecial Paste:=xlValues
'Checkboxen abfragen
Windows(dateiname_komplett).Activate
If ActiveWorkbook.Worksheets("Laufzettel").Shapes("Kontrollkästchen
26").DrawingObject.Value = 1 Then
Windows("GB-BHF-Stammdaten_Erfassung_Laufzettel_Übersicht.xlsm").Activate
ActiveWorkbook.Worksheets("Übersicht").Range("K" & einfügezeile) = "X"
Else
Windows("GB-BHF-Stammdaten_Erfassung_Laufzettel_Übersicht.xlsm").Activate
ActiveWorkbook.Worksheets("Übersicht").Range("K" & einfügezeile) = ""
End If
Windows(dateiname_komplett).Activate
If ActiveWorkbook.Worksheets("Laufzettel").Shapes("Kontrollkästchen
27").DrawingObject.Value = 1 Then
Windows("GB-BHF-Stammdaten_Erfassung_Laufzettel_Übersicht.xlsm").Activate
ActiveWorkbook.Worksheets("Übersicht").Range("L" & einfügezeile) = "X"
Else
Windows("GB-BHF-Stammdaten_Erfassung_Laufzettel_Übersicht.xlsm").Activate
ActiveWorkbook.Worksheets("Übersicht").Range("L" & einfügezeile) = ""
End If
Windows(dateiname_komplett).Activate
If ActiveWorkbook.Worksheets("Laufzettel").Shapes("Kontrollkästchen
28").DrawingObject.Value = 1 Then
Windows("GB-BHF-Stammdaten_Erfassung_Laufzettel_Übersicht.xlsm").Activate
ActiveWorkbook.Worksheets("Übersicht").Range("M" & einfügezeile) = "X"
Else
Windows("GB-BHF-Stammdaten_Erfassung_Laufzettel_Übersicht.xlsm").Activate
ActiveWorkbook.Worksheets("Übersicht").Range("M" & einfügezeile) = ""
End If
'öffnet zum Schluss immer das Fenster aus dem kopiert wurde und schließt
danach diese Datei, sodass nur noch die Übersicht geöffnet bleibt
Windows(dateiname_komplett).Activate
ActiveWorkbook.Close
'erhöht den Zähler der Schleife um 1, bzw. wandert eine Zeile in der
Übersichtstabelle nach unten um die nächsten Werte auszufüllen
einfügezeile = einfügezeile + 1
dateiname_komplett = Dir
Application.ScreenUpdating = True
Wend
'Cleanup der Variablen
Set rngEinfüg = Nothing
Set wb = Nothing
'Hyperlinks erstellen
'die Angabe der Hyperlinks muss in zwei Teilen geschehen, da sich ein Teil aus dem
Ordnerpfad an sich zusammensetzt und ein Teil aus einem variablen Dateinamen
'Pfadangabe 1. Teil, 2. Teil entsteht durch Zeile, dem Programm wird gesagt,
dass es ab Zeile 4 in der Übersichtstabelle anfangen soll die Hyperlinks
zusammenzusetzen
zeile = 4
pfad_komplett = Worksheets("Parametereinstellungen").Range("B1").Value
dateiname = Cells(zeile, "H").Value
'Angabe, in welche Spalte die Hyperlinks übertragen werden sollen
Set Spalte_dateiname = Range("A4:A3003")
'Schleife zur Erstellung der Hyperlinks
For Each zelle In Spalte_dateiname
If zelle = "" Then Exit For
dateiname = Cells(zeile, "H").Value
zeile = zeile + 1
ActiveSheet.Hyperlinks.Add anchor:=zelle, Address:=pfad_komplett & dateiname
Next
End Sub

Vielen Dank im Voraus für eure Antworten und eure Mühe! :-)
Mit freundlichen Grüßen
Felix

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabelle mit Ordnerinhalt
26.08.2016 13:18:47
Jürgen
Hallo Felix,
das sollte kein größeres Problem sein.
Versuche diesen Teil zu ersetzen:
 'setzt in der Übersicht den Start in der Menüleiste und arbeitet sich dann runter
zeile = 3
'zieht sich nun die Dateinamen
For Each fDatei In fdateien
If InStr(fDatei, "") > 0 Then
zeile = zeile + 1
Cells(zeile, 8) = fDatei.Name
End If
Next fDatei

durch:

dim oDictName as object
set oDictName = CreateObject("Scripting.dictionary")
oDictName.RemoveAll
'Definieren der letzten benutzten Zeile
Zeile = activesheet.usedrange.rows.count
'Vorhandene Dateien in Dictionary aufnehmen. Dict schneller als Array.
for i = 3 to zeile
If Not oDictName.exists(.Cells(i, 8).Value) Then
oDictName.Add range(Cells(i, 8),cells(i,8)).Value2, "1"
end if
next
For Each fDatei In fdateien
if not oDictName.exists (fDatei.name) and If InStr(fDatei, "") > 0 then
zeile = zeile + 1
range(Cells(zeile, 8),cells(zeile,8)) = fDatei.Name
End If
Next fDatei
Makro ist ungeprüft! Rechtschreibfehler möglich. ;-]
Gruß
Jürgen
Anzeige

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige