web-dev-qa-db-fra.com

Copier une feuille VBA vers la fin du classeur (avec des feuilles de calcul masquées)

Je veux copier une feuille et l'ajouter à la fin de toutes les feuilles actuelles (que les feuilles soient masquées ou non).

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

Cela fonctionne bien, sauf que, lorsqu'il y a des feuilles masquées, la nouvelle feuille n'est insérée qu'après la dernière feuille de calcul visible. La commande name renomme alors la feuille incorrecte.

J'ai essayé des variantes des éléments suivants pour obtenir une référence à la WorkSheet nouvellement copiée, mais aucun code n'a réussi ni été validé. 

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

Essaye ça

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

Rendez la feuille source visible avant de la copier. Copiez ensuite la feuille de sorte que la copie reste également visible. La copie sera alors la feuille active. Si vous le souhaitez, masquez à nouveau la feuille source.

4
sidnc86

Si vous utilisez le code suivant basé sur le code de @Siddharth Rout, vous renommez la feuille que vous venez de copier, 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
Jabaal

J'ai rencontré un problème similaire lors de la copie d'une feuille dans un autre classeur. Je préfère toutefois éviter d'utiliser 'activeheet' car cela m'a causé des problèmes par le passé. Par conséquent, j'ai écrit une fonction pour effectuer cela en ligne avec mes besoins. Je l'ajoute ici pour ceux qui arrivent via google comme je l'ai fait: 

Le problème principal ici est que la copie d’une feuille visible à la dernière position d’index entraîne le repositionnement Excel de la feuille à la fin des feuilles visibles. Par conséquent, la copie de la feuille à la position après la dernière feuille visible règle ce problème. Même si vous copiez des feuilles masqué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

Utiliser cette fonction pour la question initiale (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
dra_red

Ajoutez 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

Ajoutez 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

Ajustez le code à la fin si vous souhaitez que plus que la première feuille soit active et visible. Tels que les suivants:

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

         Else: ws.Visible = False
       End If
      Next ws

Pour que la nouvelle feuille soit 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 une feuille particulière (choisie dans une liste déroulante) avec le formatage et la formule que je souhaite dans une nouvelle feuille, puis de renommer une nouvelle feuille avec l’utilisateur Entrée. Notez que chaque fois qu'une feuille est copiée, l'ancien nom de feuille lui est automatiquement attribué avec la désignation "(2)". Exemple "OldSheet" devient "OldSheet (2)" après la copie et avant le changement de nom. Vous devez donc sélectionner la feuille Copiée avec le nom des programmes avant de renommer.

0
TADbit