[Catégorie modifiée .Net --> VBA] [VBA|EXCEL] worksheet_change sur plusieurs cel

cs_shinji7800 Messages postés 4 Date d'inscription mercredi 30 janvier 2008 Statut Membre Dernière intervention 9 juillet 2012 - 30 sept. 2010 à 18:45
cs_shinji7800 Messages postés 4 Date d'inscription mercredi 30 janvier 2008 Statut Membre Dernière intervention 9 juillet 2012 - 1 oct. 2010 à 08:48
Bonjour,

j'aurai besoin d'aide pour pouvoir utiliser la fonction "worksheet_change"


mon but est de contrôler la valeur certaines cellules (fusionnées).

par exemple :

- I9:I10
- I21:I22
- I37:38

les cellules à contrôler ne sont pas encore déterminées ( car mon fichier Excel évolue encore)

si une valeur que j'attends est entrée, j'appelle une fonction afin d'afficher un message de saisi.

cependant ce message de saisi ne sera pas le même en fonction de la ligne.


je m'explique :


si I9="NOK" un message de saisi apparait (avec un message pour cette ligne)

si I21="NOK" un autre message de saisi apparait (diffèrent de I9)

Si I9<>"NOK" je veux faire disparaitre mon message de saisi (idem pour les autre cellule)

voici ce que j'ai codé, mais je pense que je ne sais pas utiliser cette fonction.



Private Sub Worksheet_Change(ByVal target As Range) 

If Range("I9").Value <> "NOK" Then 
    Call MaS10(target) 
end if 

If Range("I21").Value <> "NOK" Then 
    Call MaS10(target) 
end if 

If Range("I9").Value = "NOK" Then 
    Call MaS1 
end if 

If Range("I21").Value = "NOK" Then 
    Call MaS4 
End If 

End Sub 

Public Function MaS1() 

Range("J9:J10").Select 
            With Selection.Validation 
                .Delete 
                .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator:=xlBetween 
                .IgnoreBlank = True 
                .InCellDropdown = True 
                .InputTitle = "essai N°1" 
                .ErrorTitle = "" 
                .InputMessage = "Commencez par : " & Chr(10) & "" & Chr(10) & "- tenter de faure un pingu sur l'equipement depuis SRV1" & Chr(10) & "" & Chr(10) & "- si cela ne fontionne pas tentez de blabla" 
                .ErrorMessage = "" 
                .ShowInput = True 
                .ShowError = True 
            End With 


End Function 

Public Function MaS10() 

    cells.Offset(0, 1).Select 

        
            With Selection.Validation 
               .Delete 
                .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator:=xlBetween 
                .IgnoreBlank = True 
                .InCellDropdown = True 
                .InputTitle = "" 
                .InputMessage = "" 
                .ShowInput = True 
                .ShowError = True 
            End With 


End Function 

Public Function MaS4() 

Range("J21:J22").Select 
            With Selection.Validation 
                .Delete 
                .Add Type:=xlValidateInputOnly, AlertStyle:=xlValidAlertStop, Operator:=xlBetween 
                .IgnoreBlank = True 
                .InCellDropdown = True 
                .InputTitle = "essai N°4" 
                .ErrorTitle = "" 
                .InputMessage = "test 4" 
                .ErrorMessage = "" 
                .ShowInput = True 
                .ShowError = True 
            End With






d'avance merci !

2 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 sept. 2010 à 19:43
Salut

"Call MaS10(target)"
-1- Tu fournis à ta fonction MaS10 le paramètre (Range) "Target", mais la déclaration de ta fonction ne prévoit pas de paramètre !
-2- Quand Worksheet_Change se déclenche, elle te fournit dans "Target" le Range concerné par la modif.
Dans les tests que tu fais, tu désignes toi-même un Range qui n'a rien à voir avec le Range "Target" --> Pourquoi vouloir le fournir à une autre fonction puisque ce Target n'a aucun lien avec la cellule que tu testes ?

Une Function est différente d'une Sub.
Les fonctions que tu as déclarées ne renvoyant aucune information (ni en déclaration, ni dans les lignes de code), elles devraient être des Sub.
Ce n'est pas grave si tu laisses comme ça, cela ne provoquera pas d'erreur / dysfonctionnement pour autant.
MAIS si tu dois fournir un Range à ta fonction, déclare-le (voir l'aide).

"cells.Offset(0, 1).Select"
Ça, ça doit donner des choses bizarres !
Cells représente la totalité des cellules de ta feuille.
Alors, désigner la cellule de la colonne suivante n'a aucun sens.

Préfère le vbLf ou vbNewLine plutôt que Chr(10) (pouah)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_shinji7800 Messages postés 4 Date d'inscription mercredi 30 janvier 2008 Statut Membre Dernière intervention 9 juillet 2012
1 oct. 2010 à 08:48
merci Jack pour ces précisions ! =)

au début j'ai mis des fonctions car je voulais tout simplement appeler mes fonctions depuis une fonction SI.

SI(I9"NOK";mamacro();"")

je n'arrivais pas à l'appeler donc je suis partis sur autre chose.


en ce qui concerne le "cells.Offset(0, 1).Select"

je voulais tout simplement créer qu'une seule fonction pour réinitialiser le message de saisi mais pour se faire il fallait que je détecte la dernière case modifiée et que je le passe en argument pour pouvoir supprimer le bon message dans la bonne fonction.


j'espère avoir été suffisamment clair (j'ai du mal à émergé ce matin), sinon pardonnez moi d'avance.


cordialement
0
Rejoignez-nous