Feuille de copie VBA à la fin du classeur (avec feuilles de travail cachées)

je veux copier une feuille et l'ajouter à la fin de toutes les feuilles (indépendamment du fait que les feuilles sont cachés).

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

cela fonctionne très bien, sauf que, lorsqu'il y a des feuilles cachées, la nouvelle feuille n'est insérée qu'après la dernière feuille de travail visible, donc le name commande renomme la mauvaise feuille.

j'ai essayé des variantes de ce qui suit pour obtenir une référence à la nouvelle copie WorkSheet mais aucun n'a réussi et/ou de code valide.

Dim test As Worksheet
Set test = Sheets(1).Copy(After:=Sheets(Sheets.Count))
test.Name = "copied sheet!"
21
demandé sur Elysian Fields 2012-08-16 19:20:37

6 réponses

Essayez ceci

Sub Sample()
    Dim test As Worksheet
    Sheets(1).Copy After:=Sheets(Sheets.Count)
    Set test = ActiveSheet
    test.Name = "copied sheet!"
End Sub
31
répondu Siddharth Rout 2012-08-16 15:23:15

rendre la feuille source visible avant de la copier. Ensuite, copiez la feuille pour que la copie reste aussi visible. La copie sera alors la feuille active. Si tu veux, cache la fiche source encore une fois.

4
répondu sidnc86 2014-08-14 09:17:04

si vous utilisez le code suivant basé sur le code de @Siddharth Rout, vous renommez la feuille juste copiée, qu'elle soit activée ou non.

Sub Sample()

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

End Sub
1
répondu Jabaal 2015-04-24 10:47:42

j'ai fait face à un problème similaire en copiant une feuille à un autre classeur. Je préfère éviter d'utiliser "activesheet" bien que comme il m'a causé des problèmes dans le passé. Par conséquent, j'ai écrit une fonction pour effectuer ce en ligne avec mes besoins. Je les mets ici pour ceux qui arrivent via google que j'ai fait:

le problème principal ici est que Copier une feuille visible à la dernière position de l'index entraîne Excel à repositionner la feuille à la fin des feuilles visibles. Donc la copie de la feuille à la position après la dernière feuille visible trie cette question. Même si vous copiez des feuilles cachées.

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

pour utiliser cette fonction pour la question originale (c.-à-d. dans le même classeur) pourrait être fait avec quelque chose comme...

Set test = Copy_WS_to_NewWB(Workbooks(1), Workbooks(1).Worksheets(1))
test.name = "test sheet name"
0
répondu dra_red 2016-12-07 20:01:03

Ajouter ce code au début:

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

Ajouter ce code à la fin:

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

ajuster le Code à la fin si vous voulez que plus que la première feuille soit active et visible. Tel que le suivant:

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

         Else: ws.Visible = False
       End If
      Next ws

pour vous assurer que la nouvelle feuille est celle qui est renommée, ajustez votre code comme suit:

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

ce code provient de mon formulaire d'utilisateur qui me permet de copier feuille particulière (choisi d'une boîte de dropdown) avec le formatage et la formule que je veux à une nouvelle feuille et puis renommer la nouvelle feuille avec l'entrée de l'utilisateur. Notez que chaque fois qu'une feuille est copiée, elle reçoit automatiquement l'ancien nom de la feuille avec la désignation " (2)". Exemple " OldSheet "devient" OldSheet (2) " après la copie et avant le renommage. Vous devez donc sélectionner la feuille copiée avec le nom des programmes avant de renommer.

0
répondu TADbit 2017-06-22 21:04:38

Réponse : j'ai trouvé cela et veut la partager avec vous.

Sub Copier4()
   Dim x As Integer

   For x = 1 To ActiveWorkbook.Sheets.Count
      'Loop through each of the sheets in the workbook
      'by using x as the sheet index number.
      ActiveWorkbook.Sheets(x).Copy _
         After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
         'Puts all copies after the last existing sheet.
   Next
End Sub

Mais la question, peut-on l'utiliser avec le code suivant pour renommer les feuilles, si oui, comment pouvons-nous le faire?

Sub CreateSheetsFromAList()
Dim MyCell As Range, MyRange As Range
Set MyRange = Sheets("Summary").Range("A10")
Set MyRange = Range(MyRange, MyRange.End(xlDown))
For Each MyCell In MyRange
Sheets.Add After:=Sheets(Sheets.Count) 'creates a new worksheet
Sheets(Sheets.Count).Name = MyCell.Value ' renames the new worksheet
Next MyCell
End Sub
-2
répondu Nabil Amer 2015-01-16 06:56:47