XL 2016 Activer macro différentes en fonctions d'un résultat de RECHERCHEV

Moody76

XLDnaute Nouveau
Bonjour à tous,

J'ai crée un fichier très simplifié pour illustrer mon problème :

Sur le fichier on a un tableau contenant les numéros chrono et différents appareils étalons. On saisit un numéro chrono ce qui fait apparaître l'étalon correspondant au numéro choisit (par un RECHERCHEV).
Je souhaiterais qu'en fonction du résultat du RECHERCHEV on déclenche une macro attribuée à un étalon.
Je suis débutant sur l'utilisation de VBA et ne connait quasiment pas le language, j'aurai besoin d'un sérieux coup de pouce.
Merci d'avance, je me tiens disponible ...
 

Pièces jointes

  • exemple.xlsm
    19.2 KB · Affichages: 65

Modeste

XLDnaute Barbatruc
Bonjour Moody76 et bienvenue,

Il faudrait peut-être faire deux choses:

  • expliquer plus clairement quelle macro devrait être déclenchée et dans quel cas (pour toi, c'est sans doute évident; pour nous beaucoup moins!)
  • préciser pourquoi tu veux une macro (les macros REMPLIR1, REMPLIR2 et REMPLIR3 pourraient être simplifiées ou même remplacées par de simples formules ... me semble-t-il)
 

Moody76

XLDnaute Nouveau
Bonjour Modeste,

Tout d'abord je tiens à préciser que ceci est un exemple qui est très loin de la version originale qui serait très pénible à décortiquer pour m'aider, j'ai donc essayer au mieux de faire quelque chose de simple traduisant mon problème (cela peut expliquer que mon tableau et les macros REMPLIRX paraissent inutiles).
Alors oui, j'imagine que cela demande de plus amples explications, alors en faite je voudrais ceci :

- Si dans la cellule F7 le nom de l'étalon comporte le terme 001.16 alors je déclenche la macro ETALON12
-Si dans la cellule F7 le nom de l'étalon comporte le terme 001.12 alors je déclenche la macro ETALON16
etc...
La présence du menu déroulant qui déclenche les macros REMPLIR 1,2,3 est dut au fait que je suppose que la présence de plusieurs macro pourrait créer des soucis...
On m'a proposé la solution suivante...

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("I3")) Is Nothing Then Exit Sub

If Target.Address = "$I$3" Then
If [I3] = "1" Then REMPLIR1
If [I3] = "2" Then REMPLIR2
If [I3] = "3" Then REMPLIR3
End Sub


Private Sub Worksheet_Calculate()
If Range("F7").Value Like "*001.16*" Then Module1.ETALON12
If Range("F7").Value Like "*001.12*" Then Module1.ETALON16
If Range("F7").Value = "kaz 004.04" Then Module1.ETALON3
If Range("F7").Value = "jefi4 005.04" Then Module1.ETALON4
End Sub

Qui marche très bien dans ce cas la (mis à part un message d'erreur bloc End If sans If).

Cependant sur la version originale du fichier en adaptant le code toutes mes macros contiennent des erreurs à chaque lignes du genre :
Erreur 1004
Impossible de définir la propriété NumberFormat de la classe Range
ou encore
Erreur d'execution 1004
La méthode Select de la classe Range a échoué
J'ai pourtant juste changé les cellules et macro correspondantes

Je reste disponible pour autres précision nécessaires.
 

Modeste

XLDnaute Barbatruc
Re-bonjour,

Ça paraît encore un peu compliqué, vu d'ici !? Pourquoi pas, pour les "REMPLIR", simplement:
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$I$3" Then [C4:C18] = [I3]
End Sub
Bon d'accord, c'est un peu simplifié à l'extrême, il y aurait une iou deux vérifications à faire avant l'exécution, mais comme on ne connaît pas "l'étendue du problème" ...
 

Moody76

XLDnaute Nouveau
Bonjour à tous et mes excuses Modeste pour le retard....

En réalité le fichier n'est juste un exemple et je suis bien conscient que les macro "REMPLIR" ne sont pas optimisés et on peut les considérer comme macros "bidons" juste dans le but de voir si les macros que je test ne rentrent pas en conflit...

J'ai un peu avancé sur le problème et il me reste un étape très problématique, je m'explique :

Je lis le message suivant :

"Erreur d’exécution '-2147417848 (80010108)':

La méthode 'FormulaArray' de l'objet 'Range' a échoué

En effet, en saisissant mon numéro chrono, la cellule F7 affiche bien l'étalon correspondant..
à l'aide la macro suivante :

Private Sub Worksheet_Calculate()
If Range("F7").Value Like "*001.16*" Then Module1.ETALON16
If Range("F7").Value Like "*001.12*" Then Module1.ETALON12

Je veux déclencher une macro contenant le calcul d'une somme (impérativement) par la fonction FormulaArray (qui indépendamment de son déclenchement par le terme "001.16" fonctionne très bien) comme ceci :

Sub ETALON16()
'
' ETALON16 Macro
'
Range("I5").FormulaArray = _
"=Sum(A4,A7)" <= La macro affiche le message d'erreur à ce niveau en mode pas à pas détaillé
Range("I6").FormulaArray = _
"=Sum(A5,A8)"
End Sub

Je pense pour ma part qu'Excel se met à remplir la cellule I5 à l'infini car je ne sais pas comment traduire sur Visual Basic le fait que lorsque le terme 001.16 s'affiche dans la cellule F7, alors je veux que Excel déclenche une seule fois le calcul en FormulaArray.

J'aimerai connaitre votre avis, comment éviter ce problème en précisant que je dois impérativement utiliser "FormulaArray" pour par la suite utiliser des formules matricielles.
 

Paf

XLDnaute Barbatruc
Bonjour Moody76, Modeste :),

J'ai raté des épisodes, et le classeur du post 1 ne correspond sans doute plus, mais, peut-être essayer:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$I$3" Then
    If [I3] = "1" Then REMPLIR1
    If [I3] = "2" Then REMPLIR2
    If [I3] = "3" Then REMPLIR3
End If
If Target.Address = "$F$3" Then
    If Range("F7") Like "*001.16*" Then ETALON12
    If Range("F7") Like "*001.12*" Then ETALON16
    If Range("F7") = "kaz 004.04" Then ETALON3
    If Range("F7") = "jefi4 005.04" Then ETALON4
End If
End Sub

=> la modif de F3 va mettre à jour F7 et déclencher cette macro sans relancer Calculate indéfiniment .

A+

Edit : plutôt qu'une cellule avec recherchev, on pourrait intégrer la recherche dans cette macro.
 

Moody76

XLDnaute Nouveau
Bonjour Paf,

Tout d'abord merci de prendre un peu de ton temps pour m'aider...

Alors le soucis c'est qu'effectivement, j'ai modifié le programme VBA maintenant je passe pars la fonction Worksheet_Calculate pour déclencher les macros ETALON :

Private Sub Worksheet_Calculate()
If Range("F7").Value Like "*001.16*" Then Module1.ETALON16
If Range("F7").Value Like "*001.12*" Then Module1.ETALON12

Car il s'avère que passer par la fonction Worsheet_Change entrainait des soucis...
 

Paf

XLDnaute Barbatruc
re,

Car il s'avère que passer par la fonction Worsheet_Change entrainait des soucis...

pas de chance, je disais exactement le contraire...

calculate vérifie F7 et lance une mise à jour de cellule qui déclenche calculate qui vérifie F7 (qui n'a pas changé) et lance une mise à jour qui déclenche calculate qui ...


Bonne suite
 

Moody76

XLDnaute Nouveau
Bonjour Modeste,

Tout d'abord je partage une version "exemple" simplement pour des raisons de confidentialité, donc mon fichier peut paraître certes grotesque et inutile mais je ne peux pas vraiment en montrer plus (d'où le fait que les macros "REMPLIR" peuvent sembler réalisés de manières débiles).

Oui il s'avère et la ce sont mes lacunes à propos de VBA qui se font sentir ... que tu as effectivement raison cela fonctionne très bien (autant pour moi), mais je ne sais pas comment faire si mon numéro chrono en F3 se situe sur une autre feuille, aurais-tu une idée Paf ? STP
 

Statistiques des forums

Discussions
311 725
Messages
2 081 943
Membres
101 849
dernier inscrit
florentMIG