Passage de formule en VBA

Résolu
Kusco Messages postés 466 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 15 décembre 2014 - Modifié par Kusco le 30/10/2013 à 10:36
Kusco Messages postés 466 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 15 décembre 2014 - 30 oct. 2013 à 12:21
Bonjour à tous,

Malgré mes différents passages sur les forums, je ne comprends pas pourquoi ma formule ne fonctionne pas. J'ai essayé plusieurs choses mais impossible.

Avec un formulaire (userform), une fois le bouton sauvegarder presser, la ligne X à la colonne 13 doit apparaître cette formule :
=DATEDIF(LX;AUJOURDHUI();"y")&" Ans "&DATEDIF(Lx;AUJOURDHUI();"ym")&" mois"


J'ai essayé avec ceci et bien d'autre formules mais cela ne fonctionne pas :
Cells(no_ligne, 13).Value = "=(DATEDIF(L & no_ligne;TODAY();y)& Ans &DATEDIF(L & no_ligne;TODAY();ym)& mois)" 


Une idée ? Merci !

13 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 14
30 oct. 2013 à 11:20
1- Si ton Excel est Anglais, utilises "TODAY" sinon "AUJOURDHUI()" semble plus adapté...

2- S'il est en Français, utilise également FormulaLocal et non FormulaR1C1 (comme indiqué par UcFoutu)

3- Lorsque, dans une formule, un terme doit être entouré de guillemets, il convient, sous VBA, de les doubler :
exemple :
Cells(no_lig, 1).FormulaLocal = "=DATEDIF(L" & no_lig & ";AUJOURDHUI();""y"")&"" Ans """


1
jordane45 Messages postés 38169 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 9 mai 2024 344
30 oct. 2013 à 10:12
Bonjour,

J'ai déplacé le sujet dans la section VBA (merci de faire attention la prochaine fois)

Lorsque vous collez du code dans vos messages, merci d'utiliser la coloration syntaxique ( voir ICI : balises-code)

Enfin, pour répondre à votre question, vous ne devez pas utiliser la propriété VALUE mais FORMULAR1C1 ou FORMULALOCAL (voir aide Excel VBA )

0
Kusco Messages postés 466 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 15 décembre 2014
30 oct. 2013 à 10:42
Bonjour,

Excuse moi, je n'avais pas tout de suite différencié.

Modifié, je prends note.

Je viens d'essayer, aucun résultat :Erreur 1004 erreur défini par l'application ou l'objet.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 oct. 2013 à 10:50
Bonjour,
avec quelle syntaxe (un copier/coller de ton code) ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kusco Messages postés 466 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 15 décembre 2014
30 oct. 2013 à 10:57
Voici mon code en entier :

Private Sub CommandButton1_Click()
Application.ScreenUpdating = False

Dim no_ligne As Integer

Sheets("BDD").Select
no_ligne = Range("A65536").End(xlUp).Row + 1

Cells(no_ligne, 1) = T1
Cells(no_ligne, 2) = T2
Cells(no_ligne, 3) = T3
Cells(no_ligne, 4) = T8
Cells(no_ligne, 5) = T9
Cells(no_ligne, 6) = T10
Cells(no_ligne, 7) = T14
Cells(no_ligne, 8) = T5
Cells(no_ligne, 9) = C4
Cells(no_ligne, 10) = C5
Cells(no_ligne, 11) = C1
Cells(no_ligne, 12) = T12
Cells(no_ligne, 13).FormulaR1C1 = "=(DATEDIF(L & no_ligne;TODAY();y)& Ans &DATEDIF(L & no_ligne;TODAY();ym)& mois)"
Cells(no_ligne, 14).FormulaR1C1 = "=(TODAY()-L & no_ligne)/365"
Cells(no_ligne, 15) = T13
Cells(no_ligne, 16) = C6
Cells(no_ligne, 19) = T7
Cells(no_ligne, 20) = T20

End Sub
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 14
30 oct. 2013 à 11:02
Bonjour tout le monde.

La première erreur que je constate dans la ligne de code donnée, est le "mixage" de variable dans la formule.
Je suppose que no_ligne est une variable???
Il faut donc "l'isoler" (désolé je ne connais pas le terme technique) du reste de la formule.

Exemple d'une formule qui fonctionne avec une variable intégrée :
no_ligne = 5
Cells(no_ligne, 13).FormulaLocal = "=SOMME(A1:A" & no_ligne & ")"

On voit, dans cet exemple, que la variable est "sortie" des guillemets et placée entre deux &.
0
Kusco Messages postés 466 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 15 décembre 2014
30 oct. 2013 à 11:10
Bonjour,

Autant pour moi je l'ignorais.
no_ligne est bien une variable, elle définit le numéro de la dernière ligne.

J'ai donc essayé :
Cells(no_ligne, 13).FormulaR1C1 = "=(DATEDIF(L2:L" & no_ligne & ";TODAY();y)& Ans &DATEDIF(L2:L" & no_ligne & ";TODAY();ym)& mois)"
Cells(no_ligne, 14).FormulaR1C1 = "=(TODAY()-L2:L" & no_ligne & ")/365"


Toujours la même erreur cependant.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
30 oct. 2013 à 11:10
On commence par la première :
1) un simple
MsgBox "=(DATEDIF(L & no_ligne;TODAY();y)& Ans &DATEDIF(L & no_ligne;TODAY();ym)& mois)"

te montrerait que cette formule ne peut fonctionner !
Commence par apprendre (depuis Excel) à la "dresser" manuellement, avant de vouloir tenter de l'écrire dynamiquement
2) la notation FORMULAR1C1 (comme celle de FORMULA) n'est pas française, mais anglaise (, et non ;), contrairement à celle de FORMULALOCAL et FORMULAR1C1LOCAL (qui, par contre, doivent elles utiliser les termes de la langue de ton PC).
0
Kusco Messages postés 466 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 15 décembre 2014
30 oct. 2013 à 11:16
1) Ma formule sous excel fonctionne parfaitement, elle est peut être mal adapté plutôt.
=DATEDIF(LX;AUJOURDHUI();"y")&" Ans "&DATEDIF(Lx;AUJOURDHUI();"ym")&" mois"


2) Autant pour moi, mais du coup en utilisant les termes "TODAY" plutôt que "AUJOURDHUI" cela ne pose pas de problème, si ?
0
Kusco Messages postés 466 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 15 décembre 2014
30 oct. 2013 à 11:39
D'accord merci pour ces informations complémentaires, cela me servira beaucoup à l'avenir.

Ta formule fonctionne très bien, merci beaucoup je n'ai plus d'erreur.
Cependant la formule dans la cellule affiche ceci par exemple :
=DATEDIF($14:$14;AUJOURDHUI();"y")&" Ans " &DATEDIF($14:$14;AUJOURDHUI();"ym")&"mois"


Du coup cela prends en compte toute la ligne plutôt que la colonne est donc cela ne fonctionne pas. Une idée ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 14
Modifié par pijaku le 30/10/2013 à 11:47
Je vais donc rejoindre ucfoutu et bon nombre d'adeptes de VBA Excel en te disant :
"avant de penser VBA, pense Excel."

Comment écrirais tu ta formule sous Excel?

Exemple de démarche à accomplir :
1- j'écris ma formule dans le tableur, en B1 :
=SOMME(A1:A10)
2- Je transcris en VBA :
Cells(1, 2).FormulaLocal = "=SOMME(A1:A10)"

3- J'insère ma variable :
ici la dernière ligne remplie de la colonne A, afin de faire la somme de A1 à la dernière cellule saisie de la colonne A :
Dim DernLigne As Long
'Attribution de la valeur à la variable
DernLigne = Range("A" & Rows.Count).End(xlUp).Row
'insertion de la variable dans la formule
Cells(1, 2).FormulaLocal = "=SOMME(A1:A" & DernLigne & ")"


Une fois ton problème initial bien posé, tu te rends compte qu'il se résout de lui même...
Cordialement,
Franck
0
Kusco Messages postés 466 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 15 décembre 2014
30 oct. 2013 à 12:02
Je t'avoue que je ne comprends pas.
Je vois ce que tu cherches à me dire et du coup j'ai essayé de tout refaire par rapport à ce que tu me disais, mais je suis retombé sur la formule que tu avais écrite.

En pensant excel la formule fonctionne, où me suis trompé ?

Merci pour ton temps...
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 14
Modifié par pijaku le 30/10/2013 à 12:08
De rien pour mon temps...

Lorsque tu écris, dans une formule, $14:$14, tu fais référence à la ligne 14. Si tu veux faire référence à la colonne B, il convient d'écrire : $B:$B. Mais là c'est du Excel, pas du VBA...

Essaye ces formules :
=SOMME($G:$G)
=SOMME($14:$14)

J'ajouterais ceci, à bon entendeur :
Eviter un maximum d'écrire des formules qui ont pour plage de valeurs des colonnes (ou des lignes) entières.
0
Kusco Messages postés 466 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 15 décembre 2014
30 oct. 2013 à 12:13
Je pense que nous sommes parti sur un quiproquo.
En fait j'écris ma formule VBA comme tu me l'as conseillé, seulement c'est $12:$12 qui apparaît au lieu de la cellule définie grâce à "L;no_ligne"
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 14
30 oct. 2013 à 12:17
Peux tu, pour plus de clarté, nous donner :
1- ta formule telle qu'elle doit être inscrite dans la feuille Excel (avec un x à la place du numéro de ligne variable)
2- ton adaptation en VBA de cette dite formule.
0
Kusco Messages postés 466 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 15 décembre 2014
30 oct. 2013 à 12:21
Je viens de voir mon erreur, merci pour tout !

La formule de base était donc :
=DATEDIF(Lx;AUJOURDHUI();"y")&" Ans "&DATEDIF(Lx;AUJOURDHUI();"ym")&" mois"


Et pour fonctionner il faut placer en VBA :
<code>Cells(no_ligne, 13).FormulaLocal = "=DATEDIF(L" & no_ligne & ";AUJOURDHUI();""y"")&"" Ans "" &DATEDIF(L" & no_ligne & ";AUJOURDHUI();""ym"")&""mois"""

Cela fonctionne à merveille, merci !
0
Rejoignez-nous