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

Blatt kopieren - knifflig

Blatt kopieren - knifflig
08.04.2008 00:28:59
Dirk
Hallo an alle,
ich bin anscheinend auf der Suche nach der "eierlegenden Wollmilchsau" u. im Archiv leider nicht so recht fündig geworden... :-((
Zwecks Archivierung möchte ich ein Tabellenblatt in eine andere, bestehende Datei kopieren (mittels CommandButton).
Besonderheiten sind allerdings:
1. Die Zieldatei liegt in einem anderen Verzeichnis.
2. Es soll NUR das Blatt (als eine Art Sreenshot), also NUR seine Werte u. Formatierungen kopiert werden, OHNE den dahinterliegenden VBA-Code u. OHNE irgendwelche Verknüpfungen, Formeln, Kommentare oder Bereichsnamen.
3. Die Kopie soll jeweils an das Ende der Zieldatei gestellt werden, wobei eine Abfrage erfolgen müsste, unter welchem Registernamen sie dort angelegt werden soll. (s. evtl 2. Code)
4. Die Zieldatei muss ggf. vorher automatisch geöffnet werden.
Folgende 2 Anregungen habe ich bereits im Archiv gefunden - vielleicht helfen sie Euch weiter:
CODE 1

Sub Belegkopie_erstellen()
Dim myFileName As String, mySavePfad As String
'Hier bitte anpassen
mySavePfad = "D:\Datenbank\Sicherheitskopien\" 'Mit Backslash am Schluss !!!
myFileName = Range("L12").Text
Application.DisplayAlerts = False
Application.ScreenUpdating = False
ActiveSheet.Copy
Cells.Select
Cells.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(1, 1).Select
ActiveWorkbook.SaveAs Filename:=mySavePfad & myFileName
Workbooks(myFileName & ".xls").Close
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub


CODE 2


Sub NeuesTabBlatt()
Dim NewName As String
ActiveSheet.Copy Before:=ActiveSheet
NewName = InputBox("Geben Sie einen Tabellenblattnamen ein")
ActiveSheet.Name = NewName
End Sub


Bitte entschuldigt die Vielzahl der besonderen Anforderungen.
Damit möchte ich keinesfalls gegen die Forumsregeln verstossen.
Ich wollte damit nur das Gesamtziel darstellen u. freue mich natürlich auch über Teillösungen...
MfG Dirk N.

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Blatt kopieren - knifflig
08.04.2008 08:09:00
Wuxinese
Hallo Dirk,
das is gar nicht so schwer. Wenn ich alles richtig verstanden habe, sollte das, was Du willst, mit folgendem Code (natuerlich abgeaendert) funktionieren:

Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Dim ns, wb2, sh1, nsname
Set sh1 = ActiveWorkbook.ActiveSheet
Set wb2 = Workbooks.Open(ThisWorkbook.Path & "\zieldatei.xls")
Set ns = wb2.Sheets.Add(, Sheets(wb2.Sheets.Count))
nsname = InputBox("Neues Arbeitsblatt in der Zieldatei benennen!", "ABL benennen")
If nsname = "" Then nsname = "FUP"
For d = 1 To wb2.Sheets.Count
If wb2.Sheets(d).Name = nsname Then nsname = "ABL " & Day(Date) & "." & _
Month(Date) & "." & Year(Date) & " " & Hour(Time) & "-" & _
Minute(Time) & "-" & Second(Time) & " Uhr"
Next d
ns.Name = nsname
sh1.UsedRange.Copy
ns.Range("a1").PasteSpecial (xlPasteFormats)
ns.Range("a1").PasteSpecial (xlPasteColumnWidths)
ns.Range("a1").PasteSpecial (xlPasteValuesAndNumberFormats)
wb2.Save
wb2.Close
Application.ScreenUpdating = True
Set ns = Nothing
Set wb2 = Nothing
Set sh1 = Nothing
End Sub


Gruss
Rainer

Anzeige
AW: Blatt kopieren - knifflig
08.04.2008 08:09:00
Gerd
Hallo Dirk,
als Ansatz.

Sub Fruehsport()
With ThisWorkbook
.Sheets.Add After:=.Sheets(Sheets.Count)
.Worksheets("Tabelle1").UsedRange.Copy
.Sheets(.Sheets.Count).Cells(1, 1).PasteSpecial (xlPasteValues)
.Sheets(.Sheets.Count).Cells(1, 1).PasteSpecial (xlPasteFormats)
ActiveSheet.Name = InputBox("Name")
Workbooks.Open ("C:\Eigene Dateien\ttt.xls")
.Sheets(.Sheets.Count).Move After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
End With
End Sub


Gruß Gerd

AW: Blatt kopieren - knifflig
08.04.2008 19:00:04
Dirk
Hallo Rainer, hallo Gerd,
vielen Dank für eure Hilfe.
Habt ihr eigentlich einen "telepathischen Draht" zueineinander - wegen der fast sekundengenauen Antworten? ;-))
Schon der Vorschlag von Rainer ist ein Volltreffer u. (fast) perfekt - echt super !
"(fast)" nur deshalb, weil meine Fragestellung dahingehend evtl. nicht vollständig war bzw. beim Testen einige Kleinigkeiten "störten":
1. Es kann auch sein, daß die Zieldatei bereits offen ist. Wie lässt sich dann die Fehlermeldung umgehen ?
2. Klickt man in der InputBox auf Abbrechen, sollte der Code beendet werden - also OHNE eine Kopie zu erstellen.
3. Eher nebensächlich: Zwar werden sämtliche Formate u. Spaltenbreiten richtig übertragen, allerdings nicht die korrekte ZEILEN-Höhe.
Es wäre super, wenn sich auch diese Kleinigkeiten noch ändern ließen u. ich bedanke mich schon im Voraus für eure Bemühungen...
MfG Dirk

Anzeige
AW: Blatt kopieren - knifflig
08.04.2008 22:58:02
Dirk
"offen" vergessen
Obwohl die Ausgangsfragen von Rainer schon (fast) perfekt beantwortet wurden, so möchte ich doch im Ursprungsthread bleiben - sorry an Rainer...
Aber vllt. kann so auch noch ein anderer User auf die Problematik aufmerksam gemacht werden - bevor der Thread ins Archiv "verschoben" u. evtl. aus dem Zusammenhang gerissen wird ?
Dirk

AW: Blatt kopieren - knifflig
09.04.2008 00:09:00
Dirk
Hallo "da",
eine echt seltene (vllt. auch blöde) Antwort - da meine Frage echt nur für den Privatgebrauch bestimmt ist...
Aber du wirst schon wissen, warum du dich "verstecken" mußt - hätte ich bei diesem unqualifizierten Einwurf auch getan... :-)))
Du solltest lieber da bleiben, wo du herkommst - frdl. gesagt: in der Versenkung verschwinden...
Da du nix von den Forumsregeln hältst verabschiede ich mich auch ohne jeglichen Gruß an dich...

Anzeige
AW: Blatt kopieren - knifflig
10.04.2008 04:04:00
Wuxinese
Hallo Dirk,
ich hab den Code mal etwas erweitert. Bei mir funktioniert jetzt auch alles so, wie Du es beschrieben hast. Bei Inputbox abbrechen oder Schliessen wird nix kopiert. Wenn die Zieldatei schon offen ist, wird sie so wie sie ist, abgespeichert, geschlossen und wieder geoeffnet. Das stellt sicher, dass sie in dem gegenwaertigen Zustand bleibt und keine zuvor gemachten Aenderungen verloren gehen. Wichtig ist, dass Du in der Zeile, in der es heisst 'if openworkbook.name = usw. ' den Zieldateinamen GENAU (incl. Gross-/Kleinschreibung) eingibst. War zumindest bei mir kurz ein Fehler.
Das mit der Zeilenhoehe hab ich auch eingebaut, sollte jetzt eigentlich auch passen.
Gruss
Rainer

Application.ScreenUpdating = False
Dim ns, wb2, sh1, nsname, wbopen
Set sh1 = ActiveWorkbook.ActiveSheet
Dim openworkbook As Workbook
wbopen = False
For Each openworkbook In Workbooks
If openworkbook.Name = "Zieldatei.xls" And openworkbook.Path = ActiveWorkbook.Path Then
wbopen = True
openworkbook.Save
openworkbook.Close
Exit For
End If
Next
Set wb2 = Workbooks.Open(ThisWorkbook.Path & "\zieldatei.xls")
nsname = InputBox("Neues Arbeitsblatt in der Zieldatei benennen!", "ABL benennen")
If nsname = "" Then GoTo Abbruch
For d = 1 To wb2.Sheets.Count
If wb2.Sheets(d).Name = nsname Then nsname = "ABL " & Day(Date) & "." & _
Month(Date) & "." & Year(Date) & " " & Hour(Time) & _
"-" & Minute(Time) & "-" & Second(Time) & " Uhr"
Next d
Set ns = wb2.Sheets.Add(, Sheets(wb2.Sheets.Count))
ns.Name = nsname
sh1.UsedRange.Copy
ns.Range("a1").PasteSpecial (xlPasteFormats)
ns.Range("a1").PasteSpecial (xlPasteColumnWidths)
ns.Range("a1").PasteSpecial (xlPasteValuesAndNumberFormats)
For i = 1 To sh1.UsedRange.Rows.Count
ns.Rows(i).RowHeight = sh1.UsedRange.Rows(i).RowHeight
Next i
Abbruch:
If nsname = "" Then MsgBox "Kein gueltiger Name oder Abbruch... Kopie nicht erstellt!"
wb2.Save
If wbopen = False Then wb2.Close
ThisWorkbook.Activate
Application.ScreenUpdating = True
Set ns = Nothing
Set wb2 = Nothing
Set sh1 = Nothing


Anzeige
AW: Blatt kopieren - knifflig
10.04.2008 17:04:00
Dirk
Hallo Rainer,
vielen Dank für deine Geduld mit mir u. deinen neuen Vorschlag !
Sämtliche Formate werden nun exakt übertragen u. auch das Problem mit der Fehlermeldung bei geöffneter Zieldatei hast du super gelöst - Kompliment !

Allerdings gibt es noch 2 letzte "Schönheitsfehler" aus meiner Sicht:
1. Ist die Zieldatei bereits offen UND es erfolgt eine Eingabe in der InputBox, so soll das Blatt kopiert werden und das neue Blatt in der Zieldatei aktiviert werden.
(Bei Abbrechen bzw. keine Eingabe bleibe in der Quelldatei u. kopiere nicht - dies funktioniert ja schon.)
2. Ist die Zieldatei geschlossen UND es erfolgt eine Eingabe in der InputBox, so soll das Blatt kopiert werden und das neue Blatt in der Zieldatei aktiviert werden - momentan wird die Zieldatei leider gleich wieder geschlossen.
(Bei Abbrechen bzw. keine Eingabe bleibe in der Quelldatei u. kopiere nicht, lasse die Zieldatei geschlossen - dies funktioniert ja schon.)
Hintergrund: Nach dem Kopieren muss ich in der Zieldatei einige manuelle Änderungen vornehmen.
Ich hoffe, du hast noch Lust mir abschließend zu helfen.
Zwar habe ich schon einiges mit deinem letzten Code experimentiert, aber ich kriege es einfach nicht hin...
MfG Dirk

Anzeige
AW: Blatt kopieren - knifflig
11.04.2008 03:18:39
Wuxinese
Hallo Dirk,
ich hab den Code noch dahingehend abgeaendert, dass die Zieldatei gleich aktiviert wird. Jetzt muesste alles soweit funktionieren, wie Du Dir das vorstellst! Fuer eine kurze Rueckmeldung waer ich dankbar!
Gruss
Rainer

Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Dim ns, wb2, sh1, nsname, wbopen, abbr
Set sh1 = ActiveWorkbook.ActiveSheet
Dim openworkbook As Workbook
wbopen = False
For Each openworkbook In Workbooks
If openworkbook.Name = "Zieldatei.xls" And openworkbook.Path = ActiveWorkbook.Path Then
wbopen = True
openworkbook.Save
openworkbook.Close
Exit For
End If
Next
Set wb2 = Workbooks.Open(ThisWorkbook.Path & "\zieldatei.xls")
nsname = InputBox("Neues Arbeitsblatt in der Zieldatei benennen!", "ABL benennen")
If nsname = "" Then abbr = True: GoTo abbruch
For d = 1 To wb2.Sheets.Count
If wb2.Sheets(d).Name = nsname Then nsname = "ABL " & Day(Date) & "." & _
Month(Date) & "." & Year(Date) & " " & _
Hour(Time) & "-" & Minute(Time) & "-" _
& Second(Time) & " Uhr"
Next d
Set ns = wb2.Sheets.Add(, Sheets(wb2.Sheets.Count))
ns.Name = nsname
sh1.UsedRange.Copy
ns.Range("a1").PasteSpecial (xlPasteFormats)
ns.Range("a1").PasteSpecial (xlPasteColumnWidths)
ns.Range("a1").PasteSpecial (xlPasteValuesAndNumberFormats)
For i = 1 To sh1.UsedRange.Rows.Count
ns.Rows(i).RowHeight = sh1.UsedRange.Rows(i).RowHeight
Next i
abbruch:
If nsname = "" Then MsgBox "Kein gueltiger Name oder Abbruch... Kopie nicht erstellt!"
wb2.Save
If abbr = True Then
sh1.Activate
Else
ns.Activate
ns.Range("a1").Select
End If
Application.ScreenUpdating = True
Set ns = Nothing
Set wb2 = Nothing
Set sh1 = Nothing
End Sub


Anzeige
AW: Blatt kopieren - knifflig
11.04.2008 18:07:00
Dirk
Hallo Rainer,
jetzt hast du dem "Nagel nicht nur voll auf den Kopf getroffen", sondern ihn auch versenkt - soll heissen:
Diese Lösung ist perfekt u. ich bin dir zu Dank verpflichtet !!!
Genau so hatte ich mir das "erträumt... ;-)

Ist wohl doch was dran an dem Sprichwort: Gut Ding will Weile haben.
Ohne deine Geduld u. Hartnäckigkeit bei meiner Problematik hätte ich das wohl NIE hinbekommen.
Abschließend wünsche ich dir noch ein wunderschönes WE.
MfG Dirk
P.S.: Habe lediglich im unteren Teil deines Codes eine Kleinigkeit geändert - so wird die Zieldatei gleich wieder geschlossen, wenn sie auch vorher geschlossen war (eigentlich ist das vorherige Öffnen überflüssig, aber damit kann ich leben...)
...
If abbr = True And wbopen = False Then
Workbooks("zieldatei.xls").Close
sh1.Activate
...
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige