IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Modification d'une feuille par codename variable


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut Modification d'une feuille par codename variable
    Bonjour,

    Je souhaiterais travailler sur les feuilles par leur codename sous forme de string variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim i As Integer
    Dim codeNameFeuille As String
    For i = 1 To 2
      codeNameFeuille = "Feuil" & i
      codeNameFeuille.Range("A1") = "OK"
    Next i
    Bien sur cela ne marche pas...

    J'ai également essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim i As Integer
    Dim codeNameFeuille As Worksheet
    For i = 1 To 2
      codeNameFeuille = "Feuil" & i
      codeNameFeuille.Range("A1") = "OK"
    Next i
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim i As Integer
    Dim codeNameFeuille As Worksheet
    For i = 1 To 2
      codeNameFeuille = Evaluate("Feuil" & i)
      codeNameFeuille.Range("A1") = "OK"
    Next i
    Auriez-vous une solution ou faut-il faire une recherche sur tous les onglets pour avoir le count ou le name ?

    Merci

    Olivier.

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par P4board Voir le message
    ...
    Auriez-vous une solution ou faut-il faire une recherche sur tous les onglets pour avoir le count ou le name ?
    ....
    pourrait-tu ré-exprimer ta question ? c'est quoi "le count" ou "le name" ? tu dois agir sur quelles feuilles (toutes les feuilles du classeur..?) ?

  3. #3
    Membre éclairé Avatar de Orhleil
    Homme Profil pro
    Intégrateur fonctionnel
    Inscrit en
    Mai 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Intégrateur fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 81
    Par défaut
    Salut à toi !
    Les feuilles ont en fait 2 noms, tu peux les voir dans les propriétés en tant que "(name)" et "name". Le second est le nom qui apparait pour l'utilisateur lambda. Le premier représente quant à lui le nom de l'objet Worksheet auquel cette feuille correspond.
    Donc pour accéder à la feuille tu as 2 solutions :
    - Truc.Range("A1"), où Truc est le "(name)"
    - Worksheets.("Machin").Range("A1"), où Machin est le "name"
    Donc dans ton cas c'est la 2è solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim i As Integer
    Dim codeNameFeuille As String
    For i = 1 To 2
      codeNameFeuille = "Feuil" & i
      Worksheets(codeNameFeuille).Range("A1") = "OK"
    Next i
    En espérant t'avoir aidé

    EDIT : d'ailleurs au cas où, pour que l'utilisateur puisse changer les noms des feuilles si ça lui chante, je te conseillerais plutôt de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each Feuille In Worksheets
        Feuille.Range("A1").Formula = "OK"
    Next Feuille
    EDIT 2 : enfin ma remarque juste au dessus est valable si tu veux parcourir toutes les Worksheets, ce qui ne semble pas être le cas ici

  4. #4
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132

  5. #5
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut
    Merci pour ces réponses, mais c'est bien le codeName que je souhaite utiliser et nom le name...

    Par le name :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Worksheets("Feuil" & i").range("A1")="OK"
    fonctionne, c'est ce que je faisais jusqu'à présent mais ce n'est pas ce que je voulais faire pour améliorer mon code.

    Par le codeName :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Feuil1.Range("A1") = "OK"
    Feuil2.Range("A1") = "OK"
    fonctionne aussi mais je voudrais transformer le nom en variable

    Par le count :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      Worksheets(1).Range("A1") = "OK"
      Worksheets(2).Range("A1") = "OK"
    Cette exemple est simple mais mon appli un peu plus complexe.

    Peut-être une autre solution ?

  6. #6
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    désolé je ne comprends toujours pas ton histoire par "le count" tu ne pourrai pas traduire en français ?

    ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Worksheets(1).Range("A1") = "OK"
      Worksheets(2).Range("A1") = "OK"
    ne te convient'il pas ?

  7. #7
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut
    Désolé pour le langage...

    le count correspond à l'ordre des feuilles.

    Le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Worksheets(1).Range("A1") = "OK"
      Worksheets(2).Range("A1") = "OK"
    me conviendrais si j'avais le fameux numéro ; je n'ai que le nom du codeName (et pas du name).

    Pour s'en sortir il faudrait faire une boucle sur toutes les feuilles et vérifier que le codeName correspond, j'aurais alors son numéro (count), mais ce n'est pas vraiment très beau...

    ex avec le code suivant qui devrait fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        For i = 1 To Worksheets.Count
          If (Worksheets(i).CodeName = codeNameFeuille ) Then
            Worksheets(i).range("A1").value="OK"
            Exit For
          End If
        Next i

  8. #8
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    j'ai toujours pas compris tes besoins ... peu-être cela t'inspire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim f As Worksheet
     For Each f In ThisWorkbook.Worksheets
        Debug.Print f.CodeName & " / " & f.Index & " / " & f.Name
     Next
    ...

  9. #9
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut
    non cela ne va pas beaucoup m'aider...

  10. #10
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par P4board Voir le message
    non cela ne va pas beaucoup m'aider...
    alors il faut en venir à l'évidence ton classeur est mal organisé ... revoit ton organisation des feuilles ...pour arriver à agir sur les feuilles que tu désire (d'ailleurs l'on s'est toujours ce quels ont de particulier...)

  11. #11
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut
    Bon pour être plus explicit :

    3 methodes pour accéder à une feuille.
    Mon exemple n'est pas très bon car par défaut le "name" et le "codeName" d'une feuille sont identiques (Feuil1) ; il faut donc, pour bien s'en rendre compte, modifier le nom de l'onglet Feuil1 en Toto par exemple :

    par son nom :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dim ma_variable as string
    ma_variable = activesheet.name 'ma_variable = Toto
    worksheets(ma_variable).range("A1").value="OK"
    par sa position :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim ma_variable As Integer
    ma_variable = ActiveSheet.Index 'ma_variable = 1 si feuille la plus à gauche
    Worksheets(ma_variable).Range("A1").Value = "OK"
    par son "codeName" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dim ma_variable as string
    ma_variable = activesheet.codeName 'ma_variable = Feuil1
    worksheets(ma_variable).range("A1").value="OK"
    Les 2 premiers fonctionnent, mais pas la troisiemme. Comme il est fortement conseillé de passer par le codeName au cas ou l'utilisateur change le nom de la feuille ou la déplace... C'est ce que j'essaye de faire.

    En direct cela fonctione bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Feuil1.range("A1").value="OK"
    mais pas en passant par une variable...

    J'ai déjà pas mal fouillé sur le net sans succès.

    Merci de votre aide.

    Olivier.

    ps : mon classeur est bien organisé merci.

  12. #12
    Membre éclairé Avatar de Orhleil
    Homme Profil pro
    Intégrateur fonctionnel
    Inscrit en
    Mai 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Intégrateur fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 81
    Par défaut
    Oui, en gros tu souhaites accéder à une variable en utilisant son nom comme String... Je ne sais pas si c'est faisable en VBA.
    Mais je ne comprends pas bien l'intérêt...
    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim ma_variable as string
    ma_variable = activesheet.codeName 'ma_variable = Feuil1
    worksheets(ma_variable).range("A1").value="OK"
    Tu ne peux pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Range("A1").Value="OK"
    Là l'utilisateur peut changer le nom de la feuille ça fonctionnera quand même.
    Pourquoi veux-tu impérativement passer par le CodeName sous forme de variable String ?
    Si les deux Worksheets pour lesquelles tu veux attribuer le "OK" sont toujours les mêmes, pourquoi ne pas directement utiliser leur Codename tel qu'il existe actuellement (l'utilisateur ne pourra pas les changer...) ?
    En reprenant ton code de départ ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Feuil1.Range("A1").Value = "OK"
    Feuil2.Range("A1").Value = "OK"
    Je ne comprends pas ton problème...

  13. #13
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut
    Merci pour cette réponse, je vais encore justifier pourquoi je souhaite cette solution :

    Si j'ai mis activesheet, c'est pour l'exemple et bien voir la différence entre name, index et codeName ; dans mon cas le codeName sera
    feuille_1
    feuille_2
    feuille_3
    ...

    il y en a beaucoup et non 2.

    d'où la necessité de passer par une variable pour pouvoir faire une boucle cf mon premier message.

    Je pourrais passer par le nom de l'onglet, mais si l'utilisateur change le nom de cet onglet, ma macro est à l'eau... c'est pour cela qu'il est préférable de passer par le codeName.

    Il doit certainement y avoir une solution à mon problème et non un contournement du problème...

  14. #14
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 127
    Par défaut
    Salut

    C'est le même problème que sur un UserForm lorsque l'on place plusiurs Edit.
    Sauf que ce qui est faisable sur le userform à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UserForm.Controls("Edit" & i)
    ne fonctionnera pas ici.

    Tu as peut etre une chance avec Application.VBE..., il existe peut être ici une fonction te permettant de retrouver tes Feuilles en spécifiant le codeName en string, mais je suis pas sur, je vais regarder un peu mieux.

    Ton nombre de feuilles varie t il?

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  15. #15
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut
    Merci Qwazerty,

    non mon nombre de feuilles ne varie pas pour l'instant mais je suis en train de reprendre tout un projet, donc pas mal de lignes à modifier et de choses qui changent.
    Je passe aussi le nom sous forme de string en référence à d'autres fonctions ; inutilisable donc.

    Si tu as une solution, mais je commence à douter et je pense que je vais devoir intégrer la boucle ce qui ne m'enchante pas trop.

  16. #16
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 127
    Par défaut
    Héhé, faut pas douter

    J'ai 2 solutions:

    La 1er c'est faire une liste avec tous les codeName les un a la suite des autres.
    Puis avec un Split, tu remplis un tableau de variant qui contiendra donc un code Name par cellule.

    Ensuite si tu veux la feuilleX, ben tu va chercher sont codeName placé en position X dans ton tableau.

    Sinon 2eme possibilité et c'est peut être améliorable, j'ai pas gratté plus que ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub essai()
    Dim strCodeName As String
    Dim StrNomOnglet As String
     
    strCodeName = "FeuilX"
    StrNomOnglet = ThisWorkbook.VBProject.VBComponents(strCodeName).Properties(7)
     
    ThisWorkbook.Sheets(StrNomOnglet).Select
     
    End Sub
    Par contre je ne sais pas si le nom de la feuille se trouvera toujours en Properties(7), je pense que oui, mais je ne peux pas te le certifier.

    ++
    Qwaz

    [Edit]
    J'ai corrigé le code
    [/Edit]

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  17. #17
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 127
    Par défaut
    Salut
    Voila, maintenant ça marchera toujours

    Je t'ai fais une petite function à placer dans un module, j'ai retourné carrément le sheet, mais on peut bien sur retourner juste le Nom de la feuille.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Function SheetByCodeName(aWorkbook As Workbook, aCodeName As String) As Worksheet
    Dim StrNomOnglet As String
        'On cherche le nom correspondant
        StrNomOnglet = aWorkbook.VBProject.VBComponents(aCodeName).Properties("Name")
        'On retourne la worksheet correspondant
        Set SheetByCodeName = aWorkbook.Sheets(StrNomOnglet)
     
    End Function
     
    'Et pour l'utilisation
    Sub EssaiUse()
    Dim strCodeName As String
    Dim MySheet as worksheet
     
    strCodeName = "Feuil" & 2
    SheetByCodeName(ThisWorkbook, strCodeName).Range("A1") = "Bingo!"
    'Ou encore
    Set MySheet = SheetByCodeName(ThisWorkbook, strCodeName)
     
    End Sub
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  18. #18
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 57
    Par défaut
    Meci beaucoup Qwazerty,

    J'avais vu ton premier post et étais en train de batailler avec la solution du tableau... j'ai sorti ça qui n'est pas du grand art car cela implique de nommer les onglets en Feuille_01... et de ne pas dépasser en numéro le nombre d'onglets ; c'est un peu lourd.
    Je n'ai pas compris l'histoire du split qui ne se fait que sur un string et qui ne me sort qu'un tableau de string... j'ai pas pu exploiter mieux qu'une variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
      Dim i As Integer
      Dim j As Integer
      Dim Feuille() As Worksheet
      ReDim Feuille(Worksheets.Count)
    'pour tous les onglets
      For i = 1 To Worksheets.Count
    'si le nom de l'onglet correspond au format souhaité
        If (Worksheets(i).CodeName Like "Feuille_##") Then
    'extraire le numéro
          j = CInt(Right(Worksheets(i).CodeName, 2))
    'referencer le tableau
          Set Feuille(j) = Worksheets(i)
        End If
      Next i
      Feuille(1).Range("A1").Value = "OK"
    Ton autre solution semble beaucoup plus efficace.

    Je vais voir.

    Merci encore.

  19. #19
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    si tu y tiens plutôt qu'un tableau tu peu utiliser une collection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Option Explicit
    Dim CodeNames As New Collection
    Sub InitCodeNames() 'A appeler une fois
      Dim f As Worksheet
     
      For Each f In ThisWorkbook.Worksheets
        CodeNames.Add f, f.CodeName
      Next
    End Sub
     
    Sub Test()
     InitCodeNames
      MsgBox CodeNames("MaFeuille_1").Name
    End Sub

  20. #20
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 127
    Par défaut
    Citation Envoyé par P4board Voir le message
    Je n'ai pas compris l'histoire du split qui ne se fait que sur un string et qui ne me sort qu'un tableau de string...
    N'en tiens pas compte, il n'est pas adapté dans ce cas, je pensais a autre chose bien moins pratique ^^'.

    La collection c'est pas mal en effet bbil, je n'y pense jamais, ça permet de directement pointer la feuille.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2010] Créer une feuille par variable
    Par Belphegor59 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 02/05/2013, 18h41
  2. [XL-2003] Formule faisant référence à une feuille par codeName
    Par delorvallois dans le forum Excel
    Réponses: 2
    Dernier message: 08/03/2010, 09h11
  3. [XL-2000] Appeler une feuille par son CodeName
    Par JOHN14 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/10/2009, 17h42
  4. [VBA Excel] Remettre toute une feuille par défaut
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/12/2005, 16h56
  5. [JCombobox] modif d'une jcombobox par rapport à une autre
    Par The Wretched dans le forum Composants
    Réponses: 2
    Dernier message: 21/03/2005, 10h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo