Insérer une formule dans une cellule par un code VBA
Bonjour à tous!
J'ai une formule qui fonctionne très bien dans une cellule, mais quand je la met en VBA pour l'insérer dans une cellule ça ne fonctionne plus. J'ai un code d'erreur comme si le code VBA ne voulait pas transcrire la formule dans la cellule. Je vous joint le code :
Private Sub worksheet_change(ByVal Target As Range)
On Error Resume Next
If Not Application.Intersect(Target, Range("G10:G30")) Is Nothing Then
If Target <> "" Then
Exit Sub
Else
Target.FormulaR1C1 = "=SIERREUR(SI(RC=""S"";DateEtape(VRAI;LIGNE());SI(RC=""DD"";SERIE.JOUR.OUVRE.INTL(INDIRECT(ADRESSE(RC+8;7));RC;CONCAT(TB_Jourdetravail);Jours_Fériés);SI(RC=""DF"";SERIE.JOUR.OUVRE.INTL(INDIRECT(ADRESSE(RC+8;7));SI(RC=0;RC-1;RC-RC);CONCAT(TB_Jourdetravail);Jours_Fériés);SI(RC=""FD"";SERIE.JOUR.OUVRE.INTL(INDIRECT(ADRESSE(RC+8;8));RC+1;CONCAT(TB_Jourdetravail);Jours_Fériés);SI(RC=""FF"";SERIE.JOUR.OUVRE.INTL(INDIRECT(ADRESSE(RC+8;8));SI(RC=0;RC;RC-RC+1);CONCAT(TB_Jourdetravail);Jours_Fériés);"")))));"")"
End If
End If
End SubJe vous mets également le classeur:
Le problème surviens à la ligne Target.FormulaR1C1.
Pouvez-vous m'aider à comprendre ce qui ne fonctionne pas?
Bonjour,
Plusieurs points:
-Vu que c'est lors de la sélection d'une des cellules de la colonne G ou H, ce serait plutôt ceci: Private Sub worksheet_SelectionChange(ByVal Target As Range)
-Votre formule est peut-être fausse. Il était plus simple de lancer l'enregistreur de macro, se positionner sur la cellule contenant la formule, et de la valider dans la barre de formule.
- Si vous avez copié la formule saisie dans la barre de formule et ensuite coller dans le code, dans ce cas il ne faut pas mettre"FORMULAR1C1" mais "FORMULALOCAL"
- le code est dans une macro évènementielle, c'est à dire qu'il va se répéter à chaque changement dans la plage de cellules, il faut donc lui interdire la répétition du code tant que ce n'est pas fini, c'est la ligne en début de code "Appplication.EnableEvents= False" qui s'en chargera, et en fin de macro, il ne faut pas oublier de remettre tout ça en service avec la ligne en fin de code "Appplication.EnableEvents= True".
-Mais, si au cours du déroulement de la macro, s'il y a un bug, la macro s'arrêtera et la dernière action ne sera pas lue, ce qui fait que la macro ne pourra plus détecter les prochains changements dans la cellule. Pour cela, on lui impose de lire la dernière ligne en lui indiquant au tout début "If Error Goto Sortie" qui renverra vers l'étiquette "Sortie" quoiqu'il arrive.
Cdlt
Bonjour
La voie indiquée par Arturo est la plus efficace.
Enregistrer une macro, qui porte sur la cellule qui contient la formule. La syntaxe sera conforme car toute ta zone en rouge contient des fonctions en français que vba ne connait pas !!
Lancer l'enregistreur cliquer sur la cellule qui contient la formule, valider et quitter l'enregistreur ==> copier la partie concernée dans ton code et lancer.
Si ça coince tu seras peut être obligé de corriger les fonctions excel que VBa ne connait pas en les complétant avec la syntaxe suivante par exemple:
Application.WorksheetFunction.Transpose(SousBase())
Bon courage
FINDRH
Bonjour à vous deux!
Ça fonctionne à la perfection, je vous remercie beaucoup! Je remarque que mes formules n'étaient pas en anglais dans le VBA ce qui a dû contribué également au fait que ça ne fonctionnait pas.
J'ai tenté de reproduire la même chose afin de compléter le codage. Toutefois, ça ne fonctionne pas quand je fais ce qui me semble, la même chose que vous haha. Voici le code que j'ai tenté de mon côté :
Target.Offset(0, -2).Formula2R1C1 = _
"=IF(OR(RC3=""S"";RC7="""");"""";IF(RC8="""";NETWORKDAYS.INTL(RC7;TODAY();CONCAT(TB_Jourdetravail);Jours_Fériés);NETWORKDAYS.INTL(RC7;RC8;CONCAT(TB_Jourdetravail);Jours_Fériés)))"Si je lui mets une formule simple du style : "=RC", il fonctionne très bien, la cellule est bonne et la formule s'incère, mais je suis incapable de le faire pour la formule ci-haut. Je pense que tout est en anglais et c'est une formule qui existe déjà et qui fonctionne dans le classeur. Je n'arrive pas à voir l'erreur elle est où?
Comme préciser précédemment mais un peu différemment, si vous laisser la formule en français (dans le cas ou vous feriez une copie de la formule pour la copier dans le code VBA), il faut utiliser FORMULALOCAL, sinon ce sera FORMULAR1C1.
Pour le problème suivant, il serait bon de préciser, quelle cellule vous sélectionnez?
J'ai tenté de le mettre en français, mais sans succès en essayant différente fonction de Formula.
Dans ma problématique il doit changer la cellule se retrouvant dans la même ligne, mais la colonne F. Ce n'était pas clair je suis désolé, je vous mets le code complète :
'Fin projeté'
If Not Application.Intersect(Target, Range("H9:H" & DTEH.[A10000].End(xlUp).Row)) Is Nothing Then
If Target.Offset(0, -5) = "S" Then
Target.Formula2R1C1 = _
"=IFERROR(IF(RC3=""S"",DateEtape(FALSE,ROW()),IF(RC7="""","""",IF(RC6=0,WORKDAY.INTL(RC7,RC6,CONCAT(Jourdetravail),Jours_Fériés),WORKDAY.INTL(RC7,RC6-1,CONCAT(Jourdetravail),Jours_Fériés)))),"""")"
Else
If Target <> "" Then
Target.Offset(0, -2).Formula2R1C1Local = _
"=SI(OU(RC3=""S"";RC7="");"""";SI(RC8="""";NB.JOURS.OUVRES.INTL(RC7;AUJOURDHUI();CONCAT(TB_Jourdetravail);Jours_Fériés);NB.JOURS.OUVRES.INTL(RC7;RC8;CONCAT(TB_Jourdetravail);Jours_Fériés)))"
Else
Target.Formula2R1C1 = _
"=IFERROR(IF(RC3=""S"",DateEtape(FALSE,ROW()),IF(RC7="""","""",IF(RC6=0,WORKDAY.INTL(RC7,RC6,CONCAT(Jourdetravail),Jours_Fériés),WORKDAY.INTL(RC7,RC6-1,CONCAT(Jourdetravail),Jours_Fériés)))),"""")"
End If
End If
End IfBonjour Arturo 83,
J'ai trouver ce qui ne fonctionnait pas, c'était le fait que j'avais conserver les points virgule ";" au lieu de les remplacer par le virgule ","!
Tout fonctionne, je te remercie beaucoup!