Je reçois une erreur "incompatibilité de type" dans ce code:
With Worksheets(Sheet1) '* Error here
'my code here
End With
La variable CodeName
de ma feuille est 'sheet1'
.
Quelqu'un peut-il m'aider s'il vous plaît supprimer l'erreur?
1) Voir la feuille par index:
With Worksheets(1)
'<stuff here>
End With
L'index dépend de "l'ordre des feuilles dans le classeur". Si vous mélangez votre ordre de feuilles, il se peut que cela ne se réfère plus à la même feuille!
2) Voir la fiche par son nom:
With Worksheets("Your Sheet Name")
'<stuff here>
End With
Il s'agit de la propriété .Name
d'une feuille de calcul. Son nom est visible dans l'onglet de la feuille de calcul Excel et entre crochets dans l'explorateur de projets VBA.
3) Reportez-vous à la fiche par Nom de code:
Vous avez suggéré que vous souhaitiez réellement utiliser la propriété .CodeName
d'une feuille de calcul. Cela ne peut pas être mentionné entre crochets comme les deux exemples ci-dessus, mais existe contrairement à certaines réponses ci-dessus! Il est automatiquement affecté à une feuille lors de la création et correspond à "Feuille", puis au prochain numéro inutilisé dans les noms de code créés précédemment.
L'avantage d'utiliser CodeName
est que cela ne dépend pas de l'ordre des feuilles (contrairement à Index
) et que rien ne change si un utilisateur change la Name
simplement en renommant la feuille dans Excel.
L'inconvénient est que le code peut être plus compliqué ou ambigu. Puisque CodeName
est en lecture seule [1], cela ne peut être amélioré, mais garantit les avantages ci-dessus! Voir la documentation référencée pour plus de détails.
Première façon de l'utiliser: directement ...
With Sheet1
'<stuff here>
End With
Deuxième façon de l'utiliser: indirectement, peut offrir plus de clarté ou de flexibilité, montre comment utiliser la propriété CodeName
d'une feuille de calcul ...
En parcourant les feuilles et en lisant la propriété CodeName
, vous pouvez d’abord trouver la propriété Index
ou Name
de la feuille de votre choix. Ensuite, vous pouvez utiliser ceci pour référencer la feuille.
Dim sh as WorkSheet
Dim shName as String
Dim shIndex as Long
' Cycle through all sheets until sheet with desired CodeName is found
For Each sh in ThisWorkbook.WorkSheets
' Say the codename you're interested in is Sheet1
If sh.CodeName = "Sheet1" Then
' - If you didn't want to refer to this sheet later,
' you could do all necessary operations here, and never use shName
' or the later With block.
' - If you do want to refer to this sheet later,
' you will need to store either the Name or Index (below shows both)
' Store sheet's Name
shName = sh.Name
' Store sheet's Index
shIndex = sh.Index
End If
Next sh
' Check if match was found, do stuff as before if it was!
If shName = "" Then
MsgBox "Could not find matching codename"
Else
' Equally to the next line, could use Worksheets(shIndex)
With Worksheets(shName)
'<stuff here>
End With
End If
[1] https://msdn.Microsoft.com/en-us/library/office/ff837552.aspx
Vous pouvez utiliser les noms de code de feuille directement dans votre code comme si elles étaient des variables déclarées:
Sub UsingSheetCodeName()
With Sheet1
.[a1] = Sheet1.Name
End With
End Sub
Trois propriétés différentes peuvent être utilisées pour faire référence à une feuille de calcul:
.Name
as Worksheets("SomeNameHere")
dans Worksheets("SomeNameHere").Range("A1")
.Index
as Worksheets(2)
dans Worksheets(2).Range("A1")
.CodeName
en tant que Sheet3
dans Sheet3.Range("A1")
Pour voir la différence, lancez le code ci-dessous et jetez un coup d'oeil à la fenêtre immédiate Ctrl+G:
Sub TestMe()
Dim wks As Worksheet
For Each wks In ThisWorkbook.Worksheets
Debug.Print wks.Name
Debug.Print wks.Index
Debug.Print wks.CodeName
Debug.Print "-----------------------"
Next wks
End Sub
Si le Name
et le CodeName
de la feuille de calcul ne sont pas modifiés, ils seraient identiques.
Peut-être que ce code aide à comprendre les différents noms et l'index
Sub DisplaySheetnames()
Dim wks As Worksheet
For Each wks In Worksheets
Debug.Print "Index", wks.Index, "of sheet with name: " & wks.Name, "and", "codename " & wks.CodeName
Next
End Sub
CodeName est en fait lecture-écriture au moment de l'exécution lors de l'accès à la propriété par le biais de Worksheet.Parent.VBProject.VBComponents:
' ActiveWorksheet both .Name and .CodeName are 'Sheet 1'
For Each oVBComponent In ActiveWorksheet.Parent.VBProject.VBComponents
If (oVBComponent.Name = ActiveWorksheet.CodeName) Then oVBComponent.Name = "New Name"
Next oVBComponent
Debug.Print ActiveWorkSheet.Name, ActiveWorksheet.CodeName ' "Sheet1", "New Name"