Anzeige
Archiv - Navigation
1160to1164
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

Kopie der Tabelle in alle Mappen gleicher Ordner

Kopie der Tabelle in alle Mappen gleicher Ordner
Fritz_W
Hallo Forumsbesucher,
ich möchte aus der geöffneten Mappe das Tabellenblatt "Bewertung" in alle xlsx Dateien im gleichen Ordner kopieren. Die Kopie soll jeweils als letztes Tabellenblatt in jeder Zieldatei eingefügt werden.
Bin dankbar für eure Unterstützung
mfg
Fritz
Kopie eines Blatts in alle Mappen
13.06.2010 11:46:54
Erich
Hi Fritz,
mal ein Ansatz, ohne Optimierung und mit "Bildschirmflackern":

Sub KopieBlattInAlle()
Dim strFN As String
Application.EnableEvents = False
strFN = Dir(ThisWorkbook.Path & "\*.xlsx")
Do While strFN  ""
If strFN  ThisWorkbook.Name Then  ' nicht in eigene Mappe
Workbooks.Open ThisWorkbook.Path & "\" & strFN
If SheetEx("Bewertung") Then
MsgBox "In Mappe" & strFN & _
"gibt es bereits ein Blatt 'Bewertung'"
'              .Close False      ' evtl. Schließen ohne Speichern
Else
With ActiveWorkbook         ' Kopieren
ThisWorkbook.Sheets("Bewertung").Copy _
after:=.Sheets(.Sheets.Count)
.Close True              ' Speichern und Schließen
End With
End If
End If
strFN = Dir()
Loop
Application.EnableEvents = True
End Sub
Function SheetEx(strNam As String) As Boolean
On Error Resume Next
SheetEx = ActiveWorkbook.Sheets(strNam).Index > 0
End Function
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Kopie eines Blatts in alle Mappen
13.06.2010 12:06:50
Fritz_W
Hallo Erich,
besten Dank.
Funktioniert, allerdings würde ich gerne - nach Möglichkeit - die beim Kopiervorgang geöffneten Mappen ale speichern und wieder schließen.
Ist das ohne nennenswerten Aufwand noch einzubauen?
Gruß
Fritz
Schließen der Mappen
13.06.2010 12:22:49
Erich
Hi Fritz,
in der Zeile
' .Close False ' evtl. Schließen ohne Speichern
kannst du das Hochkomma ganz vorn löschen, dann werden auch die Mappen geschlossen,
in denen das Blatt bereits existiert. Speichern erübrigt sich - es wurde ja nichts geändert.
Die Mappen, in die das Blatt erfolgreich kopiert werden doch in der Zeile
.Close True ' Speichern und Schließen
gespeichert und geschlossen, oder?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Schließen der Mappen
13.06.2010 15:03:47
Fritz_W
Hallo Erich,
nachdem ich das Hochkomma gelöscht hatte, kam folgende Fehlermeldung:
Fehler beim Kompilieren
Unzulässiger oder nicht ausreichend definierter Verweis
Hab ich was übersehen oder was ist die Ursache?
Gruß
Fritz
Sorry, 'With' war falsch...
13.06.2010 18:52:01
Erich
Hi Fritz,
wenn ich das "Close False" selbst mal aktiviert hätte, hätt ichs auch gleich gemerkt...
Tut mir leid, hier eine neue Version, mit "With ..." ein paar Zeilen höher:

Sub KopieBlattInAlle()
Dim strFN As String
Application.EnableEvents = False
strFN = Dir(ThisWorkbook.Path & "\*.xls")
Do While strFN  ""
If strFN  ThisWorkbook.Name Then     ' nicht in eigene Mappe
Workbooks.Open ThisWorkbook.Path & "\" & strFN
With ActiveWorkbook
If SheetEx("Bewertung") Then
MsgBox "In Mappe" & strFN & _
"gibt es bereits ein Blatt 'Bewertung'"
.Close False      ' evtl. Schließen ohne Speichern
Else
ThisWorkbook.Sheets("Bewertung").Copy _
after:=.Sheets(.Sheets.Count)        ' Kopieren
.Close True              ' Speichern und Schließen
End If
End With
End If
strFN = Dir()
Loop
Application.EnableEvents = True
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Sorry, 'With' war falsch...
13.06.2010 20:00:57
Fritz_W
Hallo Erich,
das macht aber nun gar nichts, bei der immensen Arbeit die Du da für mich leistet, kann so was mal vorkommen. Ich bin unendlich dankbar, solch kompetente Hilfe zu erhalten und da bin ich bestimmt nicht der Einzige!!
Werds morgen testen, da jetzt Fußball ansteht!
Auch Dir wünsch ich noch einen schönen (Fußball-)Abend
Gruß
Fritz
@ErichG
14.06.2010 21:44:39
Fritz_W
Hallo Erich,
bei meinem Test erhielt ich eine Fehlermeldung (Laufzeitfehler 1004).
Verantwortlich hierfür ist wohl dieser Teil des Codes:
ThisWorkbook.Sheets("Bewertung").Copy _
after:=.Sheets(.Sheets.Count) ' Kopieren
Gruß
Fritz
Anzeige
Laufzeitfehler
14.06.2010 22:30:53
Erich
Hi Fritz,
gab es außer der Fehlernummer und der Codezeile weitere Info über den Fehler?
Meist gibt es auch eine Fehlerbeschreibung (Fehlertext), die manchmal sogar aufschlussreich ist.
Tritt der Fehler bei allen oder nur bei bestimmten Dateien auf?
Ein Grund könnte sein, dass die Zielmappe geschützt ist.
Was soll eigentlich passieren, wenn die Zielmappe schon ein Blatt "Bewertung" enthält?
Und was, wenn das Kopieren aus anderen Gründen fehlschlägt?
Die Routine muss wohl etwas fehlertoleranter geschrieben werden, wie das Tino schon getan hat.
Je weniger man weiß, welche Fehler so auftreten können, umso höher ist der Aufwand für das Abfangen der Fehlern.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Laufzeitfehler
15.06.2010 20:39:52
Fritz_W
Hallo Erich,
die genannte Fehlermeldung scheint tatsächlich aufzutreten, wenn sich Dateien im Ordner befinden, in denen Tabellenblätter geschützt wurden. Bei meinem heutigen Test - ohne Dateien mit geschützten Tabellen - trat diese Fehlermeldung nicht mehr auf.
Generell würde ich das Makro gerne häufiger verwenden, Tabellen die bereits ein Tabellenblatt mit der Bezeichnung "Bewertung" enthalten, befinden sich nicht in dem jeweiligen Ordner. Allerdings kann es schon vorkommen, dass die Dateien Tabellen mit Blattschutz enthalten.
In dem Fall muss ich dann wohl auf Dein Makro verzichten, da ich davon ausgehe, dass eine entsprechende Änderung des Codes zu zeitaufwändig wäre.
Beste Grüße und vielen Dank für Deine Arbeit für mich
Fritz
Anzeige
Routine fehlertoleranter
16.06.2010 08:27:44
Erich
Hi Fritz,
so könnte es durchlaufen:

Option Explicit
Dim arrErr(), lngErr As Long
Sub KopieBlattInAlle()
Dim aStrFN() As String, zz As Long, strFN As String
Dim myCalC As XlCalculation, blnDisp As Boolean
lngErr = 0                                  ' Dateiliste erzeugen
ReDim arrErr(1 To 5, 1 To 100)
ReDim aStrFN(1 To 100)
strFN = Dir(ThisWorkbook.Path & "\*.xls")
Do While strFN  ""
zz = zz + 1
If zz > UBound(aStrFN) Then _
ReDim Preserve aStrFN(1 To 2 * UBound(aStrFN))
aStrFN(zz) = strFN
strFN = Dir()
Loop
If zz = 0 Then Exit Sub
ReDim Preserve aStrFN(1 To zz)
With Application
.EnableEvents = False
myCalC = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
blnDisp = .DisplayStatusBar
.DisplayStatusBar = True
End With
For zz = 1 To UBound(aStrFN)
Application.StatusBar = zz & " von " & UBound(aStrFN)
If aStrFN(zz)  ThisWorkbook.Name Then   ' nicht eigene Mappe
On Error Resume Next
Workbooks.Open ThisWorkbook.Path & "\" & aStrFN(zz), _
0, False, , , , True
If Err.Number = 0 Then
On Error GoTo 0
With ActiveWorkbook
If SheetEx("Bewertung") Then
ErrListe "Hinw", "Blatt ex.", _
aStrFN(zz), 0, "Blatt 'Bewertung'"
.Close False            ' Schließen ohne Speichern
Else
On Error Resume Next
ThisWorkbook.Sheets("Bewertung").Copy _
after:=.Sheets(.Sheets.Count)        ' Kopieren
If Err.Number  0 Then _
ErrListe "Fehler", "Copy", _
aStrFN(zz), Err.Number, Err.Description
On Error Resume Next
.Save                                  ' Speichern
If Err.Number  0 Then _
ErrListe "Fehler", "Save", _
aStrFN(zz), Err.Number, Err.Description
.Close False                           ' Schließen
End If
End With
Else
ErrListe "Fehler", "Open", _
aStrFN(zz), Err.Number, Err.Description
On Error GoTo 0
End If
End If
Next zz
Application.StatusBar = False
If lngErr > 0 Then
ReDim Preserve arrErr(1 To 5, 1 To lngErr)
ThisWorkbook.Worksheets.Add
Cells(2, 1).Resize(UBound(arrErr, 2), UBound(arrErr)) = _
Application.Transpose(arrErr)
End If
With Application
.EnableEvents = True
.Calculation = myCalC
.ScreenUpdating = True
.DisplayStatusBar = blnDisp
End With
End Sub
Sub ErrListe(strArt As String, strBei As String, _
strFile As String, lngNum As Long, strDesc As String)
lngErr = lngErr + 1
If lngErr > UBound(arrErr, 2) Then _
ReDim Preserve arrErr(1 To 5, 1 To 2 * UBound(arrErr, 2))
arrErr(1, lngErr) = strArt
arrErr(2, lngErr) = strBei
arrErr(3, lngErr) = strFile
arrErr(4, lngErr) = lngNum
arrErr(5, lngErr) = strDesc
End Sub
Function SheetEx(strNam As String) As Boolean
On Error Resume Next
SheetEx = ActiveWorkbook.Sheets(strNam).Index > 0
End Function
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Routine fehlertoleranter
16.06.2010 15:38:58
Fritz_W
Hallo Erich,
vielen Dank, ich kann mich nur wiederholen, dass sich so eine umfassende, arbeitsintensive und kompetente Hilfe sehr schätze.
Ich habe das Makro in mehreren - unterschiedlichen - Situationen getestet und folgende Erfahrungen gemacht:
1. Das Makro ignoriert alle Dateien im Ordner, die keine xlsx Dateien sind (wie gewünscht).
2. Das Makro ignoriert auch alle xlsx Dateien im Ordner, die bereits ein Tabellenblatt mit der Bezeichnung
"Bewertung" enthalten (ebenfalls positiv).
3. Das Makro funktioniert (ohne Fehlermeldung) auch wenn eine Zieldatei geschützte Tabellen enthielt.
4. Das Makro funktionierte auch, wenn das zu kopierende Tabellenblatt Bewertung geschützt ist (prima!)
5. Nachteilig war, dass auch hier die Berechnungsopitonen aller Arbeitsmappen, in die das Tabellenblatt
Bewertung kopiert wurde von "automatisch" auf "manuell" geändert wird. Desgleichen wurde auch hier
die ursprünglich in der Tabelle verwendete Schriftart Calibri durch Arial ersetzt wurde.
Beide "Reaktionen" traten auch bei Tinos Code auf, in der zweiten Variante hat Tino die Geschichte mit
der Veränderung der Schriftart beseitigt, die Sache mit der Umstellung der Berechnungsoption leider
nicht.
Beste Grüße
Fritz
Anzeige
@Fritz und Tino
18.06.2010 19:47:11
Erich
Hi zusammen,
bei Fritz' Punkt 5 komme ich ins Grübeln.
Sicher wird Calculation auf manuell gestellt. Das dürfte sich aber auch die gespeicherten Mappen nicht auswirken.
Am Ende des Makros wird wieder auf automatisch (wenn vorher eingestellt) zurückgesetzt.
Das sollte nicht stören - vorausgesetzt, das Makro läuft bis zum Ende.
Wegen der Schriftart habe ich auch in Tinos Code gewühlt, aber nichts dazu gefunden.
Deshalb meine Frage an Tino: Hast du irgendwo etwas wegen der Schriftarten getan?
Ich wünsche euch ein schönes Wochenende!
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
@Erich
18.06.2010 20:00:14
Tino
Hallo,
nein an der Schrift habe ich nichts geändert, habe ich auch geschrieben.
das mit der Schrift kann ich bei mir nicht feststellen.
Die Berechnung bleibt auf manuell stehen,
wenn Du den Code nicht bis zum Schluss hast durchlaufen lassen.

Habe mich auch nicht mehr gemeldet weil ich mir einfach keinen Reim drauf machen kann.
Gruß Tino
AW: @Erich und Tino
19.06.2010 10:23:49
Fritz_W
Hallo,
auch von meiner Seite vielen Dank für Eure Rückmeldung.
1. Die Änderung der Schriftart, die Tino nicht nachvollziehen konnte, trat bei Tinos "letzter Version" (wie
bereits erwähnt) bei mir ebenfalls nicht mehr auf.
2. Zum Problem mit der Änderung der Berechnungsoptionen auf "manuell" ist mir eben eingefallen, dass
ich das Problem schon einmal - wie ich jetzt festgestellt habe vor ca. 15 Monaten - in einem anderen
Zusammenhang hatte und hier im Forum diesbezüglich um Hilfe bat. Ramses hatte mir damals tat-
sächlich auch helfen konnte. Dass ich mich daran erst jetzt erinnert habe, bedauere ich sehr.
Ich füge den entsprechenden Link bei. Ich gehe davon aus, dass dies für euch beide vielleicht weitere
Rückschlüsse erlaubt und bitte nochmals um Entschuldigung, dass ich mich erst jetzt daran erinnert
habe.
Vielen Dank und beste Grüße
Fritz
https://www.herber.de/forum/archiv/1144to1148/t1144416.htm
@Fritz, kann nicht helfen.
19.06.2010 11:39:39
Tino
Hallo,
ich kann dies bei mir nicht feststellen unter xl2007, bei meinem Beispiel.
Vielleicht hat Erich eine Idee.
Gruß Tino
AW: @Tino
19.06.2010 12:54:34
Fritz_W
Hallo Tino,
nochmals Dank für Deine Hilfe in dieser Angelegenheit.
Gruß
Fritz
meinst Du in etwa so?
13.06.2010 11:47:22
Tino
Hallo,
kannst ja mal testen.
kommt als Code in Modul1
Option Explicit 
 
Sub Suchmaschine() 
Dim FileArray() As String, strPath As String 
Dim LCount As Long 
Dim iCalc As Integer, oldStatusBar As Integer 
Dim strFehler$ 
 
strPath = ThisWorkbook.Path 
  
With Application 
    oldStatusBar = .DisplayScrollBars 
    iCalc = .Calculation 
    .ScreenUpdating = False 
    .EnableEvents = False 
    .Calculation = xlCalculationManual 
    .StatusBar = "Daten werden übertragen, bitte warten..." 
 
    '1.Parameter Area 
    '2.Parameter Ordner, wo soll gesucht werden? 
    '3.Parameter Datei,* als Platzhalter verwenden,Optional leer ist alle 
    '4.Parameter mit Unterordner = True, Optional False ist ohne 
    '5.Parameter Zähler 
    Suchmaschiene FileArray, strPath, "*.xlsx", False, LCount 
  
  
    If LCount > 0 Then 
        For LCount = Lbound(FileArray) To Ubound(FileArray) 
          If FileArray(LCount) <> ThisWorkbook.FullName Then 
            If Not Load_Tab_In_WB(Tabelle1, FileArray(LCount)) Then 
              strFehler$ = _
              Right$(FileArray(LCount), Len(FileArray(LCount)) - InStrRev(FileArray(LCount), "\")) & vbCr 
            End If 
          End If 
        Next LCount 
    End If 
     
     
    .Calculation = iCalc 
    .DisplayStatusBar = oldStatusBar 
    .StatusBar = False 
    .ScreenUpdating = True 
    .EnableEvents = True 
End With 'Application 
 
If strFehler$ <> "" Then 
    MsgBox "Es sind Fehler aufgetreten in" & vbCr & vbCr & strFehler, vbExclamation 
Else 
    If LCount > 0 Then 
        MsgBox "Daten wurden fehlerfrei übertragen", vbInformation 
    Else 
        MsgBox "Keine Dateien gefunden!", vbExclamation 
    End If 
End If 
 
Erase FileArray 
End Sub 
 
 
 
kommt als Code in Modul2
Option Explicit 
 
Sub Suchmaschiene(FileArray, SourceFolderName As String, Optional DateiFormat As String = "*.*", _
                        Optional IncludeSubfolders As Boolean = False, Optional LCount As Long = 0) 
  
Dim FSO As Object, SourceFolder As Object, SubFolder As Object 
Dim FileItem 
Dim Status As Integer 
   
 Set FSO = CreateObject("Scripting.FileSystemObject") 
   
 If FSO.FolderExists(SourceFolderName) Then 
     Set SourceFolder = FSO.GetFolder(SourceFolderName) 
              
        On Error GoTo Err_Zugriff: 'sollte Ordner geschützt sein 
           
        For Each FileItem In SourceFolder.Files 
            If LCase(FileItem) Like LCase(DateiFormat) Then 
             Redim Preserve FileArray(LCount) 
             FileArray(LCount) = FileItem 
             LCount = LCount + 1 
            End If 
        Next FileItem 
      
      
        If IncludeSubfolders Then 
            For Each SubFolder In SourceFolder.SubFolders 
                Suchmaschiene FileArray, SubFolder.Path, DateiFormat, IncludeSubfolders, LCount 
            Next SubFolder 
        End If 
 Else 
       MsgBox "Ordner nicht gefunden!", vbCritical 
 End If 
  
Err_Zugriff: 
Set FileItem = Nothing: Set SourceFolder = Nothing: Set FSO = Nothing 
End Sub 
 
kommt als Code in Modul3
Option Explicit 
 
Function Load_Tab_In_WB(oSH As Worksheet, strFile As String) As Boolean 
Dim oWB As Workbook 
On Error GoTo ErrorExit: 
 
Set oWB = Workbooks.Open(strFile) 
 
With oWB 
    oSH.Copy After:=.Sheets(.Sheets.Count) 
    .Close True 
End With 
 
Load_Tab_In_WB = True 
Exit Function 
 
ErrorExit: 
On Error Resume Next 
oWB.Close False 
End Function 
Gruß Tino
Korrektur...
13.06.2010 11:49:58
Tino
Hallo,
da sehe ich noch einen Fehler.
Mach aus oldStatusBar = .DisplayScrollBars dies oldStatusBar = .DisplayStatusBar
Gruß Tino
AW: Korrektur...
13.06.2010 12:18:37
Fritz_W
Hallo Tino,
freue mich sehr über Deine Hilfe.
Kommen noch Fehlermeldungen, kann es aber erst später genauer überprüfen, da ich dringend weg
muss. Melde mich später nocheinmal.
Vielen herzlichen Dank einstweilen.
mfg
Fritz
AW: hier meine Test Dateien als zip
13.06.2010 15:06:26
Fritz_W
Hallo Tino,
funktioniert perfekt! Ihr seid alle super hier!
Danke Dir für die großartige Hilfe und Deine viele Arbeit
Gruß
Fritz
@Tino - ungewöhnliches Kopierverhalten
13.06.2010 17:02:58
Fritz_W
Hallo Tino,
eben sind mir noch zwei Veränderungen aufgefallen, die als Folge des Kopiervorgangs eingetreten sind und für die ich keine Erklärung habe:
1. die Schriftart Calibri wurde nach dem Einfügen durch Arial ersetzt
2. die Berechnungsoptionen wurden von Automatisch auf Manuell geändert.
Hast Du hierfür eine Erklärung bzw. ließe sich das (ohne nennenswerten Aufwand) ändern?
Ansonsten läuft das absolut perfekt!
Gruß
Fritz
AW: @Tino - ungewöhnliches Kopierverhalten
13.06.2010 17:48:50
Tino
Hallo,
das mit der Schrift kann ich bei mir nicht feststellen.
Die Berechnung bleibt auf manuell stehen,
wenn Du den Code nicht bis zum Schluss hast durchlaufen lassen.
Gruß Tino
AW: @Tino - ungewöhnliches Kopierverhalten
13.06.2010 18:22:35
Fritz_W
Hallo Tino,
danke für die Info.
Zu der Änderung hinsichtlich der Berechnungsoptionen kann ich das nicht ganz nachvollziehen, denn bei mir erschien die Meldung " ... erfolgreich kopiert ...
Ich habe allerdings die Ursprungsdatei nicht abgespeichert, aber das kann wohl nicht der Grund sein oder?
Gruß
Fritz
AW: @Tino - ungewöhnliches Kopierverhalten
13.06.2010 18:49:07
Tino
Hallo,
hier wird die aktuelle Einstellung in einer Variablen gespeichert
iCalc = .Calculation
hier wird die Berechnung auf Manuell gestellt.
.Calculation = xlCalculationManual
Und hier wird die Ursprüngliche Einstellung wieder gesetzt.
.Calculation = iCalc
Habe noch was umgestellt.
https://www.herber.de/bbs/user/70035.xls
Gruß Tino
AW: @Tino - ungewöhnliches Kopierverhalten
13.06.2010 19:43:08
Fritz_W
Hallo Tino,
vielen Dank für Deine Mühe, werds morgen testen, da gleich Fußball.
Geb ggf. weitere Rückmeldung
Gruß
Fritz
AW: @Tino - ungewöhnliches Kopierverhalten
14.06.2010 20:52:17
Fritz_W
Hallo Tino,
nunmehr habe ich keine Veränderungen hinsichtlich der Formatierung (Schriftart) feststellen können.
Das war mir wichtig! Super und besten Dank.
Die Änderung hinsichtlich der Berechnungsoption auf "manuell" besteht weiterhin.
Damit muß ich wohl leben. Ist das möglich, das das bei xls Dateien nicht der Fall ist?
Gruß
Fritz

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige