web-dev-qa-db-fra.com

Reportez-vous à la fiche en utilisant le nom de code

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?

6
user007

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

15
Wolfie

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
4
Mark Fitzgerald

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.

  • Nom de code:

enter image description here

  • Prénom:

enter image description here

1
Vityata

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
0
Storax

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"
0
Dutch Gemini