Afficher un userform à la suite d'un résultat

Manu13

XLDnaute Occasionnel
Bonjour le FORUM

Je voulais afficher un userform suite à un résultat bien précis, cela fonctionnait si je faisait référence à une cellule, mais à une plage de cellules plantage
voilà ce que j'avais fait

[Private Sub Worksheet_Change(ByVal Target As Range)
if range('a1:d30').value = '100' then
userform1.show
end if
End Sub]

ça fonctionnait si je mettais que range('a1')par exemple mais avec une plage plantage?

Merci par avance
Manu
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Manu, bonjour le forum,

Essaie comme ça (Attention, les synboles Supérieur, Inférieur posent problème, j'ai donc écris DIFFÉRENT DE à la place dans le code) :

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cel As Range
For Each cel In Range('A1:D30')
If cel.Value DIFFÉRENT DE '100' Then Exit Sub
Next cel
UserForm1.Show
End Sub
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Manu, Robert, le Forum

Arf Robert est allé un peu vite, il fait l'inverse, il sort dès qu'il n'y a pas la Valeur '100' (en plus en string)...

Je propose ceci :

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ValSearched As Double
Dim ValFound As Boolean
Dim Cell As Range, Plage As Range

Set Plage = Me.Range('A1:D30')
ValSearched = 100

If Application.Intersect(Target, Plage) Is Nothing Then Exit Sub

   
For Each Cell In Plage
       
If Cell.Value = 100 Then ValFound = True
   
Next Cell


If ValFound Then UserForm1.Show
End Sub

En prime si tu dois avoir un scan sur des valeurs modifiées par des Formules, on peut aussi déclencher la même évènementielle avec ceci :

Private Sub Worksheet_Calculate()
    Worksheet_Change Me.Range('A1')
End Sub


Bon Appétit
[ol]@+Thierry[/ol]
 

_Thierry

XLDnaute Barbatruc
Repose en paix
_Thierry écrit:
Bonjour Manu, Robert, le Forum

Arf Robert est allé un peu vite, il fait l'inverse, il sort dès qu'il n'y a pas la Valeur '100' (en plus en string)...

Je propose ceci :

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ValSearched As Double
Dim ValFound As Boolean
Dim Cell As Range, Plage As Range

Set Plage = Me.Range('A1:D30')
ValSearched = 100

If Application.Intersect(Target, Plage) Is Nothing Then Exit Sub

   
For Each Cell In Plage
       
If Cell.Value = ValSearched Then ValFound = True
   
Next Cell

If ValFound Then UserForm1.Show
End Sub

En prime si tu dois avoir un scan sur des valeurs modifiées par des Formules, on peut aussi déclencher la même évènementielle avec ceci :

Private Sub Worksheet_Calculate()
    Worksheet_Change Me.Range('A1')
End Sub


Bon Appétit
[ol]@+Thierry[/ol]

EDITION !!!
J'avais oublié d'utiliser ma belle variable Double 'ValSearched'... ;)
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Mnu, THierry, bonjour le forum,

J'avais compris que si toutes les cellules de la plage A1:D30 contenaient la valeur '100' (en string comme le demandait Manu) alors l'UserForm1 s'affichait. Si c'est bien de cela qu'il s'agit alors, je presisite et signe, mon code fonctionne parfaitement. En changeant DIFFÉRENT DE par les symboles inférieur supérieur.
 

Manu13

XLDnaute Occasionnel
Bonjour _Thierry et Robert

Ma demande était bien si:
dans une plage de cellule ('A1:d30') par exemple dès qu'il apparait le chiffre 100 alors userform

Thierry cela fonctionne mais la boucle me retrouve le chiffre 100 lorsqu'un nouveau chiffre différent de 100 et me lance userform
par conséquent tant qu'il n'y a pas le chiffre 100 Ok, mais dès qu'il y a le chiffre 100 la plage l'userform apparait normal c'est la demande, mais lorsqu' un autre chiffre arrive différent de 100 l'userform apparait comme même!!!!
comment faire pour que l'userform ne vienne que lors d'un chiffre 100 ou un nouveau chiffre 100.
en tout cas merci pour votre aide
et bonne journée
Manu
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour cher Robert, Manu

Arf oui tout est interprétation... Si on va chercher dans le coté obscure de la force alors tu peux persister mon cher Robert !

Mais il est vrai aussi que notre ami Manu ne nous a pas vraiment éclairé de détails... Car si on transcrit litéralement 'suite à un résultat bien précis sur une plage' la valeur recherchée pourrait être en fait le cumul de toutes les valeurs additionnées dans cette fameuses plage...

Si jamais tel était le cas, voici une variante :

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ValSearched As Double
Dim ValFound As Double
Dim Cell As Range, Plage As Range


Set Plage = Me.Range('A1:D30')
ValSearched = 100

If Application.Intersect(Target, Plage) Is Nothing Then Exit Sub

   
For Each Cell In Plage
        ValFound = ValFound + Val(Cell)
   
Next Cell

If ValFound = ValSearched Then UserForm1.Show
End Sub

Private Sub Worksheet_Calculate()
    Worksheet_Change Me.Range('A1')
End Sub

Bon Après midi
[ol]@+Thierry[/ol]

EDITION !!!
Désolé je n'avais pas raffraichi... Donc cette réponse ne correspond pas à ta dernière demande...

Pour celle-ci, je reviens...

[ol]@+Thierry[/ol]

Message édité par: _Thierry, à: 15/02/2006 14:48
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour Manu, la Grande Trume (lol), le Forum

Une approche avec un Tag en utilisant les commentaires, La Private Function est de mon copain STéphane.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ValSearched As Double
Dim ValFound As Boolean
Dim Cell As Range, Plage As Range

Set Plage = Me.Range('A1:D30')
ValSearched = 100

If Application.Intersect(Target, Plage) Is Nothing Then Exit Sub

   
For Each Cell In Plage
       
If Cell.Value = ValSearched Then
           
If HasComment(Cell) = False Then
                Cell.AddComment 'Tagged'
                ValFound =
True
           
End If
       
End If
   
Next Cell

If ValFound Then UserForm1.Show
End Sub

Private Function HasComment(ByVal Cell As Range) As Boolean 'De STephane
Dim Com As Variant
On Error Resume Next
Com = Cell.Comment.Text
   
Select Case Err
       
Case 0
            HasComment =
True
       
Case 91
            HasComment =
False
       
Case Else
            HasComment =
False
   
End Select
On Error GoTo 0
End Function

Et si on veut nettoyer, il faut Léon :

Private Sub CommandButton1_Click() 'Léon Le Nettoyeur
Dim C As Comment

   
For Each C In ActiveSheet.Comments
       
If C.Text = 'Tagged' Then C.Delete
   
Next
End Sub


Bon Aprèm
[ol]@+Thierry[/ol]

Message édité par: _Thierry, à: 15/02/2006 15:20
 

Manu13

XLDnaute Occasionnel
_Thierry, Robert et le forum

merci beaucoup thierry c'est extra et encore désolé pour vous avoir fait gaspillé du temps sur une mausaise piste, mais pas perdu comme même code intérressent que je garde ( je parje des premiers codes... bien sur) car le dernier correspond exactement à ma recherche.
bon maintenant je vais essayer de comprendre ton code Thierry pour ne pas l'appliquer bêtement!!!
mais d'or et déjà si tu as un peu de temps pour expliquer le role en utilisant les commentaires et par conséquent la private function.
merci par avance
merci à Robert et Thierry pour leur aide
A bientôt
Manu
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Manu, Robert la Grande Trume (re LOL)

C'est en fait assez simple, j'utilise les commentaires comme étant un Tag sur la Cellule...

Si cette cellule est déjà 'Taggée' et bien elle est ignorée puisque je cherche seulement dans ma condition si elle n'a pas de 'comment' par cette ligne :

If HasComment(Cell) = False Then

HasComment est une petite fonction toute simple de mon ami STéphane qui retournera une valeur Boolean (Vrai / Faux) si une erreur est générée suite à cette commande :

Com = Cell.Comment.Text

Ensuite il suffit de 'lire' l'erreur :

Select Case Err
Case 0
HasComment = True


Pas d'erreur (0) donc elle a un commentaire la valeur est Vraie...

Case 91
HasComment = False
Case Else
HasComment = False


Erreur 91 (ou autres) donc pas de commentaire la Valeur est Fausse...

Voilà c'est très simple... Pour ta compréhension, je pourrai aussi utiliser une autre propriété de Cellule ici la couleur intérieure de la Cellule plutôt que de lui adjoindre un Comment :

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ValSearched As Double
Dim ValFound As Boolean
Dim Cell As Range, Plage As Range

Set Plage = Me.Range('A1:D30')
ValSearched = 100

If Application.Intersect(Target, Plage) Is Nothing Then Exit Sub


   
For Each Cell In Plage
       
With Cell
           
If .Value = ValSearched Then
               
If Not .Interior.ColorIndex = 2 Then
                    .Interior.ColorIndex = 2
'Intérieur Blanc
                    ValFound =
True
               
End If
           
Else
                .Interior.ColorIndex = xlNone
           
End If
       
End With
   
Next Cell

If ValFound Then UserForm1.Show

End Sub

Je pourrai autrement être encore plus tordu en m'appuyant sur la Propriété 'FormulaHidden' par exemple et ça donnerait ceci :

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ValSearched As Double
Dim ValFound As Boolean
Dim Cell As Range, Plage As Range

Set Plage = Me.Range('A1:D30')
ValSearched = 100

If Application.Intersect(Target, Plage) Is Nothing Then Exit Sub


   
For Each Cell In Plage
       
With Cell
           
If .Value = ValSearched Then
               
If .FormulaHidden = False Then
                .FormulaHidden =
True
                    ValFound =
True
               
End If
           
Else
                .FormulaHidden =
False
           
End If
       
End With
   
Next Cell

If ValFound Then UserForm1.Show

End Sub

Enfin il y a de quoi 'tagger' les cellules, pour ce genre de job...

Bon Aprèm
[ol]@+Thierry[/ol]
 

Discussions similaires

Statistiques des forums

Discussions
312 523
Messages
2 089 317
Membres
104 119
dernier inscrit
karbone57