VBA - plusieur confitions If dans la macro « Private Sub Worksheet_Change »

Hub

XLDnaute Occasionnel
Bonjour à tous,

Vous trouverez dans le fichier en pièce jointe, un extrait du projet final.

Le but est de contrôler la saisie des valeurs des cellules jaunes de la feuille 1 (dans le projet final, il y en à 22, ici il n’y en a que deux de tester). Elles ne peuvent être que des valeurs numériques et elles ne peuvent être ni « vide » ni égale à zéro.
En cas d’erreur, un MsgBox apparaît. Le message est soit en français soit en anglais.

Premier point)
J’ai glissé des MsgBox « étape blabla » pour vérifier comment évolue le programme et le stopper à chaque étape afin de trouver ou se situe l’erreur.
Elle se situe dans la feuille 1 car à priori, dans une « Private Sub Worksheet_Change(à chaque modification de cellule) », il n’est pas possible d’empiler des conditions If contrairement à une « Private Sub Worksheet_Calculate() » voir feuille 3.

Question :
Est il possible dans une macro « Private Sub Worksheet_Change » de faire appel à plusieurs conditions If ?
Si oui, comment ?
Si non, que proposez vous en sachant qu’il y a 22 cellules à tester ?

Deuxième point)
Je souhaiterai travailler avec des valeurs global ou autre de façon à ne pas devoir répéter 22 fois la macro TestNum_X.

Question)
Comment faut-il s’y prendre ?

D’avance merci pour vos réponses.

@+
 

Pièces jointes

  • test isnumerix sur n'importe quelle cellule 4.xls
    39 KB · Affichages: 46

Robert

XLDnaute Barbatruc
Repose en paix
Re : VBA - plusieur confitions If dans la macro « Private Sub Worksheet_Change »

Bonjour Hub, bonjour le forum,

Peut-être comme ça :

Code:
Private test As Boolean 'déclare la variable TEST

Private Sub Worksheet_Change(ByVal Target As Range)
Dim pl As Range 'declare la variable PL (PLage)

If test = True Then Exit Sub 'condition : si TEST est [vrai], sort de la procédure
ScrollArea = "" 'autorise le déplacement dans tout l'onglet
'définit la plage PL (à adapter à ton cas)
Set pl = Application.Union(Range("B5"), Range("C4"), Range("D7"), Range("E8"))
'condition : si l'édition a lieu dans une des cellues de la plage PL
If Not Application.Intersect(Target, pl) Is Nothing Then
    test = True 'redéfinit la variable TEST
    'si valeur non mumérique, message, bloque le déplacement à la cellule éditée
    If IsNumeric(Target.Value) = False Then MsgBox "Valeur numérique uniquement !": ScrollArea = Target.Address: GoTo FIN
    'si cellule effacée, message, bloque le déplacement à la cellule éditée
    If Target.Value = "" Then MsgBox "La cellule ne peut être vide !": ScrollArea = Target.Address: GoTo FIN
    'si valeur égale à zéro, message, bloque le déplacement à la cellule éditée
    If Target.Value = 0 Then MsgBox "La valeur ne peut pas être égale à zéro !": ScrollArea = Target.Address: GoTo FIN
End If

FIN: 'étiquette
test = False 'réinitialise la variable TEST
End Sub
 

Si...

XLDnaute Barbatruc
Re : VBA - plusieur confitions If dans la macro « Private Sub Worksheet_Change »

Salut

désolé pour l'intrusion mais je ne pouvais pas laisser passer cela :

Il y a des fils perdus mais un Fils Prodige : tu n’as pas vieilli Robert ! re bienvenue !
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : VBA - plusieur confitions If dans la macro « Private Sub Worksheet_Change »

Bonjour le fil, bonjour le forum,

Ha ben m**d'alors ! Quel accueil ! Quelle émotion. J'en suis sincèrement ému...
 

Hub

XLDnaute Occasionnel
Re : VBA - plusieur confitions If dans la macro « Private Sub Worksheet_Change »

Bonjour à tous, bonjour le forum,

Je suis nouveau sur ce site et débutant en VBA.
Vu les commentaires et les messages de bienvenue à Maître Robert, j'en déduit que j'ai la chance d'avoir pour tuteur le Maître des Experts...

Mordel de Berde, j'en suis flatté...

Bon assez bavardé, Hub au boulot et taches de faire honneur à notre Maître, hahaha

Merci pour la réponse, j'essaye çà et je reviens vers vous en cas de soucis.

@+
 

Modeste

XLDnaute Barbatruc
Re : VBA - plusieur confitions If dans la macro « Private Sub Worksheet_Change »

'Acré bondjûû

Le Si... n'avait pas menti! La mer nous l'a rendu, notre Alain Colas du forum. Celui qui aura causé la déRoute du Rhum.
Ben mon cochon, tu ne t'es pas fait attendre! Ravi de te relire moi aussi!

Pardon Hub, désolé ... ce n'est pas toi que je célébrais (mais te voilà tout éclaboussé de cette écume salée)!
 

Hub

XLDnaute Occasionnel
Re : VBA - plusieur confitions If dans la macro « Private Sub Worksheet_Change »

Bonsoir à tous,

La solution proposée par Robert fonctionne très bien. Je l’ai un peu bricolé pour comprendre le fonctionnement (voir fichier joint).

Par contre j’aurai souhaité neutralisé cette macro après avoir effacer toutes les cellules de la plage.

La solution serait d’écrire :
If toutes les cellules de la plage sont vides Then GoTo Fin
Mais comment transcrire en langage VBA : « If toutes les cellules de la plage sont vides » ???

Merci d’avance pour vos réponses

@+
 

Pièces jointes

  • test isnumerix sur n'importe quelle cellule 6b.xls
    42.5 KB · Affichages: 54

Calvus

XLDnaute Barbatruc
Re : VBA - plusieur confitions If dans la macro « Private Sub Worksheet_Change »

Bonsoir Hub, le fil,

Je n'ai pas testé, mais essaie :

If IsEmty Range("B4:E8") Then Goto Fin

A+

Ps : Robert, si tu repasses, te souviens tu que l'on doit se faire un boeuf ?
 

Si...

XLDnaute Barbatruc
Re : VBA - plusieur confitions If dans la macro « Private Sub Worksheet_Change »

Re

Pour me dédommager de mon intrusion

Le passage par une autre feuille est-il obligatoire ?
Si oui, il faut faire attention à l’inhibition et, de pair, à la réactivation des évènements.
Si non, on peut simplifier la programmation.

Le passage par macros est-il obligatoire ?
Si non, on peut passer par Données, Validation de données !

Il y a ces 2 cas dans le fichier exemple joint.
 

Pièces jointes

  • Saisies Numériques.xlsm
    102.5 KB · Affichages: 39

Hub

XLDnaute Occasionnel
Re : VBA - plusieur confitions If dans la macro « Private Sub Worksheet_Change »

Bonsoir,

Le fichier joint (la suite de Robert) me sert entre autre à tester la fonction WorksheetFunction.Fixed
Dans la feuille 3, toute la partie inférieure concerne cette fonction, ça marche. Sauf que le contrôle Isnumeric de la feuille 1 beug.
Pour tenter de résoudre ce beug, j’ai placé toute la partie qui concerne cette fonction « .Fixed » dans la feuille 1. Rater, un sablier se met en place pour des temps infinis… et plante Excel plus moyen de quitter ou autre.

Etant débutant, je ne comprends pas la mise en garde de "Si" :
Le passage par une autre feuille est-il obligatoire ?
Si oui, il faut faire attention à l’inhibition et, de pair, à la réactivation des évènements.


Comment résoudre ce problème

Merci d’avance pour vos réponses,

@+
 

Pièces jointes

  • test phrase concaténée 2.xls
    57.5 KB · Affichages: 28

Modeste

XLDnaute Barbatruc
Re : VBA - plusieur confitions If dans la macro « Private Sub Worksheet_Change »

Bonjour Hub, le fil :)

Pas regardé tout le code (des choses que je n'ai pas comprises et d'autres qui paraissent "bizarres" :confused:)

Par contre, l'aide de Vba stipule pour la WorksheetFunction.Fixed qu'elle
Arrondit un nombre au nombre spécifié de décimales, formate le nombre au format décimal à l'aide de virgules et renvoie le résultat sous forme de texte.
Pourquoi ne pas utiliser la WorksheetFunction.Round (voire même vba.Round)? Parce que, dans ce cas IsNumeric renverrait True
 

Hub

XLDnaute Occasionnel
Re : VBA - plusieur confitions If dans la macro « Private Sub Worksheet_Change »

Bonjour à tous,

Le point N°1 qu’il faut prendre en compte, c’est que je suis débutant en VBA, que j’ai un champ de vision très limité des possibilités de VBA et de la manière où il traite les informations. Le fichier joint ressemble à un condensé du projet final.
Tout comme un apprenti alchimiste, j’ajoute un peu de perlinpinpin dans mes macros pour voir comment réagi VBA.!!!
Ce qui explique que tout cela doit paraître incohérent pour vous, les Masters, qui tentaient de m’aider.

Le souci actuel ne vient pas de l’utilisation de la fonction .Fixed ou .ROUND, du type de variable… mais de la manière chronologique où les étapes sont traitées.

Bizarrement, alors que la saisie des variables de la « plage, (cellule en jaune) » se fait sur la feuille 1 et que bien même le choix des langues ne change pas, VBA commence ses vérifications par la macro de la feuille 3. (information obtenue par les MsgBox).
Ce qui explique pourquoi le test IsNumeric n’est pas pris en compte

Vu de ma fenêtre, la solution serait de forcer VBA à tester la macro de la feuille 3 uniquement si D1 change d’état.
Comment faire ?

Merci d’avance pour vos réponses.

@+
 

Pièces jointes

  • test phrase concaténée 3.xls
    59 KB · Affichages: 27

Discussions similaires

Statistiques des forums

Discussions
315 083
Messages
2 116 043
Membres
112 641
dernier inscrit
chab77