web-dev-qa-db-de.com

VBA-Blatt zum Ende der Arbeitsmappe kopieren (mit ausgeblendeten Arbeitsblättern)

Ich möchte ein Arbeitsblatt kopieren und am Ende aller aktuellen Arbeitsblätter hinzufügen (unabhängig davon, ob die Arbeitsblätter ausgeblendet sind).

Sheets(1).Copy After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).name = "copied sheet!"

Dies funktioniert gut, außer wenn versteckte Arbeitsblätter vorhanden sind, wird das neue Arbeitsblatt nur nach dem letzten sichtbaren Arbeitsblatt eingefügt, sodass der Befehl name das falsche Arbeitsblatt umbenennt.

Ich habe Variationen des Folgenden versucht, um einen Verweis auf die neu kopierte WorkSheet zu erhalten, aber keine war erfolgreich und/oder gültiger Code. 

Dim test As Worksheet
Set test = Sheets(1).Copy(After:=Sheets(Sheets.Count))
test.Name = "copied sheet!"
21
enderland

Versuche dies

Sub Sample()
    Dim test As Worksheet
    Sheets(1).Copy After:=Sheets(Sheets.Count)
    Set test = ActiveSheet
    test.Name = "copied sheet!"
End Sub
31
Siddharth Rout

Machen Sie das Quellblatt vor dem Kopieren sichtbar. Kopieren Sie dann das Blatt, damit die Kopie auch sichtbar bleibt. Die Kopie ist dann das aktive Blatt. Wenn Sie möchten, blenden Sie das Quellblatt erneut aus.

4
sidnc86

Wenn Sie den folgenden Code verwenden, der auf dem Code von @Siddharth Rout basiert, benennen Sie das gerade kopierte Blatt um, unabhängig davon, ob es aktiviert ist oder nicht.

Sub Sample()

    ThisWorkbook.Sheets(1).Copy After:=Sheets(Sheets.Count)
    ThisWorkbook.Sheets(Sheets.Count).Name = "copied sheet!"

End Sub
1
Jabaal

Beim Kopieren eines Arbeitsblatts in eine andere Arbeitsmappe trat ein ähnliches Problem auf. Ich ziehe es vor, die Verwendung von "Activesheet" zu vermeiden, obwohl dies Probleme in der Vergangenheit verursacht hat. Daher habe ich eine Funktion geschrieben, um dies in Übereinstimmung mit meinen Bedürfnissen auszuführen. Ich füge es hier für diejenigen hinzu, die wie ich über Google ankommen: 

Das Hauptproblem dabei ist, dass das Kopieren eines sichtbaren Blattes an die letzte Indexposition dazu führt, dass Excel das Blatt am Ende der sichtbaren Blätter neu positioniert. Wenn Sie das Blatt an die Position nach dem letzten sichtbaren Blatt kopieren, wird dieses Problem sortiert. Auch wenn Sie verborgene Blätter kopieren. 

Function Copy_WS_to_NewWB(WB As Workbook, WS As Worksheet) As Worksheet
    'Creates a copy of the specified worksheet in the specified workbook
    '   Accomodates the fact that there may be hidden sheets in the workbook

    Dim WSInd As Integer: WSInd = 1
    Dim CWS As Worksheet

    'Determine the index of the last visible worksheet
    For Each CWS In WB.Worksheets
        If CWS.Visible Then If CWS.Index > WSInd Then WSInd = CWS.Index
    Next CWS

    WS.Copy after:=WB.Worksheets(WSInd)
    Set Copy_WS_to_NewWB = WB.Worksheets(WSInd + 1)

End Function

Um diese Funktion für die ursprüngliche Frage (z. B. in derselben Arbeitsmappe) zu verwenden, können Sie Folgendes ausführen:.

Set test = Copy_WS_to_NewWB(Workbooks(1), Workbooks(1).Worksheets(1))
test.name = "test sheet name"
0
dra_red

Wenn Sie ein Blatt mit dem Namen "mySheet" kopieren und ".Copy After: =" verwenden möchten, benennt Excel das kopierte Blatt genau gleich und fügt einfach "(2)" hinzu, sodass der endgültige Name "mySheet (2)" lautet.

Versteckt oder nicht, spielt keine Rolle. Es rockt mit 2 Codezeilen und fügt das kopierte Blatt am Ende der Arbeitsmappe hinzu !!!

Beispiel:

Sheets("mySheet").Copy After:=Sheets(ThisWorkbook.Sheets.count)
Sheets("mySheet (2)").name = "TheNameYouWant"

Einfach nein!

0
user11540045

Füge diesen Code am Anfang hinzu:

    Application.ScreenUpdating = False
     With ThisWorkbook
      Dim ws As Worksheet
       For Each ws In Worksheets: ws.Visible = True: Next ws
     End With

Füge diesen Code am Ende hinzu:

    With ThisWorkbook
     Dim ws As Worksheet
      For Each ws In Worksheets: ws.Visible = False: Next ws
    End With
     Application.ScreenUpdating = True

Passen Sie den Code am Ende an, wenn mehr als das erste Blatt aktiv und sichtbar sein soll. Wie das Folgende:

     Dim ws As Worksheet
      For Each ws In Worksheets
       If ws.Name = "_DataRecords" Then

         Else: ws.Visible = False
       End If
      Next ws

Um sicherzustellen, dass das neue Blatt umbenannt wird, passen Sie den Code folgendermaßen an:

     Sheets(Me.cmbxSheetCopy.value).Copy After:=Sheets(Sheets.Count)
     Sheets(Me.cmbxSheetCopy.value & " (2)").Select
     Sheets(Me.cmbxSheetCopy.value & " (2)").Name = txtbxNewSheetName.value

Dieser Code stammt aus meinem Benutzerformular, mit dem ich ein bestimmtes Blatt (ausgewählt aus einer Dropdown-Box) mit den gewünschten Formatierungen und Formeln in ein neues Blatt kopieren und dann das neue Blatt mit der Benutzereingabe umbenennen kann. Beachten Sie, dass jedes Mal, wenn ein Blatt kopiert wird, automatisch der alte Blattname mit der Bezeichnung "(2)" vergeben wird. Beispiel "OldSheet" wird nach der Kopie und vor dem Umbenennen zu "OldSheet (2)". Sie müssen also vor dem Umbenennen das kopierte Arbeitsblatt mit den Programmnamen auswählen.

0
TADbit