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!"
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
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.
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
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"
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.
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