Ich habe ähnliche Fragen zum Kopieren eines gesamten Arbeitsblatts in einer Arbeitsmappe und zum Einfügen in eine andere Arbeitsmappe gefunden. Ich bin jedoch daran interessiert, einfach ein gesamtes Arbeitsblatt zu kopieren und in ein neues Arbeitsblatt einzufügen - in derselben Arbeitsmappe.
Ich bin dabei, eine 2003 .xls-Datei in .xlsm zu konvertieren, und die alte Methode, die zum Kopieren und Einfügen zwischen Arbeitsblättern verwendet wird, fügt nicht die richtigen Zeilenhöhen ein. Meine anfängliche Problemumgehung bestand darin, durch jede Zeile zu blättern und die Zeilenhöhen aus dem Arbeitsblatt zu kopieren, aus dem ich kopiere, dann die Werte für die Zeilenhöhen in das Arbeitsblatt einzufügen, in das ich einfüge, aber das Problem bei diesem Ansatz ist, dass Blatt enthält Schaltflächen, die neue Zeilen erzeugen, wodurch die Nummerierung der Zeilen geändert wird und das Format des Blattes so ist, dass nicht alle Zeilen eine Breite haben können.
Ich möchte wirklich gerne das gesamte Arbeitsblatt kopieren und einfügen. Hier ist der Code aus der 2003-Version:
ThisWorkbook.Worksheets("Master").Cells.Copy
newWorksheet.Paste
Ich bin erstaunt, dass die Konvertierung in .xlsm dazu führt, dass dies jetzt kaputt geht. Anregungen oder Ideen wären toll.
Es ist einfacher, eine genaue Kopie wie unten auszuführen, um die Kopie als letztes Blatt einzufügen
Sub Test()
Dim ws1 As Worksheet
Set ws1 = ThisWorkbook.Worksheets("Master")
ws1.Copy ThisWorkbook.Sheets(Sheets.Count)
End Sub
ThisWorkbook.Worksheets("Master").Sheet1.Cells.Copy _
Destination:=newWorksheet.Cells
Das obige wird die Zellen kopieren. Wenn Sie wirklich das gesamte Blatt kopieren möchten, würde ich mit @ brettdjs Antwort gehen.
' Assume that the code name the worksheet is Sheet1
' Copy the sheet using code name and put in the end.
' Note: Using the code name lets the user rename the worksheet without breaking the VBA code
Sheet1.Copy After:=Sheets(Sheets.Count)
' Rename the copied sheet keeping the same name and appending a string " copied"
ActiveSheet.Name = Sheet1.Name & " copied"
@ Brettdjs Code hat mir wirklich gut gefallen, aber dann habe ich festgestellt, dass ich, wenn ich zusätzlichen Code zum Bearbeiten der Kopie hinzufügte, stattdessen mein Originalblatt überschrieb. Ich habe seine Antwort so angepasst, dass weiterer Code, der auf ws1
verweist, sich auf das neue Blatt und nicht auf das Original auswirkt.
Sub Test()
Dim ws1 as Worksheet
ThisWorkbook.Worksheets("Master").Copy
Set ws1 = ThisWorkbook.Worksheets("Master (2)")
End Sub
'Make the Excel file that runs the software the active workbook
ThisWorkbook.Activate
'The first sheet used as a temporary place to hold the data
ThisWorkbook.Worksheets(1).Cells.Copy
'Create a new Excel workbook
Dim NewCaseFile As Workbook
Dim strFileName As String
Set NewCaseFile = Workbooks.Add
With NewCaseFile
Sheets(1).Select
Cells(1, 1).Select
End With
ActiveSheet.Paste
Wenn jemand wie ich eine Schätzung-Arbeitsmappe mit einer Standardanzahl sichtbarer Preislisten, einer Zusammenfassung und einer größeren Anzahl versteckter und "geschützter" Arbeitsblätter hat, die mit sensiblen Daten gefüllt sind, müssen jedoch möglicherweise zusätzliche sichtbare Arbeitsblätter erstellt werden, um ein ordnungsgemäßes Ergebnis zu erhalten Preis, ich habe Variante der obigen Antworten, die die genannten sichtbaren Arbeitsblätter auf der Grundlage eines geschützten versteckten "Masters" erstellt. Ich habe den von @/jean-fran% c3% a7ois-corbett und @ thanos-a in Kombination mit einfacher VBA bereitgestellten Code verwendet (siehe unten).
Sub sbInsertWorksheetAfter ()
'This adds a new visible worksheet after the last visible worksheet
ThisWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
'This copies the content of the HIDDEN "Master" worksheet to the new VISIBLE ActiveSheet just created
ThisWorkbook.Sheets("Master").Cells.Copy _
Destination:=ActiveSheet.Cells
'This gives the the new ActiveSheet a default name
With ActiveSheet
.Name = Sheet12.Name & " copied"
End With
'This changes the name of the ActiveSheet to the user's preference
Dim sheetname As String
With ActiveSheet
sheetname = InputBox("Enter name of this Worksheet")
.Name = sheetname
End With
End Sub