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

Tabellen in neue Datei kopieren

Tabellen in neue Datei kopieren
26.03.2007 18:23:17
Fritz_W
Hallo Forumsbesucher,
ich wende mich an die VBA-Experten in diesem Forum und bitte diese um Unterstützung in folgender Angelegenheit.
Ich möchte aus einer Datei bestimmte Tabellen, deren Tabellenname in dieser Datei in der Tabelle "Daten" im Bereich A2:A51 aufgeführt sind (bzw. sein könnten) in eine Ergänzungsdatei (Datei mit dem Namen der Quelldatei und dem Zusatz "-E" kopieren.
Zur Verdeutlichung habe ich diese Angaben in der beigefügten Datei in der Tabelle "Daten" etwas konkretisiert.
Vielen Dank für jede Form von Hilfe.
mfg
Fritz
https://www.herber.de/bbs/user/41403.xls

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabellen in neue Datei kopieren
26.03.2007 20:57:00
fcs
Hallo Fritz,
etwas Gehirnjogging am Abend kann nicht schaden, da ich ich mich mal an deine Aufgabenstellung gemacht.
Den Code im VBA-Editor in ein Modul kopieren.
Der Code löscht nach dem kopieren den kompletten Code in den Blättern der Sicherungskopie!
Gruß
Franz
Sub Sicherung()
'Kopieren der Blätter in der Liste im Blatt Daten in eine Sicherungsdatei
Dim wbZiel As Workbook, strZiel As String, wksZiel As Worksheet
Dim wbQuelle As Workbook, wksQuelle As Worksheet
Dim wksDaten As Worksheet, rngBlatt As Range, rngGesichert As Range
Dim boNeu As Boolean, i As Long
Set wbQuelle = ThisWorkbook
Set wksDaten = wbQuelle.Worksheets("Daten")
Set rngBlatt = wksDaten.Range("A2:A51")
Set rngGesichert = wksDaten.Range("N2:N51")
'Verzeichnis und Dateiname für Sicherrung ermitteln
If UCase(wksDaten.Range("M1")) = "X" Then
strZiel = wksDaten.Range("N1") & "\" _
& Left(wbQuelle.Name, Len(wbQuelle.Name) - 4) & "-E.xls"
Else
strZiel = wbQuelle.Path & "\" _
& Left(wbQuelle.Name, Len(wbQuelle.Name) - 4) & "-E.xls"
End If
'Prüfen, on die Sicherungsdatei schon existiert
If Dir(strZiel)  "" Then
'Sicherungsdatei öffnen
Set wbZiel = Workbooks.Open(FileName:=strZiel)
Else
'neue Datei mit einem Blatt anlegen und Datei speichern
Set wbZiel = Workbooks.Add(Template:=xlWBATWorksheet)
boNeu = True
wbZiel.SaveAs FileName:=strZiel
End If
'Blätter in Liste in Sicherungsdatei kopieren
For i = 1 To rngBlatt.Rows.Count
If rngBlatt(i, 1)  "" And Not UCase(rngGesichert(i, 1)) = "X" Then
'püfen ob Blatt in Quelle vorhanden
For Each wksQuelle In wbQuelle.Worksheets
If wksQuelle.Name = rngBlatt(i, 1) Then
Exit For
End If
Next
If wksQuelle Is Nothing Then
MsgBox "Das Blatt mit dem Namen " & rngBlatt(i, 1) & " existiert nicht!"
Else
'püfen ob Blatt in Zieldatei vorhanden
For Each wksZiel In wbZiel.Worksheets
If wksZiel.Name = rngBlatt(i, 1) Then
Exit For
End If
Next
If wksZiel Is Nothing Then
' Blatt kopieren und Sicherung in Spalte N markieren
wksQuelle.Copy After:=wbZiel.Sheets(wbZiel.Sheets.Count)
rngGesichert(i, 1) = "X"
Else
If MsgBox("Das Blatt " & rngBlatt(i, 1) & " existiert in der Zieldatei bereits!" _
& vbLf & vbLf & "Soll das Blatt in der Zieldatei ersetzt werden?", _
vbYesNo + vbQuestion, "Blatt-Sicherung") = vbYes Then
Application.DisplayAlerts = False
wksZiel.Delete 'vorhandenne Blatt löschen
Application.DisplayAlerts = True
' Blatt kopieren
wksQuelle.Copy After:=wbZiel.Sheets(wbZiel.Sheets.Count)
End If
rngGesichert(i, 1) = "X"
End If
End If
End If
Next
If boNeu = True And wbZiel.Sheets.Count > 1 Then
'Leeres 1. Blatt in der neuerstellten Zieldatei löschen
Application.DisplayAlerts = False
wbZiel.Sheets(1).Delete
Application.DisplayAlerts = True
End If
Call Loesche_Ereignisprozeduren(wbZiel) ' Löscht gesamten Code in den Tabellen
wbZiel.Save
wbQuelle.Activate
End Sub
Sub Loesche_Ereignisprozeduren(wb As Workbook)
'Löscht Ereignisprozeduren im Workbook:
For n = wb.VBProject.vbComponents.Count To 1 Step -1
For i = 1 To wb.VBProject.vbComponents(n).CodeModule.CountOfLines
If wb.VBProject.vbComponents(n).Type  1 _
And wb.VBProject.vbComponents(n).Type  3 Then _
wb.VBProject.vbComponents(n).CodeModule.DeleteLines 1
Next
Next
End Sub

Anzeige
AW: Tabellen in neue Datei kopieren
26.03.2007 21:31:49
Fritz_W
Hallo Franz,
da krieg ich doch ein schlechtes Gewissen, wenn sich gleich zwei so Könner so viel Arbeit auf sich nehmen.
Aber irgendwie freut man sich halt auch sehr über diese (großzügige) Unterstützung hier in diesem Forum.
Habe dein Makro getetestet, funktioniert nicht in allen Teilen wie ich das wollte. Vielleicht hast Du auch mein Anliegen nicht ganz nachvollziehen können. War auch nicht so einfach, ich weiß das.
Da Sepps Makro genau das tut, was ich wollte, möchte ich Dir keine zusätzliche Arbeit mehr abverlangen.
Aber andererseits freu ich mich wie gesagt über jede Hilfe - zumal bei solch umfangreichen Anliegen.
(Nur) wenn Du willst würde ich mir das ganze morgen noch einmal genauer anschauen und mich dann noch einmal melden. Werde mir auf jeden Fall die Codes von beiden etwas näher anschauen, aber da hab ich noch (viel!!) zu lernen.
An dieser Stelle nochmals vielen Dank für deine Mühe!
Gruß
Fritz
Anzeige
AW: Tabellen in neue Datei kopieren
27.03.2007 16:42:00
Fritz_W
Hallo Franz,
ich melde mich heute noch einmal bei Dir.
Alle, die mir in diesem Forum immer wieder Hilfe anbieten, sollen wissen, dass ich solch qualifizierte und arbeitsintensive Hilfe nicht als Selbstverständlichkeit betrachte, sondern euch allen dankbar bin und das auch zum Ausdruck bringen möchte.
Obwohl ich mit Sepps Code natürlich schon eine perfekt - auf meine Wünsche abgestimmte - Lösung vorliegen habe, habe ich heute noch einmal Deinen Code etwas ausführlicher getestet und ihn mir auch angeschaut (muss ich noch hinzufügen), obwohl ich von VBA nicht allzu viel verstehe. Du hast den Code so mustergültig kommentiert, so dass ich hoffe, daraus in Sachen VBA etwas lernen zu können.
Allein deshalb interessiert mich, warum das Ganze nicht funktioniert.
Irgendwie muss es meiner Ansicht nach daran liegen, dass er die Tabelle, die in die neue Datei - als Kopie - eingefügt werden, nicht mit dem korrekten Namen bezeichnet wird. Es wird denn auch nur eine Tabelle (mit der Bezeichnung "Tabelle1") in die "-E"-Datei eingefügt.
Ansonsten noch einmal vielen Dank für die Mühe.
Gruß
Fritz
Anzeige
AW: Tabellen in neue Datei kopieren
27.03.2007 18:14:00
fcs
Halo Fritz,
nachvollziehen kann ich den Fehler nicht, denn bei mir funktioniert es mit deiner Datei einwandfrei.
Einziges Problem:
Wenn das in der Zelle N1 der Tabelle "Daten" angegeben Verzeichnis für die Sicherung nicht existiert bricht das Makro beim Speichern mit einem Fehler ab. Dann ist eine Leere Arbeitsmappe mit einer Tabelle angelegt ohne das die Blätter kopiert wurden.
Ich habe in das Makro keine Prüfung für das Verzeichnis eingebaut.
Gruß
Franz
AW: Tabellen in neue Datei kopieren
27.03.2007 19:16:00
Fritz_W
Hallo Franz,
aufgrund deiner letzten Nachricht, habe ich noch einmal getestet und folgendes festgestellt.
Ich habe gestern eine Änderung vorgenommen, nachdem zunächst eine Fehlermeldung kam.
Deshalb jetzt von mir - die falsche Feststellung - es würden nicht alle Dateien kopiert.
Nun hab ich mir die Ursache der Fehlermeldung angeschaut und bin zu folgender Erkenntnis gelangt.
Vermutlich funktioniert alles problemlos, wenn eine bestimmte - gerade in meinen Tabellen vorhandene - Voraussetzung nicht erfüllt ist. Es darf im jeweiligen Code der zu kopierenden Tabellen kein "Worksheet activate" vorhanden sein, zumal wenn darin eine weitere Prozedur aufgerufen wird.
Bei mir ist nämlich genau das der Fall und beim Aktivieren der (zu kopiererenden) Tabellen wird eine Prozedur der Quelldatei aufgerufen, so dass das Makro Probleme verursacht, weil dein Code wohl vor dem Löschen des Ereignismakros wohl die Tabelle aktiviert wird und die dann fehlende Prozedur die Fehlermeldung verursacht.
Lieg ich mit meiner Vermutung richtig?
Nochmals Dank für alles.
Gruß
Fritz
Anzeige
AW: Tabellen in neue Datei kopieren
27.03.2007 20:09:41
fcs
Hallo Fritz,
schon möglich, dass es durch die Ausführung von anderen Ereignismakros zu Konflikten bei der Ausführung kommt. Dann müßte zu Beginn der Prozedur per Befehl

Application.EnableEvents=False

das Ausführen von Ereignismakros deaktiviert und am Ende der Prozedur per

Application.EnableEvents=True

wieder aktiviert werden.
Da du in den kopierten Tabellen noch Zellbereiche entleeren willst und Formeln durch Werte ersetzen willst, müsste mein Code an den entsprechenden Stellen eh noch angepasst werden.
Gruß
Franz
Anzeige
AW: Tabellen in neue Datei kopieren
27.03.2007 20:18:00
Fritz_W
Hallo Franz,
vielen Dank für Deine Infos.
Gruß
Fritz
AW: Tabellen in neue Datei kopieren
27.03.2007 21:36:00
Fritz_W
Hallo Franz,
jetzt funktioniert dein Code auch in meiner Tabelle!
Gruß
Fritz
AW: Tabellen in neue Datei kopieren
26.03.2007 21:02:23
Josef
Hallo fritz,
hier meine Lösung.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" ( _
    ByVal pszPath As String) As Long

Sub CopySheets()
Dim strPath As String, strFile As String, strSheets As String
Dim objWB As Workbook, objWS As Worksheet
Dim rng As Range
Dim vSh() As Variant
Dim intIndex As Integer
Dim result As Long

On Error GoTo ErrExit
GMS

If Sheets("Daten").Range("M1") = "x" Then
    strPath = Sheets("Daten").Range("N1")
Else
    strPath = ThisWorkbook.Path
End If

If Right(strPath, 1) <> "\" Then strPath = strPath & "\"

result = PathFileExists(strPath)

If result <> 1 Then
    MsgBox "Verzeichnis in N1 existiert nicht!", vbExclamation, "Hinweis"
    GoTo ErrExit
End If

strFile = ThisWorkbook.Name
strFile = Left(strFile, Len(strFile) - 4) & "-E" & Right(strFile, 4)

For Each rng In Sheets("Daten").Range("A2:A" & Sheets("Daten").Cells(Rows.Count, 1).End(xlUp).Row)
    If rng.Offset(0, 13) <> "x" Then
        If SheetExist(rng.Text) Then
            If objWB Is Nothing Then
                ThisWorkbook.Sheets(rng.Text).Copy
                Set objWB = ActiveWorkbook
            Else
                ThisWorkbook.Sheets(rng.Text).Copy after:=objWB.Sheets(objWB.Sheets.Count)
            End If
            rng.Offset(0, 13) = "x"
        End If
    End If
Next

If Not objWB Is Nothing Then
    For Each objWS In objWB.Worksheets
        objWS.UsedRange = objWS.UsedRange.Value
        With objWB.VBProject.VBComponents(objWS.CodeName).CodeModule
            .DeleteLines 1, .CountOfLines
        End With
    Next
    
    objWB.SaveAs strPath & strFile
    objWB.Close
End If

ErrExit:
If Err.Number <> 0 Then
    MsgBox Err.Number & vbLf & Err.Description, vbInformation, "Fehler"
    Err.Clear
End If

GMS True

Set objWB = Nothing
Set objWS = Nothing

End Sub


Private Function SheetExist(ByVal sheetName As String, Optional WbName As String) As Boolean
Dim wks As Worksheet
On Error GoTo ERRORHANDLER
If WbName = "" Then WbName = ThisWorkbook.Name
For Each wks In Workbooks(WbName).Worksheets
    If wks.Name = sheetName Then SheetExist = True: Exit Function
Next
ERRORHANDLER:
SheetExist = False
End Function

Sub GMS(Optional ByVal Modus As Boolean = False)

With Application
    .ScreenUpdating = Modus
    .EnableEvents = Modus
    .DisplayAlerts = Modus
    .EnableCancelKey = IIf(Modus, 1, 0)
    .Calculation = IIf(Modus, -4105, -4135)
    .Cursor = IIf(Modus, -4143, 2)
End With

End Sub

Gruß Sepp
Anzeige
AW: Tabellen in neue Datei kopieren
26.03.2007 21:23:00
Fritz_W
Hallo Sepp,
mustergültig! Du bist ein Meister deines Fachs!
Vielen Dank!
Gruß
Fritz
@ Sepp
27.03.2007 16:50:10
Fritz_W
Hallo Sepp,
um jegliches Missverständnis auszuräumen, vorweg nur: Dein Code leistet genau, das, was ich eigentlich wollte. Dennoch würden mich noch zwei Alternativen interessieren:
1. In den kopierten Tabellen sollten in der Kopie in jeder Tabelle der Zellinhalt eines bestimmten Bereichs
(z.B. A3:A10) "geleert" ("") werden.
2. In den kopierten Tabellen sollten Formeln - sollten sie auf die Quelldatei Bezug nehmen - in Werte
"umgewandelt" werden.
Würde mich freuen, wenn Du mir bezüglich dieser Fragen noch helfen könntest.
Gruß
Fritz
Anzeige
AW: @ Sepp
27.03.2007 21:28:05
Josef
Hallo Fritz,
zu Punkt 1: Hab' ich eingebaut.
Zu Punkt 2: Das macht mein Code doch schon!
Hier der Code mit ein paar Kommentaren.
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" ( _
    ByVal pszPath As String) As Long

Sub CopySheets()
Dim strPath As String, strFile As String, strSheets As String
Dim objWB As Workbook, objWS As Worksheet
Dim rng As Range
Dim vSh() As Variant
Dim intIndex As Integer
Dim result As Long

On Error GoTo ErrExit
GMS

' Speicherpfad ermitteln
If Sheets("Daten").Range("M1") = "x" Then
    strPath = Sheets("Daten").Range("N1")
Else
    strPath = ThisWorkbook.Path
End If

If Right(strPath, 1) <> "\" Then strPath = strPath & "\"

' Prüfen ob Speicherpfad existiert
result = PathFileExists(strPath)

If result <> 1 Then
    MsgBox "Verzeichnis in N1 existiert nicht!", vbExclamation, "Hinweis"
    GoTo ErrExit
End If

' Dateinamen ermitteln
strFile = ThisWorkbook.Name

' Neuen Dateinamen erstellen
strFile = Left(strFile, Len(strFile) - 4) & "-E" & Right(strFile, 4)

' Einträge in "Daten" Bereich "A2:Ax" durchlaufen
For Each rng In Sheets("Daten").Range("A2:A" & Sheets("Daten").Cells(Rows.Count, 1).End(xlUp).Row)
    If rng.Offset(0, 13) <> "x" Then ' wenn kein "x" in Spalte "M"
        If SheetExist(rng.Text) Then ' prüfen ob Tabelle laut Zelleintrag vorhanden
            If objWB Is Nothing Then
                ThisWorkbook.Sheets(rng.Text).Copy ' Erste Tabelle kopieren
                Set objWB = ActiveWorkbook
            Else
                ThisWorkbook.Sheets(rng.Text).Copy after:=objWB.Sheets(objWB.Sheets.Count) ' Weitere Tabellen kopieren
            End If
            rng.Offset(0, 13) = "x" ' "x" in Spalte "M" setzen
        End If
    End If
Next

If Not objWB Is Nothing Then
    For Each objWS In objWB.Worksheets ' Tabellen in nuer Datei durchlaufen
        With objWS
            .UsedRange = .UsedRange.Value ' Formeln in Werte umwandeln
            .Range("A3:A10").ClearContents ' Bereich "A3:A10" leeren
            With objWB.VBProject.VBComponents(.CodeName).CodeModule
                .DeleteLines 1, .CountOfLines ' Code im Tabellenmodul entfernen
            End With
        End With
    Next
    
    objWB.SaveAs strPath & strFile ' Datei speichern
    objWB.Close ' Datei schliessen
End If

ErrExit:
If Err.Number <> 0 Then
    MsgBox Err.Number & vbLf & Err.Description, vbInformation, "Fehler"
    Err.Clear
End If

GMS True

Set objWB = Nothing
Set objWS = Nothing

End Sub


Private Function SheetExist(ByVal sheetName As String, Optional WbName As String) As Boolean
Dim wks As Worksheet
On Error GoTo ERRORHANDLER
If WbName = "" Then WbName = ThisWorkbook.Name
For Each wks In Workbooks(WbName).Worksheets
    If wks.Name = sheetName Then SheetExist = True: Exit Function
Next
ERRORHANDLER:
SheetExist = False
End Function

Sub GMS(Optional ByVal Modus As Boolean = False)

With Application
    .ScreenUpdating = Modus
    .EnableEvents = Modus
    .DisplayAlerts = Modus
    .EnableCancelKey = IIf(Modus, 1, 0)
    .Calculation = IIf(Modus, -4105, -4135)
    .Cursor = IIf(Modus, -4143, 2)
End With

End Sub

Gruß Sepp
Anzeige

308 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige