OVH Cloud OVH Cloud

Modifier une sélection

14 réponses
Avatar
Michel
Bonjour à tout le monde,

Voici ma petite question :

est-il possible de modifier une sélection de plage à volonté. J'ai écrit
ceci :

Range("A4:L34,A39:L98,A104:L111,A116:L136,A141:L167,A172:L174,A179:L181,A186
:L188"). _
Select

Lorsque que j'insère ou supprime des lignes dans cette sélection, je
voudrais que cela soit mis à jour dans ce code automatiquement. (Peut-être
avec des variables?)

Merci à tout le monde

--
Michel TAF

4 réponses

1 2
Avatar
FFO
Rebonjour Michel

Effectivement tout s'explique
A la fois le Bug que tu mentionnes et les lignes qui ne se masquent pas

La suite d'instruction :

Selection.Find(What:="",
After:¬tiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart).Activate

Nécessite qu'il y est au moins une cellule colonne M vide à trouver sinon le
Bug

Comme tes lignes et certainement la cellule colonne M sont avec des formules
elle ne sont pas considérées comme vide par Excel

Pour éviter le Bug il faut faire précéder les lignes d'instruction par :

On Error Resume next

Ce qui donne :

On Error Resume Next
Selection.Find(What:="",
After:¬tiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart).Activate

Celà ne résoud pas le masquage des lignes avec un pseudo vide

Fort de ces éléments nouveaux je te propose ce nouveau code :

Colonne1 = "A"
Colonne2 = "L"
Balise = 1
Colonne3 = "M"
Lettre = Colonne1
On Error Resume Next
Columns(Colonne3 & ":" & Colonne3).Find(What:ºlise, After:=Range(Colonne3
& "1"), LookIn:=xlFormulas, LookAt _
:=xlPart).Activate
A = ActiveCell.Row
Départ = ActiveCell.Address
Séparateur = ":"
For i = 1 To Range(Colonne3 & "65535").End(xlUp).Row
Chaine1 = Chaine1 & Lettre & ActiveCell.Row & Séparateur
Chaine2 = Chaine2 & "A" & ActiveCell.Row & Séparateur
If Séparateur = ":" Then
Lettre = Colonne2
Séparateur = ","
Else
Lettre = Colonne1
Séparateur = ":"
End If
Columns(Colonne3 & ":" & Colonne3).FindNext(After:¬tiveCell).Activate
If ActiveCell.Address = Départ Then
Exit For
End If
Next
Range(Mid(Chaine2, 1, Len(Chaine2) - 1)).Select
On Error Resume Next
Selection.Find(What:="", After:¬tiveCell, LookIn:=xlValues, LookAt _
:=xlPart).Activate
Départ = ActiveCell.Address
For j = 1 To Range(Colonne3 & "65535").End(xlUp).Row
k = 0
Do While Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Value = ""
And Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address <>
Range("IV" & ActiveCell.Row).Address
k = k + 1
Loop
If Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address =
Range("IV" & ActiveCell.Row).Address Then
ActiveCell.EntireRow.Hidden = True
End If
Selection.FindNext(After:¬tiveCell).Activate
If ActiveCell.Address = Départ Then
Exit For
End If
Next
Range(Mid(Chaine1, 1, Len(Chaine1) - 1)).Select


Celà devrait enfin fonctionner

Sur ce lien mon exemple corrigé ainsi

http://www.cijoint.fr/cjlink.php?file=cj200807/cijHsLjf7w.xls.

J'ai inséré des formules de la colonne B à L dans les lignes de sélection

Le traitement est légèrement plus long mai c'est négligeable

Fais des essais et dis moi !!!!!
Avatar
Michel TAF
Et bien je n'est plus quà ne remercier de bien bas. çà fonctionne très bien.
Juste pour mon info perso, si tu peux me donner les explications sur les
codes suivants :

1)On Error Resume next

2)A = ActiveCell.Row => à Quoi nous sert ce A

3)Départ = ActiveCell.Address => on fixe une adresse dans Départ
If ActiveCell.Address = Départ Then => est ce que çà veut dire que si la
feuille est vide il ne crée pas de chaine1 et chaine2 car il sort de la
boucle ??
LookAt:=xlPart => est ce un sens de recherche ?

4)
Et je ne comprend rien à çà :
Do While Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Value = ""
And Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address <>
Range("IV" & ActiveCell.Row).Address




Merci pour ces dernières explications

Michel


"FFO" a écrit dans le message de
news:
Rebonjour Michel

Effectivement tout s'explique
A la fois le Bug que tu mentionnes et les lignes qui ne se masquent pas

La suite d'instruction :

Selection.Find(What:="",
After:¬tiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart).Activate

Nécessite qu'il y est au moins une cellule colonne M vide à trouver sinon


le
Bug

Comme tes lignes et certainement la cellule colonne M sont avec des


formules
elle ne sont pas considérées comme vide par Excel

Pour éviter le Bug il faut faire précéder les lignes d'instruction par :

On Error Resume next

Ce qui donne :

On Error Resume Next
Selection.Find(What:="",
After:¬tiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart).Activate

Celà ne résoud pas le masquage des lignes avec un pseudo vide

Fort de ces éléments nouveaux je te propose ce nouveau code :

Colonne1 = "A"
Colonne2 = "L"
Balise = 1
Colonne3 = "M"
Lettre = Colonne1
On Error Resume Next
Columns(Colonne3 & ":" & Colonne3).Find(What:ºlise,


After:=Range(Colonne3
& "1"), LookIn:=xlFormulas, LookAt _
:=xlPart).Activate
A = ActiveCell.Row
Départ = ActiveCell.Address
Séparateur = ":"
For i = 1 To Range(Colonne3 & "65535").End(xlUp).Row
Chaine1 = Chaine1 & Lettre & ActiveCell.Row & Séparateur
Chaine2 = Chaine2 & "A" & ActiveCell.Row & Séparateur
If Séparateur = ":" Then
Lettre = Colonne2
Séparateur = ","
Else
Lettre = Colonne1
Séparateur = ":"
End If
Columns(Colonne3 & ":" & Colonne3).FindNext(After:¬tiveCell).Activate
If ActiveCell.Address = Départ Then
Exit For
End If
Next
Range(Mid(Chaine2, 1, Len(Chaine2) - 1)).Select
On Error Resume Next
Selection.Find(What:="", After:¬tiveCell, LookIn:=xlValues, LookAt _
:=xlPart).Activate
Départ = ActiveCell.Address
For j = 1 To Range(Colonne3 & "65535").End(xlUp).Row
k = 0
Do While Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Value ""
And Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address <>
Range("IV" & ActiveCell.Row).Address
k = k + 1
Loop
If Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address > Range("IV" & ActiveCell.Row).Address Then
ActiveCell.EntireRow.Hidden = True
End If
Selection.FindNext(After:¬tiveCell).Activate
If ActiveCell.Address = Départ Then
Exit For
End If
Next
Range(Mid(Chaine1, 1, Len(Chaine1) - 1)).Select


Celà devrait enfin fonctionner

Sur ce lien mon exemple corrigé ainsi

http://www.cijoint.fr/cjlink.php?file=cj200807/cijHsLjf7w.xls.

J'ai inséré des formules de la colonne B à L dans les lignes de sélection

Le traitement est légèrement plus long mai c'est négligeable

Fais des essais et dis moi !!!!!





Avatar
FFO
Rebonjours Michel

content de t'avoir rendu service et satisfait

Pour les explications souhaitées :

1)On Error Resume next :

demande au code de sauter l'instruction qui présente une erreur et de
traiter la suite des instructions

Exemple :

On Error Resume Next
Selection.Find(What:="", After:¬tiveCell, LookIn:=xlValues, LookAt _
:=xlPart).Activate

si l'instruction ne trouve pas l'élément recherché au lieu de s'arréter sur
un Bug l'éxécution continue pour traiter les suivantes
La présence ou non colonne A d'une cellule vide est aléatoire il faut donc
pouvoir gérer les 2 situations

2)A = ActiveCell.Row => à Quoi nous sert ce A

Mille excuses un oubli de ma part
c'est une ligne que j'ai insérée pour connaitre la ligne de la cellule
active à ce stade du code m'aidant ainsi à résourdre des imperfections et
ainsi de peaufiner la macro
Tu peux la supprimer


3)Départ = ActiveCell.Address => on fixe une adresse dans Départ

Effectivement je lance une première recherche de cellule vide colonne A :

Selection.Find(What:="", After:¬tiveCell, LookIn:=xlValues, LookAt _
:=xlPart).Activate
Départ = ActiveCell.Address

Je récupère ainsi l'adresse de la 1° cellule vide

Je lance une boucle de 1 à la dernière ligne :

For j = 1 To Range(Colonne3 & "65535").End(xlUp).Row

Je regarde si la ligne est totalement vide et je la masque
Je relance la recherche de cellule vide :

k = 0
Do While Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Value = ""
And Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address <>
Range("IV" & ActiveCell.Row).Address
k = k + 1
Loop
If Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address =
Range("IV" & ActiveCell.Row).Address Then
ActiveCell.EntireRow.Hidden = True
End If
Selection.FindNext(After:¬tiveCell).Activate

Cette opération est intérrompu si relançant la recherche d'une cellule vide
je retombe sur la 1° caractérisée par la variable Départ :

If ActiveCell.Address = Départ Then
Exit For

LookAt:=xlPart => est ce un sens de recherche ?
non
xlPart signifie que la recherche se fait sur une partie de la donnée de la
cellule
A une recherche "PA" pourra être trouvé "PAPA" ou "PAPOU" ou "NE PAS"
Si on recherche un mot entier l'instruction devient :
LookAt:=xlWhole
A une recherche "PA" ne pourra être trouvé que "PA"

Le sens de la recherche est exprimé par After:¬tiveCell aprés la cellule
active


4)
Et je ne comprend rien à çà :
Do While Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Value = ""
And Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address <>
Range("IV" & ActiveCell.Row).Address




Tant que les conditions sont vérifiées les instructions situées entre Do et
Loop seront éxécutées

Les conditions sont :

Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Value = ""

Cellule A et le n° de la ligne de la cellule active déplacée du nombre de
colonnes représenté par la variable k et déplacé j'usquà la 1° cellule non
vide
La cellule déterminée à une valeur null (pour ne pas être tributaire des
formules)

et

And Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address <>
Range("IV" & ActiveCell.Row).Address

Cellule A et le n° de la ligne de la cellule active déplacée du nombre de
colonnes représenté par la variable k et déplacée j'usquà la 1° cellule non
vide
La cellule déterminée à une Adresse différente de l'adresse de la cellule de
la colonne IV et le n° de la ligne de la cellule active (dernière colonne du
tableau et n° de la ligne de la cellule active)


L'instruction exécutée :

k = k + 1

C'est à dire que je fais évoluer le compteur k tant que les conditions
décrites sont respectées
Si La boucle Do loop s'arrète c'est qu'une des conditions voir les 2 n'est
plus respectées :
Soit je suis arrivé sur une cellule non null donc on ne masque pas
Soit je suis arrivé à la cellule de la dernière colonne de la feuille donc
on masque :
Avec la dernière valeur k aprés rupture de la boucle :
If Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address =
Range("IV" & ActiveCell.Row).Address Then
ActiveCell.EntireRow.Hidden = True
End If

Je n'ai pas pris en compte l'état de cette dernière cellule (null ou pas
null) en colonne IV
Je ne pense pas que celà soit une difficulté potentielle ton analyse de
lignes vides ne doit pas être au delà de la colonne L


Espérant avoir répondu à tes interrogations

Dis moi !!!!
Avatar
Michel TAF
Merci pour toutes ces explications et à bientôt

Michel

"FFO" a écrit dans le message de
news:
Rebonjours Michel

content de t'avoir rendu service et satisfait

Pour les explications souhaitées :

1)On Error Resume next :

demande au code de sauter l'instruction qui présente une erreur et de
traiter la suite des instructions

Exemple :

On Error Resume Next
Selection.Find(What:="", After:¬tiveCell, LookIn:=xlValues, LookAt _
:=xlPart).Activate

si l'instruction ne trouve pas l'élément recherché au lieu de s'arréter


sur
un Bug l'éxécution continue pour traiter les suivantes
La présence ou non colonne A d'une cellule vide est aléatoire il faut donc
pouvoir gérer les 2 situations

2)A = ActiveCell.Row => à Quoi nous sert ce A

Mille excuses un oubli de ma part
c'est une ligne que j'ai insérée pour connaitre la ligne de la cellule
active à ce stade du code m'aidant ainsi à résourdre des imperfections et
ainsi de peaufiner la macro
Tu peux la supprimer


3)Départ = ActiveCell.Address => on fixe une adresse dans Départ

Effectivement je lance une première recherche de cellule vide colonne A :

Selection.Find(What:="", After:¬tiveCell, LookIn:=xlValues, LookAt _
:=xlPart).Activate
Départ = ActiveCell.Address

Je récupère ainsi l'adresse de la 1° cellule vide

Je lance une boucle de 1 à la dernière ligne :

For j = 1 To Range(Colonne3 & "65535").End(xlUp).Row

Je regarde si la ligne est totalement vide et je la masque
Je relance la recherche de cellule vide :

k = 0
Do While Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Value ""
And Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address <>
Range("IV" & ActiveCell.Row).Address
k = k + 1
Loop
If Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address > Range("IV" & ActiveCell.Row).Address Then
ActiveCell.EntireRow.Hidden = True
End If
Selection.FindNext(After:¬tiveCell).Activate

Cette opération est intérrompu si relançant la recherche d'une cellule


vide
je retombe sur la 1° caractérisée par la variable Départ :

If ActiveCell.Address = Départ Then
Exit For

LookAt:=xlPart => est ce un sens de recherche ?
non
xlPart signifie que la recherche se fait sur une partie de la donnée de


la
cellule
A une recherche "PA" pourra être trouvé "PAPA" ou "PAPOU" ou "NE PAS"
Si on recherche un mot entier l'instruction devient :
LookAt:=xlWhole
A une recherche "PA" ne pourra être trouvé que "PA"

Le sens de la recherche est exprimé par After:¬tiveCell aprés la cellule
active


4)
Et je ne comprend rien à çà :
Do While Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Value ""
> And Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address <>
> Range("IV" & ActiveCell.Row).Address


Tant que les conditions sont vérifiées les instructions situées entre Do


et
Loop seront éxécutées

Les conditions sont :

Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Value = ""

Cellule A et le n° de la ligne de la cellule active déplacée du nombre de
colonnes représenté par la variable k et déplacé j'usquà la 1° cellule non
vide
La cellule déterminée à une valeur null (pour ne pas être tributaire des
formules)

et

And Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address <>
Range("IV" & ActiveCell.Row).Address

Cellule A et le n° de la ligne de la cellule active déplacée du nombre de
colonnes représenté par la variable k et déplacée j'usquà la 1° cellule


non
vide
La cellule déterminée à une Adresse différente de l'adresse de la cellule


de
la colonne IV et le n° de la ligne de la cellule active (dernière colonne


du
tableau et n° de la ligne de la cellule active)


L'instruction exécutée :

k = k + 1

C'est à dire que je fais évoluer le compteur k tant que les conditions
décrites sont respectées
Si La boucle Do loop s'arrète c'est qu'une des conditions voir les 2 n'est
plus respectées :
Soit je suis arrivé sur une cellule non null donc on ne masque pas
Soit je suis arrivé à la cellule de la dernière colonne de la feuille donc
on masque :
Avec la dernière valeur k aprés rupture de la boucle :
If Range("A" & ActiveCell.Row).Offset(0, k).End(xlToRight).Address > Range("IV" & ActiveCell.Row).Address Then
ActiveCell.EntireRow.Hidden = True
End If

Je n'ai pas pris en compte l'état de cette dernière cellule (null ou pas
null) en colonne IV
Je ne pense pas que celà soit une difficulté potentielle ton analyse de
lignes vides ne doit pas être au delà de la colonne L


Espérant avoir répondu à tes interrogations

Dis moi !!!!



1 2