Masquage de ligne par comparaison numérique

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

ccdouble6

XLDnaute Occasionnel
Bonsoir le forum,

J'utilise excel2000 sous XP et je rencontre un problème sur une macro (adapté depuis celle du membre Skoobi) que j'ai souhaité modifer.
Il s'agit de pouvoir masquer les lignes qui ont une valeur numérique inférieure à celle tapée dans l'encadré.
Je prévois une action jusqu'à la ligne 65536 d'où l'aspect de la macro et l'utilisation de "Plage" et de Union() pour plus de rapidité.
Un bouton sert à lancer l'action, mais une erreur survient soit au lancement soit lorsque je rappuie pour réafficher tout.
voici l'erreur : "Erreur d'éxécution 91 : variable d'objet ou variable de bloc With non définie" et ça pointe ensuite sur la variable "plage" (ligne en rouge) pourtant bien définie 😕😕

Je mets ci-dessous le texte, le fichier test simplifié où j'ai rencontré ce problème est encore trop lourd (>48Ko). je peux voir pour tenter de le réduire au besoin.
NOTA : ne pas tenir compte du nom du bouton (j'ai gardé l'ancien)

Private Sub ToggleMasq_Click()
If ToggleMasq.Caption = "AFFICHER QUE LES X" Then
ToggleMasq.BackColor = &H80FFFF
Macro1
ToggleMasq.Caption = "REAFFICHER TOUT"
Else
ToggleMasq.BackColor = &H80FF80
Macro2
ToggleMasq.Caption = "AFFICHER QUE LES X"
End If
End Sub

Sub Macro1()
Application.ScreenUpdating = False
'Ne garde que les lignes <valeur dans E3
Dim i As Long, plage As Range
For i = 5 To Range("A65536").End(xlUp).Row
If Range("D" & i) < Range("E3") Then
If plage Is Nothing Then
Set plage = Rows(i)
Else
Set plage = Union(plage, Rows(i))
End If
End If
Next i
plage.EntireRow.Hidden = True
Application.ScreenUpdating = True
End Sub

Sub Macro2()
Application.ScreenUpdating = False
'Réaffiche TOUT
Dim i As Long, plage As Range
For i = 5 To Range("A65536").End(xlUp).Row
Rows(i).Hidden = False
Next i
Application.ScreenUpdating = True
End Sub



Qq'un peut-il m'aider ?? Il s'agit surement d'un problème de syntaxe...
Merci par avance et bonne soirée !!! 🙂
ccdouble6.
 
Re : Masquage de ligne par comparaison numérique

Bonsoir,

Qq'un peut-il m'aider ?? Il s'agit surement d'un problème de syntaxe...

La syntaxe est bonne (de ce qui est en rouge en tout cas!):
Ca peut planter dans 2 cas à mon avis:
1- si aucune des lignes est < E3 alors ça plante car plage = "Nothing".
2- si la ligne 5 est vide, dans ce cas, la boucle ne démarre même pas et va directement à la ligne en rouge.
 
Re : Masquage de ligne par comparaison numérique

Bonsoir le forum !!

J'ai trouvé où ça clochait :
For i = 5 To Range("D65536").End(xlUp).Row
c'est fou comme une erreur peut en entrainer d'autres 😀

Toutefois j'ai une autre question concernant toujours la même macro.
ça concerne toujours la ligne suivante (de la macro3) :
For i = 11 To Range("D65536").End(xlUp).Row

Le programme part de la dernière ligne bien sûr, mais il aura quand meme souvent à traiter une immense partie vide : exemple si le tableau est actuellement rempli jusqu'à la ligne 10000.
Alors j'ai pu par formule renvoyer en A3 le n° de la dernière ligne remplie : celle à partir de laquelle ce serait idéal que le programme démarre (ça peut faire gagner des secondes à mon avis...)
Maintenant je ne vois pas comment demander à cette macro tapée ci-dessus de ne travailler QUE DEPUIS cette ligne.😕
Existe-t-il un équivalent INDIRECT() en version vba ?? 🙄
Merci par avance pour votre aide et bonne fin de week end !!
ccdouble6.
 
Re : Masquage de ligne par comparaison numérique

Bonsoir le forum, JCGL,

Désolé mais cette formulation n'a pas l'air de passer en vba 😕
cela donne si j'ai bien compris :
If Range("EC" & j) < INDIRECT(Range("EC10")) Then
Ou j'ai loupé qqchose...
Si qq'un peut m'éclairer... 😕 Merci d'avance et bonne nuit !!
ccdouble6
 
Re : Masquage de ligne par comparaison numérique

Bonsoir,

Bonsoir le forum !!
J'ai trouvé où ça clochait :
For i = 5 To Range("D65536").End(xlUp).Row
c'est fou comme une erreur peut en entrainer d'autres 😀
Toutefois j'ai une autre question concernant toujours la même macro.
ça concerne toujours la ligne suivante (de la macro3) :
For i = 11 To Range("D65536").End(xlUp).Row
Le programme part de la dernière ligne bien sûr, mais il aura quand meme souvent à traiter une immense partie vide : exemple si le tableau est actuellement rempli jusqu'à la ligne 10000.
Alors j'ai pu par formule renvoyer en A3 le n° de la dernière ligne remplie : celle à partir de laquelle ce serait idéal que le programme démarre (ça peut faire gagner des secondes à mon avis...)
Maintenant je ne vois pas comment demander à cette macro tapée ci-dessus de ne travailler QUE DEPUIS cette ligne.😕
Existe-t-il un équivalent INDIRECT() en version vba ?? 🙄
Merci par avance pour votre aide et bonne fin de week end !!
ccdouble6.
Il y a un certain nombre de choses que je ne comprends pas ou je n'ai rien compris tout court
Ta macro ne démarre pas à partir de la dernière cellule non vide de la colonne D, mais à partir de la cellule D5, il me semble, sinon il faut inverser le sens de la boucle, mais je n'en vois pas l'intérêt ici
Pourquoi vouloir renvoyer le numéro de la dernière ligne dans une cellule ?! la dernière cellule non vide sera toujours la dernière
Par ailleurs, où est définie la variable "Plage" dans ta macro ? j'ai beau chercher, je ne vois pas !
S'il ne s'agit que de garder les lignes dont la cellule de la colonne D est inférieure à la valeur de la cellule E3 et de masquer les autres
Code:
Sub Macro1()
Application.ScreenUpdating = False
'Ne garde que les lignes < valeur dans E3
Dim i As Long, plage As Range
For i = 5 To Range("A65536").End(xlUp).Row
If Range("D" & i) > Range("E3") Then Rows(i).Hidden = True
Next i
Application.ScreenUpdating = True
End Sub
A+
kjin
 
Dernière édition:
Re : Masquage de ligne par comparaison numérique

Bonsoir le forum, JCGL, Skoobi, Kjin,

Alors je me suis surement mal expliqué :
La définition de la variable plage est donnée dans Sub Macro1() (mon tout premier message)
En fait la macro fonctionne très bien comme elle est, grâce au mécanisme de Skoobi que j'ai repris ici.
Je souhaite juste faire en sorte qu'elle ne commence pas son calcul à la ligne 65536 mais à partir du numéro de la ligne déjà indiqué (par formule) dans la cellule EC10 (mais ça pourrait être en A1 ou tout autre), d'où la question :
comment utilise-t-on le principe INDIRECT() en vba ??
Tout marche bien il s'agit juste de faire gagner du temps de calcul 😉 après si des lettres sont décalées je corrigerai, j'ai dû mal retranscrire mon exemple désolé... 😱
Au passage Kjin qu'entends-tu par "dernière cellule non vide" ?? Si le texte actuel prend déjà ce paramètre en compte alors c'est sûr mon problème ne se pose plus (j'ai encore BEAUCOUP de choses à apprendre décidément 🙄)
Merci d'avance pour toute aide ou éclaircissement syntaxique,
Bonne soirée !!!
ccdouble6.
 
Re : Masquage de ligne par comparaison numérique

Bonsoir,
"Range("A65536").End(xlUp)" représente la dernière cellule non vide de la colonne A, donc ta boucle s'arrête à cette cellule et non à la ligne 65536 ! donc inutile de la chercher tu l'as connais.
S'agit-il de tester jusqu'à la dernière cellule non vide de la colonne A ou celle de la colonne D ? - parce que dans le deuxième cas il faut remplacer A65536 par D65536 ?
Code:
For i = [COLOR="Red"]5[/COLOR] To Range[COLOR="Red"]("A65536").End(xlUp)[/COLOR].Row
If Range("D" & [COLOR="Red"]i[/COLOR]) < Range("E3") Then
Comme je te l'ai déjà dit ta boucle commence à la ligne 5 pour se terminer au numéro de ligne correspondant à la dernière cellule non vide de la colonne A, et test si D & i < E3
As tu au moins essayer le code que je t'ai proposé ?
En outre, un simple filtre automatique ferait très bien la même chose
A+
kjin
 
Re : Masquage de ligne par comparaison numérique

Re bonjour,

e souhaite juste faire en sorte qu'elle ne commence pas son calcul à la ligne 65536
Si c'est de cette boucle dont tu parles:

For i = 5 To Range("A65536").End(xlUp).Row

alors cela ne veut pas dire que i va boucler de 5 à 65536.
Range("A65536").End(xlUp).Row signifie: dernière ligne non vide en colonne A en partant de la cellule A65536.
Tu peux simuler cela en faisant ceci:
1- tu va à la cellule A65536
2- touche "Fin"
3- touche "flèche haut"

Donc tu n'as rien besoin d'indiquer dans la cellule EC10.

Edit: ouppppsss, salut kjin 🙂, je suis moins rapide du clavier que toi 😀
 
Re : Masquage de ligne par comparaison numérique

Bonsoir le forum, Kjin, Skoobi,

Merci à tous deux pour ces précisions 🙂 en effet Skoobi c'est bien ça je pensais que le calcul se faisait jusqu'à la ligne 65536, sans tenir compte des lignes vides, alors qu'il en tient compte si je comprends bien :
La macro peut partir de 65536 s'il le faut mais elle part en fait de la dernière ligne non vide.
Reste une question qui m'inquiète un peu :
qu'entend la macro par "ligne non vide" ?
La feuille (mettons qu'elle soit nommée 1) où se trouvent bouton et macro devra recevoir les données d'une autre feuille (2)
mon tableau sur la feuille 1 est donc bourré de formules jusqu'à la dernière ligne, et une ligne "vide" pour moi contient en fait des formules ici et là : elle ne sera peut-être pas "vide" au sens où la macro l'entend... C'est un peu délicat à expliquer mais ça se résume à deux simples questions : à quoi la macro voit qu'une ligne est vide ?
Et, s'il s'agit vraiment de "ligne vide", peut-on alors lui apporter une précision du type "fais le calcul jusqu'à ce que tu atteignes une cellule où la valeur = rien ou =0"

Le problème ne s'était pas posé dans le thread "vitesse d'éxécution", d'où j'ai récupéré le texte de Skoobi, puisque le fichier test allait jusqu'à 60000.
Kjin merci tout de même pour cette formule proposée, elle fonctionne mais je garde celle d'origine de Skoobi que j'ai déjà remanié, question de contexte, et peut-être d'habitude un peu aussi 😉
Cette fois-ci, c'est dans la condition même de la boucle que je pense devoir (et pouvoir) gagner de la ressource.
Merci d'avance pour toute nouvelle précision et bonne soirée !
ccdouble6.
 
Re : Masquage de ligne par comparaison numérique

Re bonsoir,
Range("A65536").End(xlUp).Row signifie: dernière ligne non vide en colonne A en partant de la cellule A65536.
Petite erreur: ça ne signifie pas dernière ligne non vide mais dernière cellule non vide de la colonne A.
Donc il faut chercher ailleurs pour le temps d'exécution.
 
Dernière édition:
Re : Masquage de ligne par comparaison numérique

Bonjour à tous,

Merci Skoobi je comprends mieux 🙂 et même en regardant dans la condition de la boucle il n'existe pas de façon de dire
For i = 5 to [dernière cellule <>0] ? 😕 vu que dans la colonne concernée il n'y aura pas de vide mais en lieu et place des formules donnant 0, je voudrais explorer cette piste jusqu'au bout 😉
Après évidemment si ya pas moyen je regarderai pour d'autres pistes éventuelles...
Merci et bonne journée !!!
ccdouble6.
 
Re : Masquage de ligne par comparaison numérique

Re bonjour,

pour ma part, je ne vois que cette solution, par exemple:

Code:
For i = 1 To Range("A65536").End(xlUp).Row
  If Range("A" & i).Value <> 0 Then
    ........
    ............
  End If
Next
Petite précision, ton but est de:
Il s'agit de pouvoir masquer les lignes qui ont une valeur numérique inférieure à celle tapée dans l'encadré
Comme le fait remarquer Kjin plus haut, il n'y a pas plus rapide que le filtre automatique pour faire ça....
 
Dernière édition:
Re : Masquage de ligne par comparaison numérique

Re bonsoir Skoobi, Kjin,

Oui je confirme, le but n'a pas changé, et je tiens toujours à passer par vba 🙂
Cette façon-là m'a l'air bien sympa je n'y avais pas pensé du tout 😱 et il serait alors possible d'ajouter après le then un
Else goto xxxx (avec hors de la boucle le xxxx)
Ainsi on sort de la boucle dès lors que Range("A" & i).Value = 0 😀
ça devrait marcher je pense 😕 enfin je vais voir...
GROS GROS MERCI !!!
Et bonne soirée !!!
ccdouble6.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
512
Réponses
5
Affichages
270
Réponses
7
Affichages
218
  • Question Question
Microsoft 365 Export données
Réponses
4
Affichages
657
Réponses
7
Affichages
168
Retour