PB sur EXCEL

PB sur EXCEL - VB/VBA/VBS - Programmation

Marsh Posté le 04-06-2018 à 10:23:32    

Bonjour à tous,  
 
Voilà j'ai un souci avec un tableau Excel. Ce que je veux faire est tout simple mais n'ayant pas un très bon niveau, je n'y arrive pas.  
 
Alors j'ai une feuille Excel avec un tableau en face duquel pour chaque ligne en fonction d'un certain critère j'ai "VRAI" OU "FAUX"  
 
Ce que j'aimerais tout simplement c'est que toutes les lignes qui contiennent une cellule "FAUX" soit masquées et s'affiche si non. Ou à l'inverse toutes les lignes marquées "VRAI" s'affichent ou se masquent si non.  
 
Ce tableau étant en permanence utilisé, il faut que ça puisse se faire automatiquement à chaque fois que ça se modifie ( et donc si un "FAUX" devient "VRAI" la ligne  s'affiche et vis et versa)  
 
Pour info les "VRAI" ou "FAUX" seront toujours dans une seule et même colonne (A:A)  
 
Je vous remercie,  
 

Reply

Marsh Posté le 04-06-2018 à 10:23:32   

Reply

Marsh Posté le 04-06-2018 à 13:51:10    

Peut être ceci pourra t'il t'aider ?  
https://www.extendoffice.com/docume [...] value.html


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 04-06-2018 à 14:32:21    

Merci pour le lien très intéressant, c'est la seconde solution qui intéresserait, à savoir en VB, le souci c'est que ce n'est pas exactement ce que je veux, dans l'exemple il supprime la ligne si une valeur est supérieure à 3000, moi je veux la même chose avec la valuer exacte "FAUX". Or ne sachant pas programmer je ne sais pas ce qu'il faut changer.  
je remet ici les lignes de codes :  
 
Sub HideRow()
'Updateby20150618
Dim Rng As Range
Dim WorkRng As Range
Dim xNumber As Integer
On Error Resume Next
xTitleId = "KutoolsforExcel"
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
xNumber = Application.InputBox("Number", xTitleId, "", Type:=1)
For Each Rng In WorkRng
   <span style="background-color:#ff0"> Rng.EntireRow.Hidden = Rng.Value < xNumber</span>
Next
End Sub
 
Que faut il changer là dedans ?? J'ai bien essayer mais ça ne marche pas .
D'ailleurs j'ai essayer leur code à eux en changeant mes valeurs, et ça me met erreur de compilation ...  
 
   

Reply

Marsh Posté le 04-06-2018 à 14:49:00    

Alors pardon si, j'ai réussi à voir ce qui n'allait pas et à le faire marcher :  
 
Sub HideRow()
Dim Rng As Range
Dim WorkRng As Range
Dim xNumber As Integer
On Error Resume Next
xTitleId = "KutoolsforExcel"
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
xNumber = Application.InputBox("Number", xTitleId, "", Type:=1)
For Each Rng In WorkRng
  Rng.EntireRow.Hidden = Rng.Value = xNumber
Next
End Sub
 
J'essaye de voir maintenant pour que ça se fasse automatiquement ou à défaut avec un bouton,  
 
Merci encore

Reply

Marsh Posté le 04-06-2018 à 15:04:34    

Alors en fait non ça ne va pas ;)  
En effet c'est ce que je veux sauf que à chaque fois que j'exécute la macro,  
je doit choisir les lignes et la valeur d'application.  
 
Moi c'est toujours la colonne A:A et ça sera toujours la valeur "FAUX" ce qui me permettrais via un bouton d'appliquer la macro tout de suite.  
Là à chaque fois je dois redonner les valeurs.
 

Reply

Marsh Posté le 04-06-2018 à 17:11:33    

Bonjour,
 
Dans le module de la feuille :

Code :
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.   Call HideRow
  3. End Sub
  4. Private Sub HideRow()
  5. Dim rng As Range
  6. Dim cel As Range
  7.   Set rng = Intersect(Me.Columns(1), Me.UsedRange)
  8.   For Each cel In rng.Cells
  9.     cel.EntireRow.Hidden = cel.Value = False
  10.   Next cel
  11. End Sub


Mais il faudrait restreindre la zone d'exécution en ciblant les antécédent.
I.e. au lieu de mettre simplement :

Code :
  1. CallHideRow


Mettre quelque chose comme (à adapter):

Code :
  1. If Intersect(Target, Me.Range("B5:F18" )) Is Nothing Then Exit Sub
  2.   CallHideRow


 


---------------
Cordialement, Patrice
Reply

Marsh Posté le 05-06-2018 à 15:25:27    

Bonjour Patrice,  
 
Merci beaucoup ça marche, malheureusement là encore même en faisant une restriction comme tu le suggères j'ai un moment donné un BUG où il me dit qu'il y à trop de données.  
 
Finalement je pense que c'est faisable en faisant une combinaison de conditionnelle mais faut que je rajoute quelque colonnes masquées à mon avis.  
Mais déjà je maitriserais un peu plus le sujet.  
 
Merci encore à ceux qui m'ont répondu;
 
 

Reply

Marsh Posté le 05-06-2018 à 16:14:47    

gugi976 a écrit :

Bonjour Patrice,  
 
Merci beaucoup ça marche, malheureusement là encore même en faisant une restriction comme tu le suggères j'ai un moment donné un BUG où il me dit qu'il y à trop de données.  
 
Finalement je pense que c'est faisable en faisant une combinaison de conditionnelle mais faut que je rajoute quelque colonnes masquées à mon avis.  
Mais déjà je maitriserais un peu plus le sujet.  
 
Merci encore à ceux qui m'ont répondu;
 
 


Ce que je suggérais, c'est de surveiller les antécédents :  
l'évènement _Change ne produit pas lorsque le résultat d'une formule change, mais uniquement lors de la modification d'une donnée (un antécédent) qui entraine la modification du résultat de la dite formule.
D'où la suggestion de ne surveiller que la modification de ces données en restreignant l'exécution de la procédure à la plage qui les contient avec intersect().


---------------
Cordialement, Patrice
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed