Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Declaration de variables dans une boucle

  • Initiateur de la discussion Initiateur de la discussion guigol
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

G

guigol

Guest
Bonjour,

J'aurais voulu savoir si on pouvait déclarer des variables dans une boucle.
Dans le fichier joint, il y a 4 sites (A, B, C et D), mais il arrive qu'il y en ait beaucoup plus.

je souhaite récuperer les valeurs du nom de site (C8, C19, ...) et du code site (C9, C20, ...) lorsqu'il y a un Oui dans Présence.

J'ai écrit le code suivant :
Code:
ligne = 7
    While Worksheets("3_Sites").Cells(ligne, 3) = "Oui" Or Worksheets("3_Sites").Cells(ligne, 3) <> ""
        Dim Nom_Site As String
        Nom_Site = Worksheets("3_Sites").Cells(ligne + 1, 3)
        Dim Code_Site As String
        Code_Site = Worksheets("3_Sites").Cells(ligne + 2, 3)
        ligne = ligne + 11
    Wend

j'imagine qu'il faut que je fasse évoluer les variables Nom_Site et Code_Site, mais je sèche.

Une idée?
 

Pièces jointes

Dernière modification par un modérateur:
Re : Declaration de variables dans une boucle

Bonsoir,

Tu ne peux pas créer des variables de façon dynamique mais tu peux utiliser un tableau à deux dimensions et le redimensionné au besoins afin de stocker le nom et le code de chaque site comme dans l'exemple ci-dessous :
Code:
Dim Tbl_Site() As String
Dim I As Integer
Dim Ligne As Long

Ligne = 7

If Worksheets("3_Sites").Cells(Ligne, 3) <> "" Then

    If Worksheets("3_Sites").Cells(Ligne, 3) = "Oui" Then
        I = I + 1
        ReDim Preserve Tbl_Site(1 To 2, 1 To I)
        
        'dans la dimension 1, le nom du site
        Tbl_Site(1, I) = Worksheets("3_Sites").Cells(Ligne + 1, 3)
        
        'dans la dimension 2, le code du site
        Tbl_Site(2, I) = Worksheets("3_Sites").Cells(Ligne + 2, 3)
        
        Ligne = Ligne + 11
        
    End If
    
End If

'indique les résultats
For I = 1 To UBound(Tbl_Site, 2)

    MsgBox Tbl_Site(1, I) & vbCrLf & Tbl_Site(2, I)
    
Next I
si tu veux accéder directement à certains sites par le code ou le nom, tu peux utiliser un dictionnaire, c'est juste un petit peu plus compliqué au début si tu ne l'as jamais fais mais dès qu'on a pigé c'est assez souple d'utilisation.

Hervé.
 
Re : Declaration de variables dans une boucle

Bonjour,

Voilà, je te montre un petit aperçu de ce qui peut être fait avec un dictionnaire. Les explications sont dans le code :
Code:
Sub Dictionnaire()
    
    Dim Plage As Range
    Dim Cel As Range
    Dim Dico As Object
    Dim ListeCle As Variant
    Dim Cle As Variant
    Dim ListeElement As Variant
    Dim Element As Variant
    Dim I As Integer
    
    'défini la plage
    With Worksheets("Feuil1")
     
        Set Plage = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
    
    End With
    
    'crée le dictionnaire
    Set Dico = CreateObject("Scripting.Dictionary")
    
    'parcour les cellules et ajoute au dico si la valeur n'existe pas
    'Attention, comme un dictionnaire peut aussi contenir des objets comme des cellules
    'il est important de préciser que c'est la valeur qu'on souhaite stocker même
    'si "Value" est la propriété par défaut de la cellule car "Dico.Add Cel.Value, Cel.Offset(0, 1).Value"
    'est différent de "Dico.Add Cel, Cel.Offset(0, 1)"
    For Each Cel In Plage

        If Dico.exists(Cel.Value) = False Then

            Dico.Add Cel.Value, Cel.Offset(0, 1).Value
            'la première "dimension", si on peut dire, est la clé et cette dernière est unique
            'c'est pour cette raison qu'on teste si elle existe déjà ou non. Si on teste pas
            'et qu'elle est déjà présente, une erreur se produit
            'la seconde "dimension", est l'élément que contient la clé par contre, ce dernier
            'peut être identique pour plusieur clés

        End If

    Next Cel

    'on peut remplir un tableau en ajoutant les clés et les éléments sans boucle et il peuvent être de
    'type différent
    Dico.Add "Clé 1", "guigol"
    Dico.Add "Clé 2", 20
    Dico.Add "Clé 3", #2/17/2013#
            
    'ici, dans une variable de type "Variant" on récupère la collection de clés du dico
    ListeCle = Dico.Keys
    
    'il suffit de parcourir la collection avec une boucle "For Next" ou "For Each Next"
    '(dans le second cas, il faut une variable de type "Variant") pour extraire
    'les noms de clés ou l'élément de la clé (ici, dans la fenêtre de débogage, Ctrl+G)
    For I = 0 To Dico.Count - 1

        Debug.Print ListeCle(I) '<-- nom de la clé
        Debug.Print Dico(ListeCle(I)) '<-- élément de la clé

    Next I
     
    For Each Cle In Dico.Keys
    
        Debug.Print Cle '<-- nom de la clé
        Debug.Print Dico(Cle) '<-- élément de la clé
        
    Next Cle
    
    'si on connaît le nom de la clé, on peut dans ce cas obtenir directement l'élément qui lui est attaché
    MsgBox Dico("Clé 2")
    
    'Si le nom de la clé est faux, il est possible de le modifier de la façon suivante
    'et ceci à la condition qu'il n'existe pas dans le dico (attention, ici Key est sans "s")
    Dico.Key("Clé 2") = "Clé 4"
    
    MsgBox Dico("Clé 4")
    
    'récupère la collection des éléments dans une variable de type "Variant"
    'il suffit de parcourir la collection avec une boucle "For Next" ou "For Each Next" comme pour
    'la collection de clés
    ListeElement = Dico.Items
    
    For I = 0 To Dico.Count - 1
    
        Debug.Print ListeElement(I)
        
    Next I
    
    For Each Element In Dico.Items
    
        Debug.Print Element
        
    Next Element
    
    'comme il est possible de modifier le nom d'une clé, il est donc aussi possible de modifier
    'la valeur de l'élément (ici aussi sans "s" à Item) mais à la différence des clés, les éléments
    'peuvent avoir la même valeur
    MsgBox Dico.Item("Clé 3")
    
    Dico.Item("Clé 3") = 5
    
    'ou directement
    Dico("Clé 3") = 5
    
    MsgBox Dico.Item("Clé 3")
    
    'il est possible de supprimer une clé du dico
    Dico.Remove "Clé 1"
    
    'ou de vider tout le dico
    Dico.RemoveAll
    
    Set Dico = Nothing

End Sub

Hervé.
 
Re : Declaration de variables dans une boucle

Merci, je pense avoir compris le principe.

Je remplace les cle1, cle2,.. par nom_site_A, noms_site_B, ... mais comment rendre cela adaptatif ?

jusqu’à maintenant, je faisais :
Code:
 Nom_Site = Worksheets("3_Sites").Cells(ligne + 1, 3)

j'ai adapté ton code en :
Code:
    Dim I As Integer
    Dim ligne As Integer
    Dim Dico_FT As Object
    Dim ListeCle As Variant
    Dim Cle As Variant
  
    
    'crée le dictionnaire
    Set Dico_FT = CreateObject("Scripting.Dictionary")
    
'Récupération variable dans l'onglet 3_Sites
ligne = 7
    While Worksheets("3_Sites").Cells(ligne, 3) = "Oui"
        I = I + 1
        Nom_Site = Worksheets("3_Sites").Cells(ligne + 1, 3)
        Code_Site = Worksheets("3_Sites").Cells(ligne + 2, 3)
        Lettre_Site = Right(Worksheets("3_Sites").Cells(ligne - 1, 2), 1)
        
        Dico_FT.Add "Nom_Site_" & Lettre_Site, Nom_Site
        Dico_FT.Add "Code_Site_" & Lettre_Site, Code_Site

        ligne = ligne + 11
    Wend

'    'ici, dans une variable de type "Variant" on récupère la collection de clés du dico
    ListeCle = Dico_FT.Keys
    For Each Cle In Dico_FT.Keys

        Debug.Print Cle '<-- nom de la clé
        Debug.Print Dico_FT(Cle) '<-- élément de la clé

    Next Cle
 
Re : Declaration de variables dans une boucle

Bonjour,

Un dictionnaire a seulement deux "dimensions", celle de la clé et celle de l'élément associé à la clé. Si tu veux utiliser un dico, il te faut concaténer les valeurs dans l'élément en les séparant avec, par exemple, le point-virgule pour ensuite les dissocier avec la fonction "Split". Sinon, il te faut utiliser un tableau à deux dimensions dont la première a trois positions du genre Tbl(1 to 3, 1 to x). Un exemple avec la fonction Split ci-dessous :
Code:
Sub Dictionnaire()

    Dim I As Integer
    Dim ligne As Integer
    Dim Dico_FT As Object
    Dim ListeCle As Variant
    Dim Cle As Variant
    Dim Nom_Site As String
    Dim Code_Site As String
    Dim Lettre_Site As String
    
    'crée le dictionnaire
    Set Dico_FT = CreateObject("Scripting.Dictionary")
    
    'Récupération variable dans l'onglet 3_Sites
    ligne = 7
    
    While Worksheets("3_Sites").Cells(ligne, 3) = "Oui"
        
        Nom_Site = Worksheets("3_Sites").Cells(ligne + 1, 3)
        Code_Site = Worksheets("3_Sites").Cells(ligne + 2, 3)
        Lettre_Site = Right(Worksheets("3_Sites").Cells(ligne - 1, 2), 1)
        
        'le dictionnaire ne pouvant contenir que la clé et l'élément, on concatène
        'le nom du site et les lettres qui lui sont ratachées, on les dissociera ensuite
        'à l'aide de la fonction "Split"
        If Dico_FT.exists("Code_Site_" & Code_Site) = False Then '<-- il faut faire la vérif !!!
        
            Dico_FT.Add "Code_Site_" & Code_Site, Nom_Site & ";" & Lettre_Site
        
        End If
        
        ligne = ligne + 11
        
    Wend

    'ici, dans une variable de type "Variant" on récupère la collection de clés du dico
    ListeCle = Dico_FT.Keys
    
    For Each Cle In Dico_FT.Keys

        Debug.Print Cle '<-- nom de la clé
        
        'ici, on dissocie le nom du site de ses lettres
        Debug.Print Split(Dico_FT(Cle), ";")(0) '<-- 1er élément de la clé
        Debug.Print Split(Dico_FT(Cle), ";")(1) '<-- 2ème élément de la clé

    Next Cle
    
End Sub

Hervé.
 
Re : Declaration de variables dans une boucle

Bonsoir,

Code:
Dico_FT.Add "Nom_Site_" & Lettre_Site, Nom_Site
Dico_FT.Add "Code_Site_" & Lettre_Site, Code_Site
en faisant ça, tu dissocie les valeurs qui sont sensées être en rapport les unes avec les autres, le nom du site, les lettres correspondantes au site et le code du site.
Dans ce cas, le mieux est de créer un tableau comme je te l'ai dis précédemment. Voici un petit exemple :
Code:
Sub Tableau()

    Dim Tbl() As String
    Dim Nom_Site As String
    Dim Code_Site As String
    Dim Lettre_Site As String
    Dim I As Integer
    
    For I = 1 To 10
        
        Nom_Site = Cells(I, 1) 'en colonne A
        Lettre_Site = Cells(I, 2) 'en colonne B
        Code_Site = Cells(I, 3) 'en colonne C
        
        'redimensionne le tableau. La 1ère dimension (1 To 3) ne peut jamais être redimensionnée
        'on doit la dimensionner une seule fois, ce qui est logique, sinon on aurai des "trous"
        'Seule la seconde peut l'être. "Preserve" sert à garder en mémoire les valeurs
        'précédemment entrées
        ReDim Preserve Tbl(1 To 3, 1 To I)
        
        'de cette façon, chaque "ligne" du tableau correspond à un site mais dans ce cas
        'il n'est pas possible d'utiliser le nom du site, les lettres du site ou son code
        'pour y avoir accès directement. Pour ça, il faut boucler jusqu'à trouver la correspondance
        Tbl(1, I) = Nom_Site
        Tbl(2, I) = Lettre_Site
        Tbl(3, I) = Code_Site
    
    Next I
    
    For I = 1 To UBound(Tbl, 2)
    
        Debug.Print "Nom du site : " & Tbl(1, I)
        Debug.Print "Lettres du site : " & Tbl(2, I)
        Debug.Print "Code du site : " & Tbl(3, I)
        
    Next I
    
End Sub

Hervé.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
3
Affichages
878
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…