Anzeige
Archiv - Navigation
984to988
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
984to988
984to988
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Makro Zusammenfassung bestimmter Bereich und Datum

Makro Zusammenfassung bestimmter Bereich und Datum
17.06.2008 10:50:51
Sascha
Da mein anderer Beitrag nicht in der Übersicht auftaucht versuche ich es hier noch einmal. Sollte dies als Doppelposting betrachtet werden dann bitte löschen, dies ist nicht meine Absicht!
Nochmals zur Ausgangslage: In einem Ordner liegen wöchentlich abgelegte Dateien, die alle identisch aufgebaut sind. Die Tabellenblätter heißen Montag, Dienstag... bis Samstag, zusätzlich ein Blatt Kunden mit den Stammdaten. Siehe: https://www.herber.de/bbs/user/52971.xls
Ich habe ein Makro gefunden und angepasst dass mir den gewünschten Ordner durchsucht und alle Tabellenblätter (bis auf das Blatt Kunden) aller Dateien in einem neuen Blatt untereinandergeschreiben zusammenfasst.
Nun hätte ich noch ein, zwei offene Punkte:
  • Als Bereich möchte ich gerne nur B3 bis AC50 kopiert haben und auch nur die Zeilen, bei denen in Spalte E eine Kundennummer eingetragen ist

  • Außerdem findet sich in jedem Quell-Tabellenblatt in E1 ein Datum, welches ich gerne noch am Ende der Zeile eintragen würde

  • Hier das Makro:
    
    Sub Zusammenführen_in_eine_Tabelle(Verzeichnis As String)
    ' Führt die Tabellen aus den Dateien in Verzeichnis in einer Datei zusammen
    ' Dabei werden die Daten aus den Tabellen der Quell-Dateien in eine oder mehr Ziel-Tabelle(n)  _
    kopiert
    ' Dabei werden in den Tabellen alle Formeln in Werte verwandelt
    Dim wbQuelle As Workbook, wksQuelle As Worksheet, wbZiel As Workbook, wksZiel As Worksheet
    Dim Datei As String, ZeileDaten As Long, Zeile As Long, wksListe As Worksheet
    Dim Spaltenformat As Boolean, I As Integer, Blatt As Integer
    'Neue Datei zum Zusammenführen der Tabellen Dateien anlegen
    Set wbZiel = Workbooks.Add(Template:=xlWBATWorksheet)
    Set wksZiel = wbZiel.Sheets(1)
    Blatt = 1 'Zählnummer für Blätter mit Daten
    wksZiel.Name = "Tabelle" & Blatt
    wbZiel.Worksheets.Add After:=Sheets(1) 'Blatt das die zusammengefassten Tabellen  _
    protokolliert
    Set wksListe = ActiveSheet
    wksListe.Name = "Importprotokoll"
    Zeile = 1
    wksListe.Cells(Zeile, 1) = "Import-Protokoll"
    Zeile = 2
    wksListe.Cells(Zeile, 1) = "Quell-Datei"
    wksListe.Cells(Zeile, 2) = "Quell-Tabelle"
    wksListe.Cells(Zeile, 3) = "eingefügt in Blatt"
    ZeileDaten = 1
    Application.ScreenUpdating = False
    'Exceldateien im Verzeichnis Öffnen
    Datei = Dir(Verzeichnis & "*.xls")
    Spaltenformat = False
    Do Until Datei = ""
    Application.StatusBar = "Die " & Zeile - 1 & ". Datei wird bearbeitet, Dateiname: " & Datei
    Set wbQuelle = Workbooks.Open(FileName:=Verzeichnis & Datei, ReadOnly:=True)
    For Each wksQuelle In wbQuelle.Worksheets 'Variante für alle Tabellenblätter
    If wksQuelle.Name  "Kunden" Then
    With wksQuelle
    If ZeileDaten + .UsedRange.Rows.Count > wksZiel.Rows.Count Then
    Blatt = Blatt + 1
    wbZiel.Worksheets.Add After:=Sheets(Blatt - 2) 'weiteres Blatt für Daten
    Set wksZiel = wbZiel.Sheets(Blatt)
    wksZiel.Name = "Tabelle" & Blatt
    Spaltenformat = False
    ZeileDaten = 1
    End If
    If Spaltenformat = False Then
    'Aus der 1. Tabelle der nächsten, Datei werden die Spaltenbreiten ausgelesen und in  _
    die Ziel-Tabelle übertragen
    For I = 1 To .UsedRange.Column + .UsedRange.Columns.Count - 1
    wksZiel.Columns(I).ColumnWidth = .Columns(I).ColumnWidth
    Next I
    Spaltenformat = True
    End If
    Zeile = Zeile + 1
    wksListe.Cells(Zeile, 1) = wbQuelle.FullName
    wksListe.Cells(Zeile, 2) = wksQuelle.Name
    wksListe.Cells(Zeile, 3) = Blatt
    'Formeln durch Werte ersetzen
    .UsedRange.Copy
    .Range(.UsedRange.Address).PasteSpecial Paste:=xlPasteValues
    .UsedRange.EntireRow.Copy Destination:=wksZiel.Cells(ZeileDaten, 1)
    ZeileDaten = ZeileDaten + .UsedRange.Rows.Count
    End With
    End If
    Next wksQuelle
    wbQuelle.Close Savechanges:=False
    Datei = Dir
    Loop
    Application.StatusBar = False
    Application.ScreenUpdating = True
    wbZiel.Activate
    'Protokollliste Formatieren
    wksListe.Select
    wksListe.Columns("A:B").AutoFit
    wksListe.Range("A3").Select
    ActiveWindow.FreezePanes = True
    ' Datei-Speichern Dialog anzeigen
    Application.Dialogs(xlDialogSaveWorkbook).Show
    End Sub
    


    fcs und case hatten mich im ersten Posting ja schon ein paar Schritte weitergebracht, besten dank nochmals dafür!
    Sascha

    4
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: Makro Zusammenfassung bestimmter Bereich und D
    17.06.2008 19:10:39
    fcs
    Hallo Sascha,
    da bist du doch ein ganzes Stück weiter gekommen.
    Wie erwartet erschweren die verbundenen Zellen die Übernahme der Daten.
    In der Hoffnung, dass jeder Wochentag immer 4 Zeilen als verbundenen Zellenhat hab ich dir das Makro so eingerichtet, dass die gewünschten Zellbereiche kopiert werden. Datum und Dateiname werden ebnfalls für jeden Kundenbesuch eingetragen in den Spalten AB und AC.
    Zusätzlich hab auf basis deiner Beispieldatei die Zusammengefasste Datei so aufbereitet, dass die verbundenen Zellen aufgelöst werden. Falls in den Spalten X bis AC auch noch Spalten verbunden werden, dann muss du hier enrsprechend Anweisungen ergänzen.
    Gruß
    Franz
    
    Sub Zusammenführen_in_eine_Tabelle(Verzeichnis As String)
    ' Führt die Tabellen aus den Dateien in Verzeichnis in einer Datei zusammen
    ' Dabei werden die Daten aus den Tabellen der Quell-Dateien in eine oder mehr _
    Ziel-Tabelle(n) kopiert
    ' Dabei werden in den Tabellen alle Formeln in Werte verwandelt
    Dim wbQuelle As Workbook, wksQuelle As Worksheet, wbZiel As Workbook, wksZiel As Worksheet
    Dim Datei As String, ZeileDaten As Long, Zeile As Long, wksListe As Worksheet
    Dim Spaltenformat As Boolean, I As Integer, Blatt As Integer
    'Neue Datei zum Zusammenführen der Tabellen Dateien anlegen
    Set wbZiel = Workbooks.Add(Template:=xlWBATWorksheet)
    Set wksZiel = wbZiel.Sheets(1)
    Blatt = 1 'Zählnummer für Blätter mit Daten
    wksZiel.Name = "Tabelle" & Blatt
    wbZiel.Worksheets.Add After:=Sheets(1) 'Blatt das die zusammengefassten Tabellen _
    protokolliert
    Set wksListe = activesheet
    wksListe.Name = "Importprotokoll"
    Zeile = 1
    wksListe.Cells(Zeile, 1) = "Import-Protokoll"
    Zeile = 2
    wksListe.Cells(Zeile, 1) = "Quell-Datei"
    wksListe.Cells(Zeile, 2) = "Quell-Tabelle"
    wksListe.Cells(Zeile, 3) = "eingefügt in Blatt"
    ZeileDaten = 1
    Application.ScreenUpdating = False
    'Exceldateien im Verzeichnis Öffnen
    Datei = Dir(Verzeichnis & "*.xls")
    Spaltenformat = False
    Do Until Datei = ""
    Application.StatusBar = "Die " & Zeile - 1 & ". Datei wird bearbeitet, Dateiname: " _
    & Datei
    Set wbQuelle = Workbooks.Open(FileName:=Verzeichnis & Datei, ReadOnly:=True)
    For Each wksQuelle In wbQuelle.Worksheets 'Variante für alle Tabellenblätter
    If wksQuelle.Name  "Kunden" Then
    With wksQuelle
    If ZeileDaten + .UsedRange.Rows.Count > wksZiel.Rows.Count Then
    Blatt = Blatt + 1
    wbZiel.Worksheets.Add After:=Sheets(Blatt - 2) 'weiteres Blatt für Daten
    Set wksZiel = wbZiel.Sheets(Blatt)
    wksZiel.Name = "Tabelle" & Blatt
    Spaltenformat = False
    ZeileDaten = 1
    End If
    If Spaltenformat = False Then
    'Aus der 1. Tabelle der nächsten, Datei werden die Spaltenbreiten ausgelesen _
    für Spalte 2 bis 29 (B bis AC) und in die Ziel-Tabelle übertragen
    For I = 2 To 29
    wksZiel.Columns(I - 1).ColumnWidth = .Columns(I).ColumnWidth
    Next I
    Spaltenformat = True
    'Spaltenüberschrift kopieren
    .Range("B2:AC2").Copy Destination:=wksZiel.Range("A1:AB1")
    wksZiel.Range("AC1") = "Datum"
    'Datums-Spalte formatieren
    wksZiel.Range("AC:AC").NumberFormat = "DDD DD.MM.YYYY" 'TTT TT.MM.JJJJ
    wksZiel.Range("AC:AC").ColumnWidth = 14
    wksZiel.Range("AD1") = "Datei"
    ZeileDaten = ZeileDaten + 1
    End If
    Zeile = Zeile + 1
    wksListe.Cells(Zeile, 1) = wbQuelle.FullName
    wksListe.Cells(Zeile, 2) = wksQuelle.Name
    wksListe.Cells(Zeile, 3) = Blatt
    'Formeln in Quelle durch Werte ersetzen
    .UsedRange.Copy
    .Range(.UsedRange.Address).PasteSpecial Paste:=xlPasteValues
    'Spalten B bis AC mit Kunden-Nummereinträgen kopieren
    .Range(.Range("B3"), .Cells(.Cells(.Rows.Count, 5).End(xlUp).Row + 3, 29)).Copy _
    Destination:=wksZiel.Cells(ZeileDaten, 1)
    With wksZiel
    'Datum und Dateiname eintragen
    For I = ZeileDaten To .Cells(.Rows.Count, 4).End(xlUp).Row + 3 Step 4
    .Cells(I, 29).Value = wksQuelle.Range("E1").Value 'Datum
    .Cells(I, 30).Value = wbQuelle.Name 'Dateiname
    Next I
    'nächste EinfügeZeile
    ZeileDaten = .Cells(.Rows.Count, 4).End(xlUp).Row + 4
    End With
    End With
    End If
    Next wksQuelle
    wbQuelle.Close Savechanges:=False
    Datei = Dir
    Loop
    Application.StatusBar = False
    Application.ScreenUpdating = True
    wbZiel.Activate
    'Protokollliste Formatieren
    wksListe.Select
    wksListe.Columns("A:B").AutoFit
    wksListe.Range("A3").Select
    ActiveWindow.FreezePanes = True
    'Datenliste anzeigen
    wksZiel.Activate
    wksZiel.Columns("AD:AD").AutoFit 'Breite Spalte mit Dateiname optimal setzen
    wksZiel.Range("A2").Select
    ActiveWindow.FreezePanes = True
    Call VerbundeneZellenAufloesen(wksZiel)
    ' Datei-Speichern Dialog anzeigen
    Application.Dialogs(xlDialogSaveWorkbook).Show
    End Sub
    Sub VerbundeneZellenAufloesen(wks As Worksheet)
    'in Zieltabelle verbundene Zellen auflösen, Leere Splaten und Zeilen löschen
    'einige Spalten Formate einstellen
    Dim lngZeile As Long
    Application.ScreenUpdating = False
    With wks
    'Spalten mit Daten in verbundenen Spalten verbreitern
    .Cells(1, 2).EntireColumn.ColumnWidth = 5      'Spalte B
    .Cells(1, 4).EntireColumn.ColumnWidth = 10.5   'Spalte D
    .Cells(1, 7).EntireColumn.ColumnWidth = 32     'Spalte G
    .Cells(1, 14).EntireColumn.ColumnWidth = 7     'Spalte N
    .Cells(1, 16).EntireColumn.ColumnWidth = 17    'Spalte P
    'verbundene Zellenauflösen
    .UsedRange.Cells.MergeCells = False
    'Spalten ohneDaten von rechts nach links löschen
    .Columns("Q:V").Delete
    .Columns("O:O").Delete
    .Columns("H:M").Delete
    .Columns("E:F").Delete
    .Columns("C:C").Delete
    'Zeilen ohneDaten in Spalte Kunden-Nummer löschen
    .Range(.Cells(2, 3), .Cells(.Cells(.Rows.Count, 3).End(xlUp).Row + 3, _
    3)).SpecialCells(xlCellTypeBlanks).EntireRow.Select
    Selection.Delete shift:=xlShiftUp
    .Range("A2").Select
    'in allen Zellen den Inhalt vertikal oben ausrichten
    .Range(.Cells(2, 1), .UsedRange.SpecialCells(xlCellTypeLastCell)).VerticalAlignment _
    = xlVAlignTop
    'Kundenname und Ort links ausrichten
    .Columns("D:D").HorizontalAlignment = xlHAlignLeft
    .Columns("F:F").HorizontalAlignment = xlHAlignLeft
    End With
    Application.ScreenUpdating = True
    End Sub
    


    Anzeige
    AW: Makro Zusammenfassung bestimmter Bereich und D
    18.06.2008 17:07:00
    Sascha
    Hallo Franz,
    super, das wird ja alles noch besser als ich gedacht habe. Eine Schwierigkeit zeigt sich jetzt grad noch, da wohl einige Blätter mit Blattschutz versehen sind und ic daher einen Laufzeitfehler 1004 bekomme. (Die PasteSpecial-Methode des Range-Objekts konnte nicht ausgeführt werden)
    Mit einem On Error Resume Next macht er zwar weiter, aber das ist ja nicht die Lösung, gell ;-)
    Ich denke mal das löse ich mit folgendem Eintrag:
    ActiveSheet.Unprotect Password:="besplan"
    Aber wo genau packe ich das denn hin?
    Besten dank nochmals für deine großartige Unterstützung
    Sascha

    Anzeige
    AW: Makro Zusammenfassung bestimmter Bereich und D
    18.06.2008 17:34:00
    fcs
    Hallo Sascha,
    an dieser Position
    
    With wksQuelle
    .Unprotect Password:="besplan"
    If ZeileDaten + .UsedRange.Rows.Count > wksZiel.Rows.Count Then
    


    oder ohne Parameter Password, dann wirst du bei jedem geschützten Blatt danach gefragt.
    Das Auflösen der verbundenene Zellen hab ich eingebaut, weil man sonst mit der zusammengefasten Liste sehr wenig hätte machen könne. So kann man sortieren, Filtern etc. und weitere Auswertungen z.B. Pivot-Tabellenberichte erstellen ud man kann ggf. die Wochen-Zusammenstellungen sehr einfach in eine Jahresdatei übertragen.
    Gruß
    Franz
    Gruß
    Franz

    Anzeige
    AW: Makro Zusammenfassung bestimmter Bereich und D
    18.06.2008 18:03:00
    Sascha
    Perfekt.
    Genau da hatte ich es schon, nur dass ich eben ActiveSheet.Unprotect Password:="besplan" statt nur dem .Unprotect... geschrieben hatte. Aber Stück für Stück arbeite ich mich in die Materie ein und dank solch selbstloser Helfer wie Dir macht es sogar Spaß :-)

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige