Attendu: identificateur

Salut, j'ai une macro qui enregistre des feuilles de mon classeur sous des noms de variables pour ne pas avoir de probleme lors de l'execution de mon code.

Par exemple ma feuille va avoir comme nom "BDD" et lorsque je vais coder je vais y faire reference comme ceci : Sheets("'BDD").xxxxxx ou sheets(1).xxxxxxx sauf que si un utilisateur du fichier change le nom de cette feuille les references precedentes ne fonctionneront plus

C'est pour ça qu'a l'execution de mon fichier je nomme les feuilles telles qu'il suit: je nomme le workbook en WB00 et chaque feuille en fonction de son code name (qui lui est non modifiable). Ce qui veut dire que je vais créer une variable WB00WS1 pour ma premiere feuille, WB00WS02 pour la 2eme et ainsi de suite

Je vais ensuite y faire reference dans mon code tel qu'il suit WB00WS01.xxxx

Du coup ma macro se présente tel qu'il suit:

Sub initWB00()
    Set WB00 = ActiveWorkbook
    For Each W In WB00.Worksheets
        On Error Resume Next
        If W.CodeName = "Feuil1" Then
            Set WB00WS01 = W
        End If
        If W.CodeName = "Feuil2" Then
            Set WB00WS02 = W
        End If
        If W.CodeName = "Feuil3" Then
            Set WB00WS03 = W
        End If
        If W.CodeName = "Feuil4" Then
            Set WB00WS04 = W
        End If
        If W.CodeName = "Feuil5" Then
            Set WB00WS05 = W
        End If
        If W.CodeName = "Feuil6" Then
            Set WB00WS06 = W
        End If
        If W.CodeName = "Feuil7" Then
            Set WB00WS07 = W
        End If
        If W.CodeName = "Feuil8" Then
            Set WB00WS08 = W
        End If
        If W.CodeName = "Feuil9" Then
            Set WB00WS09 = W
        End If
        If W.CodeName = "Feuil10" Then
            Set WB00WS10 = W
        End If
    Next W
End Sub

De cette maniere ça fonctionne mais vous pouvez le voir par vous meme, c'est assez tribial et peu esthetique

J'ai donc voulu faire une boucle basique avec i en variable qui va donner le n° de la feuille donc "WB00WS" i = "Feuil"i =

Sub initWB00()
Dim i As Integer
    Set WB00 = ActiveWorkbook
    For Each W In WB00.Worksheets
        For i = 1 To 20
        If W.CodeName = "Feuil" & i Then
            Set "WB00WS"&i = W
        End If
    Next W
End Sub

Le probleme etant que si je l'ecrit de cette maniere j'ai une erreur "Attendu: identificateur"

Je présume que c'est le fait de mettre un string et une variable à gauche d'une egalité mais si c'est ça je vois pas comment resoudre le probleme

Avez vous des idées ?

Merci d'avance

bonjour,

1) une variable que l'on veut compléter avec un numéro séquentiel, c'est un tableau (array) wb00ws(1)->wb00ws(20)

2) pourquoi ne pas simplement utiliser le codename ?

feuil1.xxxx, feuil2.xxxx, ..., feuil20.xxxx

bonjour @h2so4

1) je n'ai pas compris, je suis neopyte désolée

2) si je n'ai pas d'autres solutions j'utiliserai le code name, ça m'embete un peu car j'ai tjrs utilisé les WB00WS que je trouvais plus parlant et plus esthétique et puis les feuil1 feuil2 etc restent la solution de facilité

bonjour,

exemple d'utilisation d'une variable tableau(array) vba pour ton cas

Dim WB00WS(1 To 20)
Sub initWB00()
Dim i As Integer
    Set WB00 = ActiveWorkbook
    For Each W In WB00.Worksheets
        For i = 1 To 20
        If W.CodeName = "Feuil" & i Then
            Set WB00WS(i) = W
        End If
    Next W
End Sub

pour accéder au WB00WS qui correspond à feuil3 WB00WS(3).xxxx

Mais du coup si j'ai une variable qui traine dans mon code comme ça est ce que ça ne va pas ralentir mon code ?

Ce que je veux dire c'est est ce que Set WB00WS1 WB00WS2 et ainsi de suite jusqu'à 100 (pour etre large) ce n'est pas plus rapide qu'avoir un WB00WS(i) qui va a chaque fois rechercher à quel codename correspond le i ?

il n'y a pas de différence de performances pour accéder à l'objet par WB00WS3 ou par WB00WS(3). Mais comme je ne comprends pas ce que tu essaies de faire, je ne comprends pas l'intérêt de ta demande.

A ta place, j'utiliserais feuil1, feuil2 etc et si ces noms ne te plaisent pas tu peux toujours changer le codename dans ton classeur. Manuellement ou par programme.

codename

aaaaaaaaaaaaaaaaaah

je ne savais pas qu'on pouvait changer le codename manuellement !!

Merci en tout cas ! chaque fois que je viens ici j'apprends des nouveaux trucs !

Du coup j'ai comme macro qui fonctionne !

Sub initWB00()
Dim i As Integer
    Set WB00 = ActiveWorkbook
    For Each W In WB00.Worksheets
        For i = 1 To 2
        If W.CodeName = "Feuil" & i Then
        W.Parent.VBProject.VBComponents(W.CodeName).Properties("_CodeName") = "WB00WS" & i
        End If
        Next i
    Next W
End Sub

Par contre sur des forums je vois beaucoup utilisé la fonction [_CodeName] et j'ai essayé W.[_CodeName] chez moi ça ne fonctionne pas, je comprends pas pourquoi

Et aussi, va falloir que je me forme sur cette histoire d'Array, ça a l'air vachement interessant aussi

ça ne fonctionne pas au fait

Je ne peux pas lancer de fonction type unprotect ou listobject avec le codename

en gros sheets(1).unprotect est possible mais pas WB00WS01.unprotect

bonjour,

aucun problème pour utiliser la syntaxe WB00WS01.unprotect si le codename de la feuille est WB00WS01, par contre tu auras une erreur si le codename de la feuille est WB00WS1 (codename donné à ta feuille par ta macro)

bonjour,

Je ne peux pas lancer de fonction type unprotect ou listobject avec le codename.

Pour Unprotect : Mais si !

Pour ListObject YAPA de rapport vu que ListObject se rapporte à un objet Range...

En résumé, tu renommes tes CodeName W1 à W100... et tu auras des objets bien bien plus facile à manier sans avoir à renommer un tas de machin avec des noms à rallonge...

De plus si tu t'amuse à nommer tout une tas de variables avec des noms du type "WB00WS01" tu auras de fortes chance de pas avoir beaucoup de helpeur qui se donneront la peine de lire ton code !

A+

Rechercher des sujets similaires à "attendu identificateur"