Difficultés pour corriger 1 erreur d'exécution 1004 VBA

Bonjour à tous,

Alors voilà, j'utilise VBA depuis environ un mois dans le cadre de mon stage et je me retrouve face à un problème que je n'arrive pas à résoudre.

Je travaille sur un modèle dans un classeur excel (version 2010). Le fichier est très lourd et mon objectif est d'optimiser son utilisation en créant une fiche d'entrée claire.

En quelques mots, le modèle simule la répartition d'un fond entre différentes collectivités. Il existe les bénéficiaires et les contributeurs. Dans ma fiche d'entrée, l'utilisateur a la possibilité de choisir des variables qui ont un impact sur le modèle et donc sur la simulation. Ainsi, il peut jouer comme il le veut sur la répartition du fond. J'ai décidé de faire en sorte que si l'utilisateur ne rentre rien dans une des 33 cellules (ou plus) cela affecte la valeur standard par défaut. Il faut savoir aussi que lorsque l'utilisateur rentre une valeur dans une de ces cellules, la valeur est alors renvoyée dans une autre cellule d'un autre onglet du ficher.

Pour 27 des cellules je ne rencontre aucun soucis car comme je l'ai précisé juste avant la cellule contient la valeur à modifier. Cependant, pour les 6 cellules restantes, le problème vient du fait qu'elles font partie d'une formule dans la cellule cible. C'est à dire que l'utilisateur peut modifier le résultat de la cellule en modifiant un des termes.

J'ai créé un code qui affecte aux différentes cellules cibles soit les valeurs standards soit les valeurs rentrées par l'utilisateur. J'ai affecté ce code à un bouton dans ma fiche d'entrée (nom du bouton: "mise à jour du modèle"). Lorsque je clique sur ce bouton et que j'ai enlevé du code les lignes correspondant aux 6 cellules qui me posent problème tout fonctionne parfaitement. Mais lorsque j'isole ces quelques lignes pour en faire un code unique, que je l'affecte au bouton et que je clique dessus, un message d'erreur apparait:

"Erreur d'exécution '1004':

Erreur définie par l'application ou par l'objet" avec un bouton ok et un aide.

Je vais essayer d'être plus claire en détaillant le code (code isolé pour mes 6 variables à problème):

Sub mise_a_jour()

    Dim PFiA2014, Rev2014, PFiA2015, Rev2015, PFiA2016, Rev2016 As Single 'Ici je définis les variables que l'utilisateur peut modifier
    'Et je leur affecte donc la valeur de la cellule de la fiche d'entrée dans laquelle l'utilisateur entre son choix
    PFiA2014 = Sheets("Fiche entrée").Range("F12").Value
    Rev2014 = Sheets("Fiche entrée").Range("F14").Value
    PFiA2015 = Sheets("Fiche entrée").Range("L12").Value
    Rev2015 = Sheets("Fiche entrée").Range("L14").Value
    PFiA2016 = Sheets("Fiche entrée").Range("R12").Value
    Rev2016 = Sheets("Fiche entrée").Range("R14").Value
    Dim so As String
    so = "s.o"

    'il faut savoir que lorsque je clique sur ok dans le message d'erreur le débogueur ne m'indique aucune ligne en particulier...

    If PFiA2014 <> "" And Rev2014 <> "" Then 'Ici il s'agit des différents cas de figure que l'on peut rencontrer dans la formule
        Sheets("Fiche 1 Région").Range("E70").FormulaLocal = "=SI((PFiA2014*(E45/(E46)-1) + Rev2014*(E68-1))>0;(PFiA2014*(E45/(E46)-1) + Rev2014*(E68-1)); (so))"

    ElseIf PFiA2014 <> "" And Rev2014 = "" Then
        Sheets("Fiche 1 Région").Range("E70").FormulaLocal = "=SI((PFiA2014*(E45/(E46)-1) + 0.25*(E68-1))>0;(PFiA2014*(E45/(E46)-1) + 0.25*(E68-1)); (so))"

    ElseIf PFiA2014 = "" And Rev2014 <> "" Then
        Sheets("Fiche 1 Région").Range("E70").FormulaLocal = "=SI((0.75*(E45/(E46)-1) + Rev2014*(E68-1))>0;0.75*(E45/(E46)-1) + Rev2014*(E68-1)); (so))"

    ElseIf PFiA2014 = "" And Rev2014 = "" Then
        Sheets("Fiche 1 Région").Range("E70").FormulaLocal = "=SI((0.75*(E45/(E46)-1) + 0.25*(E68-1))>0;0.75*(E45/(E46)-1) + 0.25*(E68-1)); (so))"

    End If

    If PFiA2015 <> "" And Rev2015 <> "" Then
        Sheets("Fiche 1 Région").Range("F70").FormulaLocal = "=SI((PFiA2015*(F45/(F46)-1) + Rev2015*(F68-1))>0;(PFiA2015*(F45/(F46)-1) + Rev2015*(F68-1)); (so))"

    ElseIf PFiA2015 <> "" And Rev2015 = "" Then
        Sheets("Fiche 1 Région").Range("F70").FormulaLocal = "=SI((PFiA2015*(F45/(F46)-1) + 0.25*(F68-1))>0;(PFiA2015*(F45/(F46)-1) + 0.25*(F68-1)); (so))"

    ElseIf PFiA2015 = "" And Rev2015 <> "" Then
        Sheets("Fiche 1 Région").Range("F70").FormulaLocal = "=SI((0.75*(F45/(F46)-1) + Rev2015*(F68-1))>0;0.75*(F45/(F46)-1) + Rev2015*(F68-1)); (so))"

    ElseIf PFiA2015 = "" And Rev2015 = "" Then
        Sheets("Fiche 1 Région").Range("F70").FormulaLocal = "=SI((0.75*(F45/(F46)-1) + 0.25*(F68-1))>0;0.75*(F45/(F46)-1) + 0.25*(F68-1)); (so))"

    End If

    If PFiA2016 <> "" And Rev2016 <> "" Then
        Sheets("Fiche 1 Région").Range("G70").FormulaLocal = "=SI((PFiA2016*(G45/(G46)-1) + Rev2016*(G68-1))>0;(PFiA2016*(G45/(G46)-1) + Rev2016*(G68-1)); (so))"

    ElseIf PFiA2016 <> "" And Rev2016 = "" Then
        Sheets("Fiche 1 Région").Range("G70").FormulaLocal = "=SI((PFiA2016*(G45/(G46)-1) + 0.25*(G68-1))>0;(PFiA2016*(G45/(G46)-1) + 0.25*(G68-1)); (so))"

    ElseIf PFiA2016 = "" And Rev2016 <> "" Then
        Sheets("Fiche 1 Région").Range("G70").FormulaLocal = "=SI((0.75*(G45/(G46)-1) + Rev2016*(G68-1))>0;0.75*(G45/(G46)-1) + Rev2016*(G68-1)); (so))"

    ElseIf PFiA2016 = "" And Rev2016 = "" Then
        Sheets("Fiche 1 Région").Range("G70").FormulaLocal = "=SI((0.75*(G45/(G46)-1) + 0.25*(G68-1))>0;0.75*(G45/(G46)-1) + 0.25*(G68-1)); (so))"

    End If

End Sub

Je ne comprends pas où se situe mon erreur, j'ai essayé le débogage pas à pas et j'ai tenté de trouver une solution sur différents forum mais rien à faire ! Même mon livre spécial VBA n'a pas été d'une grande utilité.

Si jamais certaines choses ne sont pas claires, n'hésitez pas à me demander des précisions, je conçois que ça ne soit pas très clair quand on a pas le fichier sous les yeux (le fichier ne m'appartenant pas, je n'ai pas l'autorisation de le diffuser).

Veuillez excuser la longueur de mon post et merci beaucoup d'avance pour votre aide.

Bonjour,

as-tu des macros événementielles liées aux feuilles de ton classeur ?

Bonjour,

J'ai un autre bouton dans la même fiche d'entrée et certains autres qui se baladent sur d'autres onglets.

Après je vais ajouter un Userform qui se déclenchera à partir d'un bouton aussi et deux autres boutons.

En regardant les codes, il n'y a pas de Userform encore, pas d'évènements à l'ouverture ou à la fermeture du classeur, ni pour les onglets, pas d'évènements liés à un click sur cellule, ni au démarrage ...

Pas de Private Sub dans les codes non plus !

Après je ne sais pas très bien si les clicks sur bouton font partie des macros évènementielles. Voilà les détails !

Merci pour l'aide !

Re bonjour,

quand tu fais le débogage pas à pas, Quelle est la dernière instruction que tu parviens à exécuter ?

Re bonjour,

Le message d'erreur apparait dès les premières instructions ! En fait il apparait dès que je teste une ligne d'instructions ...

et quand tu exécutes ce code sans passer par le bouton ?

Bonsoir Colwarkids, H2so4 et le forum,

Colwarkids, sans corriger tout le code, quand tu utilises la propriété FomulaLocal, il faut que tu remplisses la formule avec l'accentuation qui correspond à celle de ton ordinateur, dans ton cas (Excel FR), il faut remplacer le point par la virgule. De plus tu ne peux pas placer la variable so comme tu l'a fait, voici un exemple de correction à apporter :

Avant :

Sheets("Fiche 1 Région").Range("E70").FormulaLocal = "=SI((0.75*(E45/(E46)-1) + 0.25*(E68-1))>0;0.75*(E45/(E46)-1) + 0.25*(E68-1)); (so))" 

Après

        Sheets("Fiche 1 Région").Range("E70").FormulaLocal = "=SI((0,75*(E45/(E46)-1) + 0,25*(E68-1))>0;0,75*(E45/(E46)-1) + 0,25*(E68-1);""" & so & """)" ' le surlignage ne fonctione pas il faut allez jusqu'à la fin de la ligne pour connaitre la modification à apporter

Il est possible qu'il y ait d'autres erreurs ailleurs, mais corrige déjà toutes celles qui sont dans ce cas et vérifie aussi les parenthèses, tu en avais mis une de trop dans ta formule.

Une astuce pour contrôler les formules : tu mets un apostrophe juste avant le = qui doit entrer dans la cellule :

        Sheets("Fiche 1 Région").Range("E70").FormulaLocal = "'=SI((0,75*(E45/(E46)-1) + 0,25*(E68-1))>0;0,75*(E45/(E46)-1) + 0,25*(E68-1);""" & so & """)"

Tu exécutes la macro et ensuite tu vas dans Excel et tu supprimes l'apostrophe pour contrôler la formule. C'est beaucoup plus facile de s'apercevoir des erreurs de syntaxe.

Bonjour à tous les deux,

Tout d'abord merci beaucoup pour votre aide !

@h2so4, lorsque j'exécute le code sans passer par le bouton, j'ai le même problème.

@Benead, je vais modifier mon code à partir de tes corrections et refaire plusieurs tests pour voir si autre chose cloche.

Je vous tiendrai au courant du résultat.

Merci encore !

Alors j'ai effectué les corrections proposées par Benead.

Le code a marché mais les formules ont planté et grâce à l'astuce de Benead avec le ' j'ai pu comprendre qu'au lieu d'écrire "0,75 et 0,25" j'avais écris "0.75 et 0.25" ce qui faisait planté la formule.

Mais attention ce n'est pas fini (ça aurait été trop beau pour être vrai !!) ! Quand je relance le code à partir du bouton (ou même sans passer par le bouton) maintenant j'ai un nouveau message d'erreur qui s'affiche:

"Erreur d'exécution '424':

Objet requis"

Je vais faire des recherches de mon côté, si vous avez une idée, comme toujours, je suis preneuse !

@h2so4, tu m'avais parlé des macros évènementielles hier, en trifouillant les codes aujourd'hui je viens de m'apercevoir qu'il existe en effet une macro évènementielle dans un des onglets. Et c'est justement l'onglet dans lequel se trouve les cellules cibles de ma macro !


3ème message:

Le message d'erreur Objet Requis venait du fait que j'avais supprimer Dim so As String (...).

J'ai un problème de type avec les variables PFiA2014, Rev2014 etc. Il s'agit de chiffres compris entre 0 et 1 (donc non entier). Vous me conseillez de les déclarer sous quel type ?

Merci !

bonjour je ne sais pas si le sujet a déjà était abordé, mais je voudrais connaitre la procédure pour associer un mot a un autre dans un menue déroulant . . .. je m'explique admet on que dans mon menue déroulant j'ai 3 choix ( chat, chien, oiseau) je voudrais que lorsque je choisi chien automatiquement dans une autre cellule ce mette le mot "os" et par exemple pour oiseau le mot "graine"

cordialement 

Coldwarkids a écrit :

Alors j'ai effectué les corrections proposées par Benead.

Le code a marché mais les formules ont planté et grâce à l'astuce de Benead avec le ' j'ai pu comprendre qu'au lieu d'écrire "0,75 et 0,25" j'avais écris "0.75 et 0.25" ce qui faisait planté la formule.

Mais attention ce n'est pas fini (ça aurait été trop beau pour être vrai !!) ! Quand je relance le code à partir du bouton (ou même sans passer par le bouton) maintenant j'ai un nouveau message d'erreur qui s'affiche:

"Erreur d'exécution '424':

Objet requis"

connais-tu l'instruction qui donne cette erreur ?

Coldwarkids a écrit :

@h2so4, tu m'avais parlé des macros évènementielles hier, en trifouillant les codes aujourd'hui je viens de m'apercevoir qu'il existe en effet une macro évènementielle dans un des onglets. Et c'est justement l'onglet dans lequel se trouve les cellules cibles de ma macro !


3ème message:

Le message d'erreur Objet Requis venait du fait que j'avais supprimer Dim so As String (...).

J'ai un problème de type avec les variables PFiA2014, Rev2014 etc. Il s'agit de chiffres compris entre 0 et 1 (donc non entier). Vous me conseillez de les déclarer sous quel type ?

Merci !

les macros événementielles peuvent parfois être la cause de programmes qui se plantent sans que le debogueur ne puisse indiquer sur quelle instruction, grâce à Benead, j'ai appris que cela pouvait également arriver avec des formules contenant des erreurs de syntaxe.

pour le type, tout dépend de la précision nécessaire, mais tu as le choix entre variant (excel le détermine pour toi), single ou double.

Merci h2so4,

En Variant ça marche très bien, je testerai quand même single et double.

J'ai fini de régler mes problèmes de variables !

Toujours des erreurs de syntaxe, en relisant et relisant les codes on arrive à trouver les erreurs mais c'est long.

J'ai juste rajouter la fonction " + CStr() + " autour de mes variables pour qu'elles affichent la valeur qu'elles contiennent et non pas le nom dans la formule.

Tout marche très bien maintenant.

Je vais mettre le code final en fin de message pour si jamais cela doit aider quelqu'un et marquer la discussion comme résolue.

Merci à tous encore !

Sub mise_a_jour2()

    Dim PFiA2014, Rev2014, PFiA2015, Rev2015, PFiA2016, Rev2016 As Variant
    PFiA2014 = Sheets("Fiche entrée").Range("F12").Value
    Rev2014 = Sheets("Fiche entrée").Range("F14").Value
    PFiA2015 = Sheets("Fiche entrée").Range("L12").Value
    Rev2015 = Sheets("Fiche entrée").Range("L14").Value
    PFiA2016 = Sheets("Fiche entrée").Range("R12").Value
    Rev2016 = Sheets("Fiche entrée").Range("R14").Value
    Dim so As Variant
    so = "s.o"

    If PFiA2014 <> "" And Rev2014 <> "" Then
        PFiA2014 = Sheets("Fiche entrée").Range("F12").Value
        Rev2014 = Sheets("Fiche entrée").Range("F14").Value
        Sheets("Fiche 1 Région").Range("E70").FormulaLocal = "=SI(" + CStr(PFiA2014) + "*(E45/(E46)-1) + " + CStr(Rev2014) + "*(E68-1)>0;" + CStr(PFiA2014) + "*(E45/(E46)-1) + " + CStr(Rev2014) + "*(E68-1);""" & so & """)"

    ElseIf PFiA2014 <> "" And Rev2014 = "" Then
        PFiA2014 = Sheets("Fiche entrée").Range("F12").Value
        Sheets("Fiche 1 Région").Range("E70").FormulaLocal = "=SI(" + CStr(PFiA2014) + "*(E45/(E46)-1) + 0,25*(E68-1)>0;" + CStr(PFiA2014) + "*(E45/(E46)-1) + 0,25*(E68-1);""" & so & """)"

    ElseIf PFiA2014 = "" And Rev2014 <> "" Then
        Rev2014 = Sheets("Fiche entrée").Range("F14").Value
        Sheets("Fiche 1 Région").Range("E70").FormulaLocal = "=SI(0,75*(E45/(E46)-1) + " + CStr(Rev2014) + "*(E68-1)>0;0,75*(E45/(E46)-1) + " + CStr(Rev2014) + "*(E68-1);""" & so & """)"

    ElseIf PFiA2014 = "" And Rev2014 = "" Then
        Sheets("Fiche 1 Région").Range("E70").FormulaLocal = "=SI(0,75*(E45/(E46)-1) + 0,25*(E68-1)>0;0,75*(E45/(E46)-1) + 0,25*(E68-1);""" & so & """)"

    End If

    If PFiA2015 <> "" And Rev2015 <> "" Then
        PFiA2015 = Sheets("Fiche entrée").Range("L12").Value
        Rev2015 = Sheets("Fiche entrée").Range("L14").Value
        Sheets("Fiche 1 Région").Range("F70").FormulaLocal = "=SI(" + CStr(PFiA2015) + "*(F45/(F46)-1) + " + CStr(Rev2015) + "*(F68-1)>0;" + CStr(PFiA2015) + "*(F45/(F46)-1) + " + CStr(Rev2015) + "*(F68-1);""" & so & """)"

    ElseIf PFiA2015 <> "" And Rev2015 = "" Then
        PFiA2015 = Sheets("Fiche entrée").Range("L12").Value
        Sheets("Fiche 1 Région").Range("F70").FormulaLocal = "=SI(" + CStr(PFiA2015) + "*(F45/(F46)-1) + 0,25*(F68-1)>0;" + CStr(PFiA2015) + "*(F45/(F46)-1) + 0,25*(F68-1);""" & so & """)"

    ElseIf PFiA2015 = "" And Rev2015 <> "" Then
        Rev2015 = Sheets("Fiche entrée").Range("L14").Value
        Sheets("Fiche 1 Région").Range("F70").FormulaLocal = "=SI(0,75*(F45/(F46)-1) + " + CStr(Rev2015) + "*(F68-1)>0;0,75*(F45/(F46)-1) + " + CStr(Rev2015) + "*(F68-1);""" & so & """)"

    ElseIf PFiA2015 = "" And Rev2015 = "" Then
        Sheets("Fiche 1 Région").Range("F70").FormulaLocal = "=SI(0,75*(F45/(F46)-1) + 0,25*(F68-1)>0;0,75*(F45/(F46)-1) + 0,25*(F68-1);""" & so & """)"

    End If

    If PFiA2016 <> "" And Rev2016 <> "" Then
        PFiA2016 = Sheets("Fiche entrée").Range("R12").Value
        Rev2016 = Sheets("Fiche entrée").Range("R14").Value
        Sheets("Fiche 1 Région").Range("G70").FormulaLocal = "=SI(" + CStr(PFiA2016) + "*(G45/(G46)-1) + " + CStr(Rev2016) + "*(G68-1)>0;" + CStr(PFiA2016) + "*(G45/(G46)-1) + " + CStr(Rev2016) + "*(G68-1);""" & so & """)"

    ElseIf PFiA2016 <> "" And Rev2016 = "" Then
        PFiA2016 = Sheets("Fiche entrée").Range("R12").Value
        Sheets("Fiche 1 Région").Range("G70").FormulaLocal = "=SI(" + CStr(PFiA2016) + "*(G45/(G46)-1) + 0,25*(G68-1)>0;" + CStr(PFiA2016) + "*(G45/(G46)-1) + 0,25*(G68-1);""" & so & """)"

    ElseIf PFiA2016 = "" And Rev2016 <> "" Then
        Rev2016 = Sheets("Fiche entrée").Range("R14").Value
        Sheets("Fiche 1 Région").Range("G70").FormulaLocal = "=SI(0,75*(G45/(G46)-1) + " + CStr(Rev2016) + "*(G68-1)>0;0,75*(G45/(G46)-1) + " + CStr(Rev2016) + "*(G68-1);""" & so & """)"

    ElseIf PFiA2016 = "" And Rev2016 = "" Then
        Sheets("Fiche 1 Région").Range("G70").FormulaLocal = "=SI(0,75*(G45/(G46)-1) + 0,25*(G68-1)>0;0,75*(G45/(G46)-1) + 0,25*(G68-1);""" & so & """)"

    End If

End Sub
Rechercher des sujets similaires à "difficultes corriger erreur execution 1004 vba"