5.4k Aufrufe
Gefragt in Tabellenkalkulation von
Moin Leute,
Ich möchte gerne aus einer Exceldatei 5 Reiter in eine neue Exceldatei kopieren, dies funktioniert mittels makro auch sehr gut, leider nur als Kopie und nicht als Wertkopie, ich habe diesen Code

Option Explicit
Public Sub CopyWks()
On Error GoTo DispFehler
Application.DisplayAlerts = False
Dim wbMappe As Workbook
Set wbMappe = Workbooks.Add
ThisWorkbook.Worksheets(Array("Tabelle1", "Tabelle2", "Tabelle3")).Copy Before:=wbMappe.Sheets(1)
wbMappe.Worksheets(Array(4, 5, 6)).Delete
DispFehler:
wbMappe.SaveAs "C:\Temp\DeinName.xls"
wbMappe.Close
Application.DisplayAlerts = True
Set wbMappe = Nothing
End Sub

Er funktioniert wie gesagt auch sehr gut nur leider muss ich um die Datei klein zu halten ein Wertkopie der Datein erstellen, wer kann mir helfen????

Gruß und danke für euro Hilfe Nejo´s

21 Antworten

0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Nejo,

was bitte verstehst Du unter "Wertkopie"? Erklär bitte etwas genauer, was Du möchtest.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von rainberg Profi (14.9k Punkte)
Hallo Oliver,

es sollen nur die Zellwerte, keine Formeln kopiert (eingefügt) werden

Gruss
Rainer
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Nejos, hallo Rainer!

Wenn es sich so verhält, wie Reiner es geschrieben hat, dann sollte es mit nachfolgendem Makro gehen.

Kopiere das Makro in ein StandardModul und starte es z.B. über eine Befehlsschaltfläche
Teste das Makro aber bitte in einer Testdatei und nicht gleich in Deiner Originaldatei.

Option Explicit
Public Sub CopyWks()
On Error GoTo DispFehler
Application.DisplayAlerts = False
Dim wbMappe As Workbook
Set wbMappe = Workbooks.Add
ThisWorkbook.Worksheets(Array("Tabelle1", "Tabelle2", "Tabelle3")).Copy Before:=wbMappe.Sheets(1)
wbMappe.Worksheets(Array(4, 5, 6)).Delete
Dim intSheets As Integer
For intSheets = 1 To wbMappe.Sheets.Count
wbMappe.Sheets(intSheets).Cells.Copy
wbMappe.Sheets(intSheets).Range("A1").PasteSpecial Paste:=xlPasteValues
Next
DispFehler:
wbMappe.SaveAs "C:\Temp\DeinName.xls"
wbMappe.Close
Application.DisplayAlerts = True
Set wbMappe = Nothing
End Sub
Hier werden nach dem Kopieren alle Formeln in allen Tabellenblättern der neuen Datei gegen die Werte ausgetauscht.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von
Danke, der Quelltext funktioniert soweit, nur das die Reiter dann Tabelle 1 (1), Tabelle (2) und Tabelle (3) heissen , sie sollten schon so heissen wie die original Reiter der Datei, von der sie kopiert werden, kann mir jemand helfen???


Gruß Nejos
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Nejos,

hast Du Dir Deine 1. Frage mal angesehen? Was stehen dort für Tabellenblattnamen? Richtig, "Tabelle1", "Tabelle2" und "Tabelle3". Und danach habe ich den Code ergänzt.
Das die Tabellenblätter anders heißen hast Du nirgends erwähnt. Wie lauten denn die Blattnamen? Oder an welcher Stelle stehen die Blätter. Ohne diese Infos kann man Dir nicht helfen.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von
Sagen wir die Reiter heissen Instantsuppen, ET 800g etc. also diverse unterschiedliche Namen, ist das nicht irgendwie möglich hinzukriegen? Vll wenn ich nen Code hätte wo ich die Namen der Reiter eintragen kann...
ausserdem müssten mehr als 3 reiter kopiert werden, vielen Dank für deine Hilfe


Gruß Nejos
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Nejos,

nachfolgend Dein Makro so abgeändert, dass Du den Namen der zu kopierenden Blätter eingeben kannst.

Kopiere das Makro in ein StandardModul und starte es z.B. über eine Befehlsschaltfläche
Teste das Makro aber bitte in einer Testdatei und nicht gleich in Deiner Originaldatei.

Option Explicit

Public Sub CopyWks()
Dim wbMappe As Workbook
Dim strDruckarray()
Dim intMeldung As Integer
Dim wbMappe As Workbook
Dim intZähler As Integer
Dim strEingabe As String
Dim intSheetIndex As Integer
Dim bolSheetVorhanden As Boolean
Dim intSheets As Integer

On Error GoTo DispFehler
Application.DisplayAlerts = False

'------------------------------------------------------------------------------
intZähler = 1
ReDim strDruckarray(1 To intZähler)

Anfang:
'------------------------------------------------------------------------------
'Schritt 1: Eingabe des Blattnamen
strEingabe = InputBox("Bitte Blattname eintragen", Default:=strEingabe)

'------------------------------------------------------------------------------
'Schritt 2: Prüfen ob eingegebenes Tabellenblatt in Datei vorhanden ist
bolSheetVorhanden = False

For intSheetIndex = 1 To Sheets.Count
If Sheets(intSheetIndex).Name = strEingabe Then
bolSheetVorhanden = True
Exit For
End If
Next intSheetIndex

'------------------------------------------------------------------------------
'Schritt 3: Blattnamen in Array eintragen, wenn vorhanden, wenn nicht Bildschirmmeldung
If bolSheetVorhanden = True Then
strDruckarray(intZähler) = strEingabe
Else
MsgBox "Das angegebene Tabellenblatt existiert in dieser Datei nicht. Bitte " _
& "ändern Sie den Blattnamen.", vbCritical, "falsche Eingabe..."
GoTo Anfang
End If

'------------------------------------------------------------------------------
'Schritt 4: Abfrage, ob ein weiteres Tabellenblatt eingegeben werden soll
intMeldung = MsgBox("Sollen weitere Blattnamen eingetragen werden?", _
vbYesNo + vbQuestion, "Blattnameneingabe...")

If intMeldung = 6 Then
intZähler = intZähler + 1
ReDim Preserve strDruckarray(1 To intZähler)
GoTo Anfang
End If

'------------------------------------------------------------------------------
'Schritt 5: Blätter in neue Datei kopieren
Set wbMappe = Workbooks.Add
ThisWorkbook.Worksheets(strDruckarray).Copy

'------------------------------------------------------------------------------
'Schritt 6: Daten kopieren und nur Werte in Blatt zurückschreiben
For intSheets = 1 To wbMappe.Sheets.Count
wbMappe.Sheets(intSheets).Cells.Copy
wbMappe.Sheets(intSheets).Range("A1").PasteSpecial Paste:=xlPasteValues
Next

DispFehler:
wbMappe.SaveAs "C:\Temp\DeinName.xls"
wbMappe.Close
Application.DisplayAlerts = True
Set wbMappe = Nothing
End Subb
In Schritt 1 erfolgt die Eingabe des Blattnamens.
In Schritt 2 wird geprüft, ob der eingegebene Blattname in der Datei existiert.
Gibt es das Blatt, dann wird in Schritt 3 der eingegebene Blattname in ein Array geschrieben. Wenn nicht, erscheint eine Bildschirmmeldung, dass der Blattname geändert werden muss.
In Schritt 4 wird abgefragt, ob weitere Tabellenblattnamen eingegeben werden soll. Wenn ja, dann wird wieder mit Schritt 1 begonnen.
Schritt 5 kopiert alle angegebenen Tabellenblätter in eine neue Datei.
Bei Schritt 6 werden dann wieder alle Formeln gegen Werte ausgetauscht.

Ich hoffe, Du meintest das so?

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hi,

ich nochmal. Nachfolgend das Makro nochmal mit einer kleiner Korrektur. Funktionsweise ist aber genau wie in AW7 bereits beschrieben.

Kopiere das Makro in ein StandardModul und starte es z.B. über eine Befehlsschaltfläche
Teste das Makro aber bitte in einer Testdatei und nicht gleich in Deiner Originaldatei.

Option Explicit

Public Sub CopyWks()
Dim wbMappe As Workbook
Dim strDruckarray()
Dim intMeldung As Integer
Dim wbMappe As Workbook
Dim intZähler As Integer
Dim strEingabe As String
Dim intSheetIndex As Integer
Dim bolSheetVorhanden As Boolean
Dim intSheets As Integer

On Error GoTo DispFehler
Application.DisplayAlerts = False

'------------------------------------------------------------------------------
intZähler = 1
ReDim strDruckarray(1 To intZähler)

Anfang:
'------------------------------------------------------------------------------
'Schritt 1: Eingabe des Blattnamen
strEingabe = InputBox("Bitte Blattname eintragen", Default:=strEingabe)

'------------------------------------------------------------------------------
'Schritt 2: Prüfen ob eingegebenes Tabellenblatt in Datei vorhanden ist
bolSheetVorhanden = False

For intSheetIndex = 1 To Sheets.Count
If Sheets(intSheetIndex).Name = strEingabe Then
bolSheetVorhanden = True
Exit For
End If
Next intSheetIndex

'------------------------------------------------------------------------------
'Schritt 3: Blattnamen in Array eintragen, wenn vorhanden, wenn nicht Bildschirmmeldung
If bolSheetVorhanden = True Then
strDruckarray(intZähler) = strEingabe
Else
MsgBox "Das angegebene Tabellenblatt existiert in dieser Datei nicht. Bitte " _
& "ändern Sie den Blattnamen.", vbCritical, "falsche Eingabe..."
GoTo Anfang
End If

'------------------------------------------------------------------------------
'Schritt 4: Abfrage, ob ein weiteres Tabellenblatt eingegeben werden soll
intMeldung = MsgBox("Sollen weitere Blattnamen eingetragen werden?", _
vbYesNo + vbQuestion, "Blattnameneingabe...")

If intMeldung = 6 Then
intZähler = intZähler + 1
ReDim Preserve strDruckarray(1 To intZähler)
GoTo Anfang
End If

'------------------------------------------------------------------------------
'Schritt 5: Blätter in neue Datei kopieren
ThisWorkbook.Worksheets(strDruckarray).Copy

'------------------------------------------------------------------------------
'Schritt 6: Daten kopieren und nur Werte in Blatt zurückschreiben
For intSheets = 1 To ActiveWorkbook.Sheets.Count
ActiveWorkbook.Sheets(intSheets).Cells.Copy
ActiveWorkbook.Sheets(intSheets).Range("A1").PasteSpecial Paste:=xlPasteValues
Next

DispFehler:
ActiveWorkbook.SaveAs "C:\Temp\DeinName.xls"
ActiveWorkbook.Close
Application.DisplayAlerts = True
Set wbMappe = Nothing
End Sub
MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von
Sieht schon sehr passend aus, nur leider kriege ich den Fehler Mehrfachdeklarationen im aktuellen Gültigkeitsbereich...was mache ich falsch? Ich habe einen Button und dort den Code eingetragen, irgendjemand ne idee???


Danke für eure Hilfe
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo,

lösche in dem Makro die Zeilen

Dim wbMappe As Workbookkheraus, dann sollte der Fehler nicht mehr auftreten.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
...