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 :

[VBA Excel] Parcourir une zone de cellules


Sujet :

Macros et VBA Excel

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 949
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 949
    Points : 15 408
    Points
    15 408
    Par défaut [VBA Excel] Parcourir une zone de cellules
    Bonjour,

    Je suis nouveau sur ce forum (et en VBA) et ne sais pas trop où et comment rechercher, donc je me permets de poster afin que l'un(e) de vous me propose une direction.
    J'ai regardé la FAQ mais n'y ai pas trouvé mon bonheur.

    Voilà, en supposant une feuille Excel comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    _|__A__|__B__|__C__|...
    1| bla
    2| bli
    3| blo
    4|
    • Comment dois-je faire pour parcourir la colonne A tant qu'il y a qqchose, aux fins de chargement des Items d'une ComboBox ?
    • Si l'utilisateur, après chargement de la ComboBox, saisit "blu" dans la zone de texte (ou dans un TextEdit), comment faire, lors d'un clic sur un bouton, pour que cette nouvelle chaîne soit ajoutée à ma colonne ?
    • Enfin, si l'utilisateur a choisi "bli", comment récupérer les données des colonnes B, C, ... de la ligne "bli" ?


    Désolé pour ce post qui va paraître très basique à certains, mais c'est pour dépanner un pote dans l'urgence, alors voilà...
    Merci d'avance de vos lumineuses réponses.
    --
    Jean-Pierre

  2. #2
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Pour parcourir la colonne A, tu peux utiliser un objet Range comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Cellule As Range
    For Each Cellule In Range("a1:a" & Range("a65536").End(XlUp).Row)
        ...
        ...
    Next Cellule
    Pour charger ton combo, tu peux utiliser directement la plage concernée, soit via Excel, soit en modifiant la propriété RowSource du combobox au chargement de la boite de dialogue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    combobox1.rowsource=range("a1:a" & range("a65536").End(xlUp).Row).Address
    Pour retrouver les valeurs des colonnes B, C et suivantes en fonction d'une valeur de A, je propose l'utilisation d'une fonction qui renvoie l'objet Range souhaité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Function GetCelluleSelonValeur(Valeur As String) As Range
        Dim Cellule As Range
        For Each Cellule In Range("a1:a" & Range("a65536").End(xlUp).Row)
            If Cellule.Value = Valeur Then
                Set GetCelluleSelonValeur = Cellule
                Exit For
            End If
        Next Cellule
     
        Set Cellule = Nothing
    End Function
    Tu utilises alors cette fonction dans ton code, par exemple comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Dim Cellule As Range
     
        Set Cellule = GetCelluleSelonValeur("Pierre")
        Debug.Print Cellule(1, 2)
    On pourrait utiliser la méthode Find, mais il faut faire attention aux filtres et aux lignes ou colonnes masquées. Si ton tableau ne compte pas 65000 lignes, l'itération est rapide.

    Cellule(x,y) renvoie la cellule se trouvant sur la xième ligne et à la yième colonne par rapport à cellule, cellule(1,1) = Cellule
    x et y peuvent être négatifs, dans les limites d'Excel, ou valoir 0.
    Si l'adresse de Cellule est B4, adresse de cellule(1,1) = B4, adresse de cellule(3,4) = D7, adresse de cellule(0,0) = A3, adresse de Cellule(1,-1) = B2. Cellule(-1,1) renvoie une erreur car on sort des limites d'excel

  3. #3
    Expert éminent sénior


    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
    Points : 20 040
    Points
    20 040
    Par défaut
    tiens j'avais envie d'écrire un peu de VBA (avant de passer au C++ ) voici un début de code...
    place dans un userform
    • un combo box (combox1 ) pour sélectionner colonne 1 de ta zone de donnée ou saisir nouvelle valeur
    • un text box (textbox1) pour afficher où saisir la valeur colonne 2
    • un bouton CommandButton1 pour lancer l'ajout..
    • Dans ta feuille de calcul "Feuil1" les données en A1..
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    '
    ' Initialisation
    '
    Private Sub UserForm_Initialize()
        MajRowSource
        MajBoutonAjout
    End Sub
    '
    ' Mise à jour "RowSource" du combobox1
    '
    Sub MajRowSource()
       ComboBox1.RowSource = "feuil1!" & ThisWorkbook.Sheets("Feuil1").Range("A1").CurrentRegion.Address
    End Sub
     
    '
    ' Mise à jour textbox1 (2° colonne)
    ' sur changement de selection  dans combo
    Private Sub ComboBox1_Change()
      MajBoutonAjout
      With ComboBox1
       If .ListIndex > 0 Then
         TextBox1 = .List(.ListIndex, 1)
        End If
      End With
    End Sub
    '
    ' Gestion du "grisé" bouton ajout
    '
    Private Sub MajBoutonAjout()
      CommandButton1.Enabled = ComboBox1.ListIndex = -1 And ComboBox1 <> "" And TextBox1 <> ""
    End Sub
    '
    ' Action sur bouton ajout
    '
    '
    Private Sub CommandButton1_Click()
     If ComboBox1.ListIndex = -1 And ComboBox1 <> "" And TextBox1 <> "" Then
         Dim r As Range
         Set r = Range(ComboBox1.RowSource)
         'Rajoute la ligne
          Set r = Union(r, r.Offset(1, 0))
           r.Cells(r.Rows.Count, 1) = ComboBox1
           r.Cells(r.Rows.Count, 2) = TextBox1
           MajRowSource
     End If
      MajBoutonAjout
    End Sub
     
    Private Sub TextBox1_Change()
     MajBoutonAjout
    End Sub

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 949
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 949
    Points : 15 408
    Points
    15 408
    Par défaut
    Mille mercis pour vos réponses rapides et documentées.
    Avec tout ça, je dois pouvoir m'en sortir.
    --
    Jean-Pierre

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 949
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 949
    Points : 15 408
    Points
    15 408
    Par défaut
    Yep !

    Je garde le "Résolu" (ça bricole, ça bricole...), mais je ne voudrais pas mourir idiot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ' Mise à jour textbox1 (2° colonne)
    ' sur changement de selection  dans combo
    Private Sub ComboBox1_Change()
      MajBoutonAjout
      With ComboBox1
       If .ListIndex > 0 Then
         TextBox1 = .List(.ListIndex, 1)
        End If
      End With
    End Sub
    La ComboBox1 est bien populated, mais cette chose m'insulte avec "Impossible de lire la propriété List. Argument non valide" sur la ligne TextBox1 = ...
    J'ai essayé en forçant (des fois on essaye n'importe quoi, ) comme ça :
    TextBox1.Text = ComboBox1.List(ComboBox1.ListIndex, 1)
    pas mieux...
    Et l'aide n'est pas terrible sur ce coup-là.
    Merci,
    --
    Jean-Pierre

  6. #6
    Expert éminent sénior


    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
    Points : 20 040
    Points
    20 040
    Par défaut
    "est t bien populated," ..? qu'est que c'est ...

    le code est bien placé dans la feuille de code associé à ton userform..?

    Version d'excel...?

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 949
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 949
    Points : 15 408
    Points
    15 408
    Par défaut
    "est bien populated," ..? qu'est que c'est
    Ben, c'est qu'il est bien rempli par la fonction précédente.

    le code est bien placé dans la feuille de code associé à ton userform..?
    Vi !
    Version d'excel...?
    9.0.2812, VBA 6.0.8435

    Et si je remplace cette procédure par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Worksheets("MaFeuille").Select
        TextBox1 = ActiveSheet.Range("b" & ComboBox1.ListIndex + 2)
    celle-ci fonctionne.
    Merci d'avance, désolé pour le dérangement,
    --
    Jean-Pierre

  8. #8
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 949
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 949
    Points : 15 408
    Points
    15 408
    Par défaut
    Bonjour à toutes et à tous.

    Désolé pour le Up, mais comme dit le 24, "je ne voudrais pas mourir idiot" et si globalement c'est "résolu", il me reste cette interrogation qui m'empèche de dormir,
    Merci de vos lumières, bonne journée,
    --
    Jean-Pierre

  9. #9
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Bonjour

    Il faut noter que les lignes et colonnes d'un combobox commencent à l'index 0.

    Dès lors, lorsque tu testes
    tu loupes la 1ère ligne, sauf si c'est une ligne de titre...

    Tu as peut-être un problème similaire pour tes colonnes. L'appel de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... textbox1= .list(.listindex,1)
    renvoie la deuxième colonne de ton combo. Si tu n'as qu'une colonne dans celui-ci, tu auras un message d'erreur!

    Ok?

  10. #10
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 949
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 949
    Points : 15 408
    Points
    15 408
    Par défaut
    Bien vu !

    ... textbox1= .list(.listindex,1) ---> ... textbox1= .list(.listindex, 0)

    Merci infiniment,
    --
    Jean-Pierre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trier une plage de cellules
    Par Squelet dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 03/12/2019, 13h04
  2. [VBA-excel] Affecter une date à la première cellule pleine
    Par DVano dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 10/11/2006, 12h06
  3. [VBA-Excel]Supprimer une colonne entiere basee sur une cellule
    Par Tartenpion dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/10/2006, 22h08
  4. [VBA][Excel] importer une zone délimitée de texte
    Par Amanck dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/12/2005, 14h59
  5. [VBA] Parcourir une plage de cellule
    Par Dinytro dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/09/2005, 08h18

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