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 :

comment parcourrir les champs d'une colonne


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 133
    Points
    133
    Par défaut comment parcourrir les champs d'une colonne
    Bonjour;

    Je suis novice en vba excel, je veux savoir comment parcourir les champs remplis d'une colonne. C'est à dire :

    Lire la première cellule de la colonne
    Tant que colonne non vide
    Traitement.

    Merci de votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour Vacknov,

    Il y a comme toujours plusieurs solutions dont :

    si la colonne contenant les données est la C et si la 1ère ligne à traiter est la 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pl = 2
    dl = Range("C65536").End(xlUp).Row
     
    For i = pl to dl
    'traitement
    next i

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Bonjour jacques_jean,
    Citation Envoyé par vacknov qui aurait dit comme ça...
    Lire la première cellule de la colonne
    Tant que colonne non vide
    Ça ne serait pas un truc comme ça ?
    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
    Sub LeTest()
    Dim FL1 As Worksheet, Cel as range, CelCol as range
    Dim PlageLignes As Range, PlageCol As Range
        Set FL1 = Worksheets("Feuil1")
        DerniereLigne = FL1.Cells(Columns(1).Cells.Count, 1).End(xlUp).Row
        Set PlageLignes = FL1.Range("A1:A" & DerniereLigne)
        For Each Cel In PlageLignes
            Set PlageCol = FL1.Range(Cel.Address & ":" & FL1.Cells(Cel.Row, FL1.Cells(Cel.Row, Rows(Cel.Row).Cells.Count).End(xlToLeft).Column).Address)
            For Each CelCol In PlageCol
                 MsgBox CelCol
            Next
        Next
        Set PlageCol = Nothing
        Set PlageLignes = Nothing
    End Sub
    Bonne journée

    Edit
    @vacknov,
    Ce code parcourt la colonne A ligne par ligne et, pour chaque ligne, lit ce qu'il y a dans chaque colonne.
    Ce qu'il fait :
    Il définit la plage renseignée de la colonne A -> de la première à la dernière ligne (PlageLignes)
    Il parcourt cette plage
    A chaque ligne il définit la plage renseignée de la ligne -> De la première colonne à dernière colonne (PlageCol)
    Il parcourt cette plage et affiche le contenu de la cellule pour chaque colonne jusqu'à la dernière
    Puis il passe à la ligne suivante.

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Points : 520
    Points
    520
    Par défaut
    Une alternative consiste à concaténer toutes les cellules non-vides d'une plage à l'aide des méthodes SpecialCells() de l'objet Range() et Union de l'objet Application. Par la suite, on traite de façon appropristoutes les cellules résultant de ces opération, puisqu'elles ne sont pas vides. Le traitement ne se fait plus par colonne mais par cellule...

    Par exemple:
    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
     
     
    Sub LeTest()
        Dim rng As Range
        Dim rngNonVide As Range
        Dim C as Range
     
        Set rng = Feuil1.UsedRange
        Set rngNonVide = rng.SpecialCells(Type:=xlCellTypeConstants)
        Set rngNonVide = Union(rngNonVide, rng.SpecialCells(Type:=xlCellTypeFormulas))
     
        For Each C in rngNonVide
            ' Traitement de la cellule non vide, C
        Next C
     
        Set rng = Nothing
        Set rngNonVide = Nothing
    End Sub

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour Ouskel'nor,

    Il est vrai que j'ai compris qu'il voulait lancer un traitement sur les cellules renseignées d'une seule colonne.

    Mais on en saura peut-être plus demain ou lundi (en cas de pont !), car comme vous l'avez dit récemment, les questions et réponses ne se bousculent en dehors des heures de travail.

    Mais c'est sans doute le point fort de ce site : beaucoup d'utilisateurs à titre professionnel.

    Amicalement.

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Bonsoir Singular,
    J'avais pensé à SpecialCell mais je ne l'utilise plus après avoir eu une appli qui a tourné plusieurs minutes au lieu d'une fraction de seconde.
    Le fichier sur lequel je suis ne comporte que 8 colonnes et 75 lignes. Toutes les cellules de cette plage sont renseignées
    En faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set rng = Feuil1.UsedRange
        Set rngNonVide = rng.SpecialCells(Type:=xlCellTypeConstants)
        Set rngNonVide = Union(rngNonVide, rng.SpecialCells(Type:=xlCellTypeFormulas))
        MsgBox rngNonVide.Address
    j'obtiens
    "$G$1:$X$16,$B$16:$E$16,$A$1:$A$22,$A$23:$X$33,$O$35,$Z$36,$B$1:$F$15,$B$17:$X$22"
    Or je n'ai rien entre $G$1:$X$16, rien en Z36, rien en x22.
    Par contre, l'adresse que j'aurais dû obtenir est "A1:H75"
    Ceci dit, ta méthode me fait penser à une méthode quand même plus simple que ma précédente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub ParcourirColonnesChaqueLigne()
    Dim FL1 As Worksheet
    Dim Plage As Range, cel As Range
        Set FL1 = Worksheets("Feuil1")
        DerniereLigne = FL1.Cells(Columns(1).Cells.Count, 1).End(xlUp).Row
        DerniereColonne = Cells(1, Rows(1).Cells.Count).End(xlToLeft).Column
        Set Plage = FL1.Range(Cells(1, 1), Cells(DerniereLigne, DerniereColonne))
        For Each cel In Plage
            If Not cel Is Nothing Then MsgBox cel
        Next
        Set Plage = Nothing
    End Sub
    A+

  7. #7
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 133
    Points
    133
    Par défaut
    Merci premièrement pour l'interêt.

    Effectivement je traite une seule colonne. comme lorsque l'on cherche une date ou un nom dans une liste.

    Ce numero peut apparaitre n fois sur la même colonne bien entendu les lignes différentes : donc plusieurs enregistrement.

    1. Tri des données croissant ou decroissant aucune importance l'essentiel qu'on retrouve le même numero à la suite.

    2. Recherche du numero de la ligne sur la colonne specifier contenant la valeur passée en paramètre pour retourner le numero de cette dernière.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function My_index(value As Integer)  As Integer
    3. Compter le nombre d'engistrement et retourner ce dernier: lecture depuis My_index.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function My_count(My_index)  As Integer
    4. Utiliser My_index et My_count pour traiter les autres informations dans le fichier en se deplaçant :

    1. depuis My_index le long de la ligne à gauche ou à droite suivant l'emplacement de la colonne à lire.
    2. lire les autres lignes de la colonne jusqu'à My_count.

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    D'où l'intérêt de poser sa question de manière explicite dès le départ
    Tu as toujours une question ?
    Pour rechercher une valeur dans une colonne, tu as find et un très bon exemple dans l'aide en ligne avec une boucle qui te permet de retrouver et de comptabiliser toutes les occurences d'un mot dans une colonne.
    Il n'y a plus qu'à placer ce code dans une fonction à laquelle tu envoies la valeur cherchée et le N° de colonne en paramètre.
    Une seule procédure cherche la valeur et peut la comptabiliser.
    Ceci dit, je ne sais pas où tu prends l'index que tu passes en paramètre.
    Enfin, je n'ai toujours pas compris ce que tu veux faire des données de chaque colonne de ta ligne
    Tu dis
    A+

  9. #9
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 133
    Points
    133
    Par défaut
    vu que je n'ai pas de conaissance sur les différentes fonctions de l'api vba excel, j'ai procedé comme suite:

    fonction My_index() As Integer
    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
     
    Option Explicit
    Dim lecture
    Dim data
     
    Function My_index() As Integer
    Dim i
    Dim response
    lecture = Worksheets("recherche").Cells(3, 2).Value
     
    i = 0
    Dim s
    s = 0
     
    Do
    s = 2 + i
    data = Worksheets("feuil1").Cells(s, 9).Value
    If lecture = data Then
     
    My_index = s
    response = 1
    Else
            If lecture <> data And data = "" Then
            My_index = -1
            response = 1
            'MsgBox "aucune auccurence trouvée"
            End If
    End If
     
    i = i + 1
    Loop While response = 0
     
    End Function
    fonction My_count() as Integer
    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
     
    Function My_count() As Integer
     
    Dim i
    Dim c
    Dim s
    i = 0
    c = 0
     
    If My_index <> -1 Then
     
     
        Do
        s = My_index + i
        data = Worksheets("feuil1").Cells(s, 9).Value
        c = c + 1
        My_count = c
        i = i + 1
        Loop While data = lecture
     
    End If
     
    End Function
    function traitement()
    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
     
    Sub traitement()
    If Worksheets("recherche").Cells(3, 2).Value <> "" Then
    Dim i
    Dim j
    Dim s
    Dim d
    Dim f
     
    d = My_index                        ' case conserneé : début du curseur
    f = My_count + d - 1             ' fin  : fin du curseur
    i = 0
    j = 0
     
    For j = d To f
    s = d + i                              ' ligne en cours
     
    ' traitement de l'enregistrement
     
    i=i+1
    Next
    else
    MsgBox "vous devez saisir une code client"
    Worksheets("recherche").Activate
    End Sub

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    Find n'est pas une API mais une fonction Excel.
    Dans une macro de l'éditeur tu tape Find, tu le sélectionne et F1.
    A+

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Hello vacknov,
    Si ton code fonctionne, alors tu n'as pas de problème. S'il ne fonctionne pas, c'est qu'il contient une erreur. Si cette erreur est dans la méthode, le lire ne nous dira rien. C'est pourquoi, pour t'aider, il est nécessaire, que tu nous expliques en français (pas en code) ce que tu veux faire.
    Ce que j'ai compris :
    Tu as deux feuilles, une feuille "recherche" et une feuille "feuil1". Ok
    Tu lis une donnée dans la feuille "Recherche" colonne 2
    Après, comme tu n'incrémentes pas le N° de ligne de la valeur lue dans la feuille "Recherche", je ne comprends plus.
    Ce que je "suppose" c'est que tu cherches dans la feuil1, colonne 9, toutes les occurences de la valeur lue feuille "Recherche" colonne 2

    Commençons par là. Est-ce bien ce que tu veux ?
    A+

  12. #12
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 133
    Points
    133
    Par défaut
    effectivement, dans la feuille " rechecher" je lis simplement le code client que l'utilisateur saisi.

    Ensuite dans la feuille "feuil1" je recherche toute les occurences correspondant à la valeur lu precedemment. seulement sur la colonne 9 de la feuille "feuil1".

    je recupère le numero de la prèmère ligne qui contient la valeur recherchée.
    Après en fonction du numero de la ligne, je compte le nombre de fois que le code est répeté.


    Tout fonctionne bien et Merci beaucoup .

    Ma dernière demande : comment faire pour recuperer dans une variables les données d'une colonne sur plusieurs lignes, en éliminant les doublons ?

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Jète un oeil , AlainTech donne la méthode pour supprimer les lignes en double, tu remplaces simplement
    rCell.Offset(1, 0).EntireRow.Delete
    par un code qui masque simplement les doublons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          rCell.Offset(1, 0).EntireRow.Hidden = True
    Pour lire chaque ligne encore visible (sans doublon) tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
    Dim cell As Range, NoLigne as long
        For Each cell In Range("A:A").SpecialCells(xlCellTypeVisible)
            'ou cell contient tout ce que tu veux
            NoLigne = cell.Row
            MsgBox NoLigne & "  " & cell
        Next
    End Sub
    Pour lire chaque colonne de chaque ligne, je t'ai donné le code dans le premier message.
    Tu sauras adapter ?
    Si tu as un pb, tu dis
    A+

  14. #14
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 133
    Points
    133
    Par défaut
    au fait je ne cherche pas à supprimer les doublons en modfiant la structure du fichier. je garde les même informations. je lis toute la colonne comportant des doublons et à la fin je veux me debarasser des doublons.

    Je peux créer une fonction qui peux trier . Cependant je veux savoir es ce qu'il y'a une fonction qui peux trier un tableau.

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Pour trier ta feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Cells.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, _
            OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal
    Si tu n'as pas d'entête de colonne tu mets Header:=xlNo
    Sinon, cette ligne trie toute ta feuille selon la colonne A et commence en A2 parce que Header:=xlYes.
    Pour le code d'AlainTech, relis ce que je t'ai mis. Tu n'as qu'une ligne à changer pour masquer les doublons (non les supprimer) et, une fois ces lignes masquées, tu peux lire les lignes sans doublon (le code proposé). Un seul truc assez pénible, j'en conviens, faut lire !
    A+

  16. #16
    Membre habitué
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 133
    Points
    133
    Par défaut
    Bonsoir ouskel'n'or;

    Le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Range("J1:L20").Sort Range("J1"), xlAscending, Range("L1"), , xlAscending
    Permet de faire le tri de la plage J1:L20.

    Comment integrer les paramètres de tri :
    Order1
    Header
    OrderCustom
    MatchCase
    Orientation
    DataOption1

    Pour un tri sur deux colonnes ?

    Merci encore.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/06/2011, 20h33
  2. Réponses: 1
    Dernier message: 09/10/2008, 19h04
  3. Réponses: 2
    Dernier message: 15/05/2007, 10h34
  4. Comment remplir les champs d'une autre application ?
    Par rico32fr dans le forum C++Builder
    Réponses: 6
    Dernier message: 19/06/2006, 08h54
  5. Comment compter les doublons d'une colonne?
    Par Dnx dans le forum Langage SQL
    Réponses: 8
    Dernier message: 07/11/2005, 10h50

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