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.
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.
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
Bonjour jacques_jean,
Ça ne serait pas un truc comme ça ?Envoyé par vacknov qui aurait dit comme ça...
Bonne journée
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
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.
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
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.
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
j'obtiens
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
"$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 :
A+
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
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.
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_index(value As Integer) As Integer
4. Utiliser My_index et My_count pour traiter les autres informations dans le fichier en se deplaçant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part function My_count(My_index) As Integer
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.
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+
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
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
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
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 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
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
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+
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+
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 ?
Jète un oeil là, AlainTech donne la méthode pour supprimer les lignes en double, tu remplaces simplement
par un code qui masque simplement les doublons :rCell.Offset(1, 0).EntireRow.Delete
Pour lire chaque ligne encore visible (sans doublon) tu as
Code : Sélectionner tout - Visualiser dans une fenêtre à part rCell.Offset(1, 0).EntireRow.Hidden = True
Pour lire chaque colonne de chaque ligne, je t'ai donné le code dans le premier message.
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
Tu sauras adapter ?
Si tu as un pb, tu dis
A+
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.
Pour trier ta feuille :
Si tu n'as pas d'entête de colonne tu mets Header:=xlNo
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
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+
Bonsoir ouskel'n'or;
Le code suivant :
Permet de faire le tri de la plage J1:L20.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Range("J1:L20").Sort Range("J1"), xlAscending, Range("L1"), , xlAscending
Comment integrer les paramètres de tri :
Order1
Header
OrderCustom
MatchCase
Orientation
DataOption1
Pour un tri sur deux colonnes ?
Merci encore.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager