Option Explicit
Type my_Arbeitsmappen_structure
s_Pfad As String
s_Name As String
s_FullName As String
b_geoeffnet As Boolean
b_NameMehrfach As Boolean
End Type
'***********************************************************
Sub BlaetterMitPBeginnendInNeueArbeitsmappe()
'*** Aus den definierten Dateien werden die
'*** Blätter, deren Name mit p/P beginnt,
'*** in die Arbeitsmappe Master.xls kopiert
'*** ist ein BlattName in Master.xls schon vorhanden,
'*** wird das entsprechende Blatt in Master.xls
'*** gelöscht und dann das neue hineinkopiert.
'*** Beim Namensvergleich wird Groß/Kleinschreibung
'*** nicht berücksichtigt!
'***
'*** ACHTUNG !!!
'*** Sind in zwei Quelldateien Blätter, die den
'*** gleichen Namen haben und deren Name mit p/P
'*** anfängt, ist zum Schluß nur das Blatt aus
'*** der zuletzt behandelten Datei in Master.xls
'*** enthalten.
'*** ACHTUNG !!!
'***
'*** ACHTUNG !!!
'*** sind auf den kopierten Blättern Zellen,
'*** deren Inhalt mehr als 255 Zeichen beträgt,
'*** wird der Inhalt auf 255 Zeichen beschnitten
'*** ACHTUNG !!!
->Feld meine Arbeitsmappen
Dim f_MA() As my_Arbeitsmappen_structure, f_MA_cnt As Long
->Zieltabelle
Dim ZielTab As my_Arbeitsmappen_structure
Dim wbz As Workbook, x As Long
->Dateien festlegen
Call MeineArbeitsmappen_NamenFestlegen(f_MA(), f_MA_cnt, ZielTab)
->prüfen: Existenz,->geoeffnet', Name kommt mehrfach vor
If Not MeineArbeitsmappen_Pruefen( _
f_MA(), f_MA_cnt, ZielTab) Then Exit Sub
->Zielmappe öffnen
If ZielTab.b_geoeffnet Then
Set wbz = Workbooks(ZielTab.s_Name)
Else
Set wbz = Workbooks.Open(ZielTab.s_FullName)
End If
->Bildschirm-Update abschalten
Application.ScreenUpdating = False
->Tabellenblätter kopieren
Call P_BlatterInZielMappeKopieren(wbz, f_MA(), f_MA_cnt)
->Zieldatei - Blätter sortieren
Call BlaetterInZielDateiSortieren(wbz)
->Ziel-Datei 1.Tabellenblatt aktivieren
wbz.Worksheets(1).Select
->Wenn Ziel-Datei vorher geschlossen war, schliessen
If Not ZielTab.b_geoeffnet Then
wbz.Close SaveChanges:=True
End If
->Bildschirm-Update anschalten
Application.ScreenUpdating = True
Aufraeumen:
Set wbz = Nothing
End Sub
'***********************************************************
Private Function P_BlatterInZielMappeKopieren(wbz As Workbook, _
f_MA() As my_Arbeitsmappen_structure, f_MA_cnt As Long)
Dim x As Long, wb As Workbook, ws As Worksheet, wsz As Worksheet
Dim s_WarEinzigesBlatt As String
s_WarEinzigesBlatt =
->alle zu bearbeitenden Mappen
For x = LBound(f_MA()) To UBound(f_MA())
->Mappe öffnen, wenn noch nicht offen
If f_MA(x).b_geoeffnet Then
Set wb = Workbooks(f_MA(x).s_Name)
Else
Set wb = Workbooks.Open(f_MA(x).s_FullName)
End If
->alle Arbeitsblätter
For Each ws In wb.Worksheets
->Arbeitsblattname fängt mit->p' an ?
If p = LCase(Left(ws.Name, 1)) Then
->Wenn Blattname in Master.xls schon vorhanden,
->entsprechendes Blatt vor dem Kopieren löschen
For Each wsz In wbz.Worksheets
If LCase(ws.Name) = LCase(wsz.Name) Then
->wenn nicht letztes Blatt
If wbz.Worksheets.Count > 1 Then
Application.DisplayAlerts = False
wsz.Delete
Application.DisplayAlerts = True
Else
->letztes Blatt
->Umbenennen und nach dem Kopieren löschen
wsz.Name = __NACHKOPIERENLOESCHEN__
s_WarEinzigesBlatt = wsz.Name
End If
Exit For
End If
Next
->Blatt in Zielmappe kopieren
ws.Copy After:=wbz.Worksheets(1)->### geändert 9.6.2005
->Wenn das alte Blatt noch gelöscht werden muß-> löschen
If s_WarEinzigesBlatt <> Then
Application.DisplayAlerts = False
wbz.Worksheets(s_WarEinzigesBlatt).Delete
Application.DisplayAlerts = True
s_WarEinzigesBlatt = ->### geändert 9.6.2005
End If
End If
Next
->wenn Mappe nicht geöffnet war, schliessen
If Not f_MA(x).b_geoeffnet Then wb.Close SaveChanges:=False
Next
Aufraeumen:
Set wb = Nothing: Set wsz = Nothing: Set ws = Nothing
End Function
'***********************************************************
Private Function MeineArbeitsmappen_NamenFestlegen( _
f_MA() As my_Arbeitsmappen_structure, f_MA_cnt As Long, _
ZielTab As my_Arbeitsmappen_structure)
Dim x As Long
->Zieldatei
With ZielTab
.s_Pfad = c:\Test1
.s_Name = Master.xls
.s_FullName = .s_Pfad & Application.PathSeparator & .s_Name
.b_NameMehrfach = False
.b_geoeffnet = False
End With
->Quelldateien
f_MA_cnt = 0: ReDim f_MA(1 To 1)
->1.Datei
f_MA_cnt = f_MA_cnt + 1: ReDim Preserve f_MA(1 To f_MA_cnt)
With f_MA(f_MA_cnt)
.s_Pfad = c:\Test1 ->Pfad zur Mappe
.s_Name = TestMappe1.xls->Dateiname
End With
->2.Datei
f_MA_cnt = f_MA_cnt + 1: ReDim Preserve f_MA(1 To f_MA_cnt)
With f_MA(f_MA_cnt)
.s_Pfad = c:\Test2 ->Pfad zur Mappe
.s_Name = TestMappe1.xls->Dateiname
End With
->3.-nte
->....
->Feld weiter vervollständigen, Flags initialisieren
For x = 1 To f_MA_cnt
With f_MA(x)
.s_FullName = .s_Pfad & Application.PathSeparator & .s_Name
.b_geoeffnet = False
.b_NameMehrfach = False
End With
Next
End Function
'***********************************************************
Private Function MeineArbeitsmappen_Pruefen( _
f_MA() As my_Arbeitsmappen_structure, f_MA_cnt As Long, _
ZielTab As my_Arbeitsmappen_structure) As Boolean
Dim wb As Workbook, x As Long, y As Long
MeineArbeitsmappen_Pruefen = False
->Zieldatei
->vorhanden ?
With ZielTab
If = Dir(.s_FullName, vbNormal) Then
MsgBox ( _
Ziel-Datei existiert nicht & vbLf & _
.s_FullName & vbLf & vbLf & _
--> Abbruch)
GoTo Aufraeumen
End If
->geoeffnet ?
For Each wb In Workbooks
If LCase(.s_FullName) = LCase(wb.FullName) Then
.b_geoeffnet = True
Exit For
End If
Next
End With
->Quelldateien
->Existenz und geoeffnet prüfen
If f_MA_cnt = 0 Then
MsgBox (keine Quelldateien angegeben.)
Exit Function
End If
For x = 1 To f_MA_cnt
With f_MA(x)
->vorhanden ?
If = Dir(.s_FullName, vbNormal) Then
MsgBox ( _
Quell-Datei existiert nicht & vbLf & _
.s_FullName & vbLf & vbLf & _
--> Abbruch)
GoTo Aufraeumen
End If
->geoeffnet ?
For Each wb In Workbooks
If LCase(.s_FullName) = LCase(wb.FullName) Then
.b_geoeffnet = True
Exit For
End If
Next
End With
Next x
->mehrfach vorhanden ?
For x = 1 To f_MA_cnt
For y = 1 To f_MA_cnt
If x <> y Then
If f_MA(x).s_Name = f_MA(y).s_Name Then
f_MA(x).b_NameMehrfach = True
f_MA(y).b_NameMehrfach = True
End If
End If
Next
Next x
->Auswertung mehrfach
For x = 1 To f_MA_cnt
If f_MA(x).b_geoeffnet And f_MA(x).b_NameMehrfach Then
MsgBox ( _
Der Dateiname-> & f_MA(x).s_Name &-> ist mehrfach vorhanden. & vbLf & _
Eine Datei gleichen Namens ist geöffnet. & vbLf & _
Bitte schliessen Sie diese Datei und starten den Makro erneut.)
GoTo Aufraeumen
End If
Next x
->2.Auswertung mehrfach
For x = 1 To f_MA_cnt
For Each wb In Workbooks
If LCase(f_MA(x).s_Name) = LCase(wb.Name) And _
LCase(f_MA(x).s_FullName) <> LCase(wb.FullName) Then
MsgBox ( _
Der Dateiname-> & f_MA(x).s_Name &-> ist mehrfach vorhanden. & vbLf & _
Eine Datei gleichen Namens ist geöffnet. & vbLf & _
Bitte schliessen Sie diese Datei und starten den Makro erneut.)
GoTo Aufraeumen
End If
Next
Next x
MeineArbeitsmappen_Pruefen = True
Aufraeumen:
Set wb = Nothing
End Function
'***********************************************************
Private Function BlaetterInZielDateiSortieren(wbz As Workbook)
Dim wsz As Worksheet, ws As Worksheet, l_cnt As Long, x As Long
->Hilfs-Blatt zum sortieren der Blattnamen anlegen
Set wsz = wbz.Worksheets.Add
->Blattnamen in Spalte 1 des Hilfsblattes
l_cnt = 0
For Each ws In wbz.Worksheets
l_cnt = l_cnt + 1
wsz.Cells(l_cnt, 1).Value = ws.Name
Next
If l_cnt > 1 Then
->Blattnamen sortieren
wsz.Range(wsz.Cells(1, 1), wsz.Cells(l_cnt, 1)).Sort _
Key1:=wsz.Cells(1, 1), Order1:=xlAscending, _
Header:=xlNo
->Blätter entsprechend Sortierung sortieren
For x = l_cnt To 2 Step -1
wbz.Worksheets(wsz.Cells(x - 1, 1).Value).Move _
Before:=wbz.Worksheets(wsz.Cells(x, 1).Value)
Next
End If
->Hilfsblatt wieder löschen
Application.DisplayAlerts = False
wsz.Delete
Application.DisplayAlerts = True
Aufraeumen:
Set wsz = Nothing: Set ws = Nothing
End Function