Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de boucle avec Nombre de ligne en fonction d'une plage nommée

8 réponses
Avatar
Alex
Bonsoir =E0 tous,

Je rencontre un probl=E8me de boucle ou de compteur, en fonction d'une
plage Nomm=E9e, et m'en explique :

Je vous explique ma logique de construction VBA. J'ai une feuil1,
trier sur la colonne A, afin que toutes les m=EAmes donn=E9es se suivent.
A partir de A2, que j'ai nomm=E9e "Debut", je controle l'ensemble des
lignes suivantes, et m'arr=EAte sur la derni=E8re portant la m=EAme valeur
que "D=E9but" et je la nomme "Fin". Je d=E9finie la plage (debut, fin) que
j'ai nomm=E9 "LigneDeTravail", je proc=E8de au comptage des lignes de la
plage "LigneDeTravail" pour d=E9finir le compteur de ma boucle.

L=E0 commence sans doute les probl=E8mes...

Et dans ma boucle, je mets un conditions afin de positionner sur une
nouvelles feuille, les donn=E9es =E0 un endroit sp=E9cifique qui r=E9pond =
=E0 la
condition.

Mais voil=E0, j'ai l'impression que ma boucle reste toujours bloqu=E9 sur
ma premi=E8re ligne et qu'elle la contr=F4le autant de fois que mon nombre
de ligne calcul=E9 sur mon "LigneDeTravail".

J'ai mis le fichier sous ci-joint.fr :

http://www.cijoint.fr/cjlink.php?file=3Dcj201004/cij8Vi80YV.xls

Je vous remercie par avance de votre aide.
Cordialement.
Alex

8 réponses

Avatar
michdenis
Bonjour,

Pour ce qui est de ta boucle, tu peux procéder de cette façon :
Pour ce qui est le reste de ta macro, il faudra que tu expliques
ce que tu désires obtenir comme résultat si tu as besoin d'aide.

'-------------------------------------------------
Sub test()
Dim X As Long, DerLig As Long, Nb As Long
Dim A As Long, B As Long

'Valeur initiale de la première ligne où il y a une donnée
'la première ligne est l'étiquette de colonne
x = 2
With Worksheets("Feuil1")
'Nb = Dernière ligne occupée par une donnée de la colonne A
nb = .Range("A65536").End(xlUp).Row
With .Range("A:A")
'Boucle jusqu'au moment où x sera égale à nb
Do While x <= nb
'DerLig : Représente la dernière ligne occupé par une donnée
' appartenant au même groupe
DerLig = .Find(What:=.Item(x, 1), _
LookIn:=xlValues, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Row

'Pour boucler sur chaque ligne de chaque groupe
'Tu appliques le traitement que tu désires pour
'chaque cellule. Exemple copie les données en feuil3
For a = x To DerLig
b = b + 1
.Item(a, 1).Copy Worksheets("Feuil3").Range("A" & b)
Next

x = DerLig + 1
Loop
End With
End With
End Sub
'-------------------------------------------------

Voilà pour le principe de la boucle.



"Alex" a écrit dans le message de groupe de discussion :

Bonsoir à tous,

Je rencontre un problème de boucle ou de compteur, en fonction d'une
plage Nommée, et m'en explique :

Je vous explique ma logique de construction VBA. J'ai une feuil1,
trier sur la colonne A, afin que toutes les mêmes données se suivent.
A partir de A2, que j'ai nommée "Debut", je controle l'ensemble des
lignes suivantes, et m'arrête sur la dernière portant la même valeur
que "Début" et je la nomme "Fin". Je définie la plage (debut, fin) que
j'ai nommé "LigneDeTravail", je procède au comptage des lignes de la
plage "LigneDeTravail" pour définir le compteur de ma boucle.

Là commence sans doute les problèmes...

Et dans ma boucle, je mets un conditions afin de positionner sur une
nouvelles feuille, les données à un endroit spécifique qui répond à la
condition.

Mais voilà, j'ai l'impression que ma boucle reste toujours bloqué sur
ma première ligne et qu'elle la contrôle autant de fois que mon nombre
de ligne calculé sur mon "LigneDeTravail".

J'ai mis le fichier sous ci-joint.fr :

http://www.cijoint.fr/cjlink.php?file=cj201004/cij8Vi80YV.xls

Je vous remercie par avance de votre aide.
Cordialement.
Alex
Avatar
Alex
Bonjour Denis,

Merci de ta réponse. Oui bien sur que je veux de ton aide.
A la lecture, de ta proposition, il me semble que celle-ci va générer
une boucle sur l'ensemble des lignes de la base de données, alors que
moi, je voulais uniquement travailler sur une plage en fonction du nom
de ma cellule de départ. Je prends la valeur de ma première cellule,
et recherche la dernière ligne ayant la même valeur ce qui détermine
ma plage, je fais ma boucle. Ma boucle terminée, je voulais reprendre
la même chose, mais cette fois ci avec la plage de donnée suivante.

Pour que cela soit plus clair, je te marque étape par étape ce que je
voulais faire :

1. En partant de A2, je cherche la dernière cellule ayant la même
valeur que A2, A2 = Début, et Fin pour dernière cellule ayant la mê me
valeur, pour déterminer ma zone de travail de boucle.
2. Cette plage étant déterminée, je copie mon onglet Modèle, qui
devient Modèle (2) (que je ne renomme pas tout de suite pour me
faciliter le va et viens entre les deux feuilles)
3. Je reviens sur ma feuil1, je veux faire une boucle uniquement sur
ma zone de travail, la boucle consistant à vérifier des conditions qui
déterminera le positionnement des données de la ligne active sur ma
feuille Modele 2.
Exemple :
• Si valeur de la cellule de la ligne active en colonne B de ma zone
de travail est 1 et que la cellule de la ligne active en colonne C de
ma zone de travail est D (D = porte de Droite)
a. Les conditions sont respectées :
* alors Copie cellule B et C de ma ligne active et va te positionner
sur ma feuille Modele2, en C9, en collage transposée
* Reviens sur feuil et copie cellule D et E de ma ligne active et va
te positionner sur ma feuille Modèle2 en D9 en collage transposée.
(Ici pour mon test je me contentais de deux fois deux colonnes, sur ma
version finale, j'aurai deux fois 9 colonnes. En fait, si la condition
est respectée, il faut scinder ma ligne de données en deux colonnes
sur ma feuille modèle 2. (Sur ma feuille base ma ligne fait 18
colonnes 1 ligne, et sur ma feuille Modèle la même ligne fait 2
colonnes de 9 lignes, et positionner à un endroit spécifique))
b. Les conditions ne sont pas respectées :
* Passe à la ligne suivante, jusqu'à la fin de ma zone de travail.
* Si arrivée à la fin de la zone de travail, pas de données
correspondantes, tu passes à la conditions suivantes, qui sera la même
chose ou seul la condition change à savoir l'étage 1 ne bouge pas, par
contre Porte devient F au lieu de D.
et ainsi de suite.
4. Ma zone de travail étant entièrement balayée, je nomme ma feuille
avec le nom de l'immeuble. (Debut valeur)
5. Sur ma base, je me positionne sur ma Fin, je descends de 1 ligne
vers le bas, et la nouvelle cellule devient la nouvelle zone Début,
puis reprends la recherche de la nouvelle Fin pour définir la nouvelle
zone de travail, et reprends les points de 2 à 5, jusqu'à la fin de ma
base de données.
J'obtiens ainsi un onglet par immeuble avec mes données classées.

J'espère que mon explication est bien compréhensible, et qu'elle te
permettra de m'aider. (Sourire)
Avec mes remerciements.
Alex
Avatar
Alex
Re Bonjour à Tous,

Je reviens vers vous pour savoir, si j'ai une cellule nommé debut
(1ere cellule des lignes que je veux controler) et une autre fin (1ere
cellule de la derniere ligne que je veux controler), que j'ai nommé de
la façon suivante :

debut = ActiveCell.Address
ActiveCell.Name = "Debut"

Est il possible de faire une boucle de type :

For i = début to fin
if....
...
End if
next i

Meri par avance de vos réponses.
Cordialement.
Alex
Avatar
michdenis
La macro est dans le module2 de ton classeur:

Tu devrais avoir une bonne idée comment fonctionne la boucle
http://cjoint.com/?ejuoiq4uZR




"Alex" a écrit dans le message de groupe de discussion :

Re Bonjour à Tous,

Je reviens vers vous pour savoir, si j'ai une cellule nommé debut
(1ere cellule des lignes que je veux controler) et une autre fin (1ere
cellule de la derniere ligne que je veux controler), que j'ai nommé de
la façon suivante :

debut = ActiveCell.Address
ActiveCell.Name = "Debut"

Est il possible de faire une boucle de type :

For i = début to fin
if....
...
End if
next i

Meri par avance de vos réponses.
Cordialement.
Alex
Avatar
Alex
Bonjour Denis,

Merci pour ta réponse, ainsi que le fichier joint, cela m'a permis de
bien faire ce que je voulais.

Malheureusement, on est pas à l'abris d'un petit problème, j'ai
utilisé une fonction goto à la fin de ma boucle, afin de répeter ma
boucle, mais sur d'autres plage de travail, mais voilà cela coince sur
l'une de tes lignes de commande à savoir :

With .Range("A:A")

avec le message suivant :

Erreur d'Exécution '91' :
Variale Objet ou variable non définie de bloc With non définie.

J'ai mis sur ci-joint.fr le fichier, si tu peux me dire ce qui ne va
pas ;-)

http://www.cijoint.fr/cjlink.php?file=cj201004/cijKiDYpLk.xls

En tout cas Encore un grand merci

Alex



PS : Sinon pour info pour ceux qui sont évantuellement interessé,
cette macro une fois fini pourra aussi être utiliser par des
enseignants qui désirent faire un plan de classe rang par rang de
Droite à Gauche ...
Avatar
Caetera
Beaucoup plus simple : laisser tomber les boucles et faire une succession de
filtres sur ta base avec des copier/coller/transposé

Etc
Avatar
michdenis
Bonjour,


La ligne With .Range("A:A") fait référence à la commande
With Worksheets("BASE") un peu plus haute. Le "." devant
range signifie que cette plage de cellule appartient à la
feuille "Base".

Lorsque tu as inséré ton goto, il tente de refaire la boucle
à partir de ton étiquette "Recommencer" mais cette dernière
est située entre With Worksheets("BASE") et With .Range("A:A")
et Excel n'arrive plus à savoir à quoi .Range("A:A") fait référence,
il n'arrive plus à associer la plage de cellule avec la feuille, résultat
il te renvoie une erreur.

Une façon très compliquée de résoudre le problème :
A ) tu enlèves le "point" devant le mot range
B ) Juste AVANT LA LIGNE ou tu utilises l'expression GoTo pour
reprendre la boucle, ajoute la ligne de code
Worksheets("BASE").select
Afin d'être sûr que tu vas te retrouver sur la bonne feuille pour
la suite des opérations.
C ) Attention, la procédure utilise la cellule active en colonne A:A de
la feuille base, si tu ne modifies pas la sélection, tu vas répéter 2 fois
la même action... peut-être après avoir ajouter la ligne de code de l'item "B"
tu devrais sélectionner une autre cellule de la colonne "A:A" avant d'effecteur
le "GoTo"... à toi de voir !







"Alex" a écrit dans le message de groupe de discussion :

Bonjour Denis,

Merci pour ta réponse, ainsi que le fichier joint, cela m'a permis de
bien faire ce que je voulais.

Malheureusement, on est pas à l'abris d'un petit problème, j'ai
utilisé une fonction goto à la fin de ma boucle, afin de répeter ma
boucle, mais sur d'autres plage de travail, mais voilà cela coince sur
l'une de tes lignes de commande à savoir :

With .Range("A:A")

avec le message suivant :

Erreur d'Exécution '91' :
Variale Objet ou variable non définie de bloc With non définie.

J'ai mis sur ci-joint.fr le fichier, si tu peux me dire ce qui ne va
pas ;-)

http://www.cijoint.fr/cjlink.php?file=cj201004/cijKiDYpLk.xls

En tout cas Encore un grand merci

Alex



PS : Sinon pour info pour ceux qui sont évantuellement interessé,
cette macro une fois fini pourra aussi être utiliser par des
enseignants qui désirent faire un plan de classe rang par rang de
Droite à Gauche ...
Avatar
Alex
Super Denis, cette fois c'est la bonne... Merci

Pour info, j'ai juste déplacé mon étiquette "Recommencer" juste au
dessus du With Worksheets("BASE"), en fait mon étiquette était
simplement mal placé.

Merci encore et à bientôt ;-))))

Alex