VBA - Insérer une formule dans une cellule
Résolu/Fermé
A voir également:
- Vba formule dans cellule
- Formule excel pour additionner plusieurs cellules - Guide
- Formule si et - Guide
- Aller à la ligne dans une cellule excel - Guide
- Formule excel moyenne - Guide
- Verrouiller une cellule excel dans une formule - Guide
11 réponses
Mike-31
Messages postés
18357
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
6 février 2025
5 113
Modifié par Mike-31 le 25/05/2012 à 19:44
Modifié par Mike-31 le 25/05/2012 à 19:44
Salut,
regarde comme cela
=SI(ET(DAPB!B16<>"";Structurel!B16<>"");Structurel!B16-DAPB!B16;"")
ou encore
=SI(OU(ESTVIDE(DAPB!B16);ESTVIDE(Structurel!B16));"";Structurel!B16-DAPB!B16)
A+
Mike-31
Une période d'échec est un moment rêvé pour semer les graines du savoir.
regarde comme cela
=SI(ET(DAPB!B16<>"";Structurel!B16<>"");Structurel!B16-DAPB!B16;"")
ou encore
=SI(OU(ESTVIDE(DAPB!B16);ESTVIDE(Structurel!B16));"";Structurel!B16-DAPB!B16)
A+
Mike-31
Une période d'échec est un moment rêvé pour semer les graines du savoir.
Utilisateur anonyme
25 mai 2012 à 20:23
25 mai 2012 à 20:23
Bonjour,
Suggestion :
<code>
Dim Formule As String
'"=SI(estvide(DAPB!B16);"";SI(estvide(Structurel!B16);"";Structurel!B16-DAPB!B16))"
Formule = "=SI(estvide(DAPB!B16);"
Formule = Formule & """" & """"
Formule = Formule & ";SI(estvide(Structurel!B16);"
Formule = Formule & """" & """"
Formule = Formule & ";Structurel!B16-DAPB!B16))"
MsgBox Formule
Cdt
Lupin
Suggestion :
<code>
Dim Formule As String
'"=SI(estvide(DAPB!B16);"";SI(estvide(Structurel!B16);"";Structurel!B16-DAPB!B16))"
Formule = "=SI(estvide(DAPB!B16);"
Formule = Formule & """" & """"
Formule = Formule & ";SI(estvide(Structurel!B16);"
Formule = Formule & """" & """"
Formule = Formule & ";Structurel!B16-DAPB!B16))"
MsgBox Formule
Cdt
Lupin
J'ai oublié de préciser que DAPB et Structurel sont les feuilles de référence pour la validation et le calcul.
On est jamais trop clair en prog...
On est jamais trop clair en prog...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Paf 25 mai 2012 à 19:15
bonjour,
il suffit de remplacer les points virgules par des virgules !!!
Les fonctions SI() dans excel prennent des points-virgules pour séparer ses arguments. Il n'acceptent pas les simples virgules.
Mike-31, j'apprécie ta réponse car en effet ma formule n'était pas optimale.
Cependant, je pense que je me suis mal exprimé.
Je sais que la formule fonctionne car je peux la copier/coller tel quel dans mon fichier excel et tout fonctionne.
Je sais également que mon code fonctionne car je peux remplacer le string de la formule par un mot test tel que "Test" et il va afficher "Test" dans les bonnes cellules.
Ce qui ne fonctionne pas, c'est que VBA n'est pas en mesure de lire avec succès le string:
"=SI(estvide(DAPB!B16);"";SI(estvide(Structurel!B16);"";Structurel!B16-DAPB!B16))"
L'erreur suivante m'est affiché sur la lecture de cette ligne:
Erreur d'exécution '1004'
Erreur définie par l'application ou par l'objet
bonjour,
il suffit de remplacer les points virgules par des virgules !!!
Les fonctions SI() dans excel prennent des points-virgules pour séparer ses arguments. Il n'acceptent pas les simples virgules.
Mike-31, j'apprécie ta réponse car en effet ma formule n'était pas optimale.
Cependant, je pense que je me suis mal exprimé.
Je sais que la formule fonctionne car je peux la copier/coller tel quel dans mon fichier excel et tout fonctionne.
Je sais également que mon code fonctionne car je peux remplacer le string de la formule par un mot test tel que "Test" et il va afficher "Test" dans les bonnes cellules.
Ce qui ne fonctionne pas, c'est que VBA n'est pas en mesure de lire avec succès le string:
"=SI(estvide(DAPB!B16);"";SI(estvide(Structurel!B16);"";Structurel!B16-DAPB!B16))"
L'erreur suivante m'est affiché sur la lecture de cette ligne:
Erreur d'exécution '1004'
Erreur définie par l'application ou par l'objet
re bonjour,
la fonction SI s'écrit avec des points virgules quand on l'écrit directement dans une cellule, mais si on veut passer par VBA, il faut remplacer les points virgules par une virgule!! c'est pas logique (du moins pour moi) mais dans la cellule on retrouve la formule avec ses points virgules!
il suffit d'essayer
pour s'en convaincre, enregistrer une macro: outre le nom des fonctions qui passe en anglais, il y a des virgules à la place des points virgules.
(dans le code, on peut écrire les fonctions en français ça marche aussi )
Bonne suite
la fonction SI s'écrit avec des points virgules quand on l'écrit directement dans une cellule, mais si on veut passer par VBA, il faut remplacer les points virgules par une virgule!! c'est pas logique (du moins pour moi) mais dans la cellule on retrouve la formule avec ses points virgules!
il suffit d'essayer
pour s'en convaincre, enregistrer une macro: outre le nom des fonctions qui passe en anglais, il y a des virgules à la place des points virgules.
(dans le code, on peut écrire les fonctions en français ça marche aussi )
Bonne suite
Bonjour,
si le cas est résolu, il serait souhaitable de le rendre Résolu :-)
... sous VBA, la formule reçu en lecture sera composé de virgule
et réaffecter sous son Type spécifique VBA de cette même formule.
mais si on effectue un copier/coller de la formule Excel, comme spécifié
par Paf, il suffit de construire avec des virgules ( code anglais) du
VBA.
comme j'ai soulevé dans un autre message,
https://forums.commentcamarche.net/forum/affich-25249792-vba-copier-formule-dans-colonne-sans-f-rc1c1
la valeur reçu de VBA pour les propriétés ( FormulaR1C1 ) et ( Value )
lorsque la cellule contient bien sur une formule :-)
j'ai déjà fait le test en me basant sur le texte d'aide et un bouquin
ce que je me rappelle de ma lecture, c'est que la propriété FormulaR1C1 est
utilisé pour lire la formule qu'on peut affecter dans une variable
string et de cette variable réaffecter à une autre cellule dans sa propriété ( Value ).
Cdt
Lupin
si le cas est résolu, il serait souhaitable de le rendre Résolu :-)
... sous VBA, la formule reçu en lecture sera composé de virgule
et réaffecter sous son Type spécifique VBA de cette même formule.
mais si on effectue un copier/coller de la formule Excel, comme spécifié
par Paf, il suffit de construire avec des virgules ( code anglais) du
VBA.
comme j'ai soulevé dans un autre message,
https://forums.commentcamarche.net/forum/affich-25249792-vba-copier-formule-dans-colonne-sans-f-rc1c1
la valeur reçu de VBA pour les propriétés ( FormulaR1C1 ) et ( Value )
lorsque la cellule contient bien sur une formule :-)
j'ai déjà fait le test en me basant sur le texte d'aide et un bouquin
ce que je me rappelle de ma lecture, c'est que la propriété FormulaR1C1 est
utilisé pour lire la formule qu'on peut affecter dans une variable
string et de cette variable réaffecter à une autre cellule dans sa propriété ( Value ).
Cdt
Lupin
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 254
Modifié par eriiic le 26/05/2012 à 00:10
Modifié par eriiic le 26/05/2012 à 00:10
Bonjour tout le monde,
en plus du remplacement des ; par la , je mettrai plutôt :
Sheets(Worksheets.Count).Cells("B15").formulalocal= "Formule a insérer"
au lieu de .Value
Pourquoi , au lieu de ; ?
En français la , sert de séparateur décimal et n'est pas disponible comme séparateur de liste et d'arguments.
Les fonctions des feuilles ont été adaptées (d'ailleurs c'est un paramètre modifiable dans le panneau de configuration), vba n'a pas été localisé français et conserve sa ,
eric
en plus du remplacement des ; par la , je mettrai plutôt :
Sheets(Worksheets.Count).Cells("B15").formulalocal= "Formule a insérer"
au lieu de .Value
Pourquoi , au lieu de ; ?
En français la , sert de séparateur décimal et n'est pas disponible comme séparateur de liste et d'arguments.
Les fonctions des feuilles ont été adaptées (d'ailleurs c'est un paramètre modifiable dans le panneau de configuration), vba n'a pas été localisé français et conserve sa ,
eric
Utilisateur anonyme
26 mai 2012 à 14:18
26 mai 2012 à 14:18
Bonjour,
Je comprends ton point de vue, mais la pratique m'a convaincu
d'utiliser Value pour recevoir la formule car lorsque je construit
une formule par VBA, si je tente d'affecter une formule erroné
à l'une des propriétés Formula, FormulaLocal, FormulaR1C1,
il y aura Erreur de Typage alors que Value le prend même avec
l'erreur, puisqu'elle n'existe plus il s'agit simplement d'une
string.
Lupin
Je comprends ton point de vue, mais la pratique m'a convaincu
d'utiliser Value pour recevoir la formule car lorsque je construit
une formule par VBA, si je tente d'affecter une formule erroné
à l'une des propriétés Formula, FormulaLocal, FormulaR1C1,
il y aura Erreur de Typage alors que Value le prend même avec
l'erreur, puisqu'elle n'existe plus il s'agit simplement d'une
string.
Lupin
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 254
26 mai 2012 à 14:46
26 mai 2012 à 14:46
Bonjour,
Effectivement, il le prend bien comme une formule et non un texte comme je pensais.
J'ai bien fait d'intervenir, j'aurais appris qcq chose ;-)
L'avantage de .formulalocal reste de pouvoir copier la formule d'une cellule et de la conserver en français dans vba, et éviter l'enregistreur de macro pour la traduire en anglais.
eric
Effectivement, il le prend bien comme une formule et non un texte comme je pensais.
J'ai bien fait d'intervenir, j'aurais appris qcq chose ;-)
L'avantage de .formulalocal reste de pouvoir copier la formule d'une cellule et de la conserver en français dans vba, et éviter l'enregistreur de macro pour la traduire en anglais.
eric
Utilisateur anonyme
27 mai 2012 à 01:53
27 mai 2012 à 01:53
re:
Voici les essais que j'ai fait sous Excel XP (2002)
La première instruction placé en commentaire est
fait par l'enregistreur de macro, ce qui est une
position relative,pas très efficace à mon avis ...
il suffit de fonctionner comme la première instruction
qui n'est pas en commentaire. La chaine Expression
est plus malléable que celle de l'enregistreur. :-)
Enfin, je n'ai pas tout compris moi non plus, mais sous
VBA j'ai toujours travaillé avec une affectation sur Value
et une récupération sur Formula, FormulaLocal, FormulaR1C1
Cdt
Lupin
Voici les essais que j'ai fait sous Excel XP (2002)
Option Explicit Sub Macro1() ' ' Macro1 Macro ' Macro enregistrée le 2012-05-26 par Lupin ' ' ' ActiveCell.FormulaR1C1 = "=IF(RC[3] > 2,RC[1] * RC[2],2)" ' Range("B3").Select ' Erreur 1004 ' Range("B4").FormulaLocal = "=IF(E2 > 2,C2 * D2,2)" ' Erreur 1004 ' Range("B4").FormulaLocal = "=SI(E2 > 2,C2 * D2,2)" Range("B4").Value = "=IF(E2 > 2,C2 * D2,2)" Dim Expression As String Expression = Range("B4").Formula MsgBox Expression End Sub
La première instruction placé en commentaire est
fait par l'enregistreur de macro, ce qui est une
position relative,pas très efficace à mon avis ...
il suffit de fonctionner comme la première instruction
qui n'est pas en commentaire. La chaine Expression
est plus malléable que celle de l'enregistreur. :-)
Enfin, je n'ai pas tout compris moi non plus, mais sous
VBA j'ai toujours travaillé avec une affectation sur Value
et une récupération sur Formula, FormulaLocal, FormulaR1C1
Cdt
Lupin
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 254
Modifié par eriiic le 27/05/2012 à 09:11
Modifié par eriiic le 27/05/2012 à 09:11
Bonjour,
Je ne procède pas pareil.
Je copie la formule écrite et testée sur la feuille (=SI(E2 > 2;C2 * D2;2)) et la colle telle que dans le .formulalocal.
J'ai mes fonctions en français, mes ; restent (pas besoin de les changer en ,), mes références de type A1, et aucune erreur.
Avec .value il faut quand même traduire les fonctions en anglais (pénalisant pour moi pour les fonctions moins communes sinon on repart sur l'enregistreur) et remplacer les ; par des , sinon #NOM ou erreur 1004
eric
Je ne procède pas pareil.
Je copie la formule écrite et testée sur la feuille (=SI(E2 > 2;C2 * D2;2)) et la colle telle que dans le .formulalocal.
J'ai mes fonctions en français, mes ; restent (pas besoin de les changer en ,), mes références de type A1, et aucune erreur.
Avec .value il faut quand même traduire les fonctions en anglais (pénalisant pour moi pour les fonctions moins communes sinon on repart sur l'enregistreur) et remplacer les ; par des , sinon #NOM ou erreur 1004
eric
Utilisateur anonyme
27 mai 2012 à 15:02
27 mai 2012 à 15:02
Bonjour,
étrange, c'est à moi d'apprendre quelque chose :-)
j'utilise l'enregistreur pour connaitre la traduction
français anglais, mais je construit ainsi à partir
de l'instruction en ajoutant un adressage relatif ou
absolue pour créer la formule sous forme de String.
je vais essayer ta technique, je suis curieux de savoir
ce qu'il donneras en lecture sur la propriété FormulaLocal :-)
Cdt
Lupin
étrange, c'est à moi d'apprendre quelque chose :-)
j'utilise l'enregistreur pour connaitre la traduction
français anglais, mais je construit ainsi à partir
de l'instruction en ajoutant un adressage relatif ou
absolue pour créer la formule sous forme de String.
je vais essayer ta technique, je suis curieux de savoir
ce qu'il donneras en lecture sur la propriété FormulaLocal :-)
Cdt
Lupin
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 254
27 mai 2012 à 19:48
27 mai 2012 à 19:48
Re,
j'utilise l'enregistreur pour connaitre la traduction français anglais
Ce que je faisait avant de découvrir formulalocal ;-)
eric
j'utilise l'enregistreur pour connaitre la traduction français anglais
Ce que je faisait avant de découvrir formulalocal ;-)
eric
ccm81
Messages postés
10907
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
24 janvier 2025
2 430
28 mai 2012 à 17:08
28 mai 2012 à 17:08
bonjour à tous
est ce que ce ne serait pas un problème de guillemets, chez moi (je ne sais pas si c'est dû à excel 2003), je dois remplacer les guillemets encadrant une chaine vide par deux chr(34)
pour obtenir ceci sur la feuille
=SI(ESTVIDE(Feuil2!A1);"";Feuil2!A1)
f = "=SI(ESTVIDE(Feuil2!A1);" & Chr(34) & "" & Chr(34) & ";Feuil2!A1)"
fonctionne
f = "=SI(ESTVIDE(Feuil2!A1);" & """" & ";Feuil2!A1)"
ne fonctionne pas
bonne suite
est ce que ce ne serait pas un problème de guillemets, chez moi (je ne sais pas si c'est dû à excel 2003), je dois remplacer les guillemets encadrant une chaine vide par deux chr(34)
pour obtenir ceci sur la feuille
=SI(ESTVIDE(Feuil2!A1);"";Feuil2!A1)
f = "=SI(ESTVIDE(Feuil2!A1);" & Chr(34) & "" & Chr(34) & ";Feuil2!A1)"
fonctionne
f = "=SI(ESTVIDE(Feuil2!A1);" & """" & ";Feuil2!A1)"
ne fonctionne pas
bonne suite
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 254
28 mai 2012 à 19:49
28 mai 2012 à 19:49
Bonjour,
On double la " pour qu'elle ne soit pas considérée comme une fin de chaine par vba, mais comme le caractère ".
f = "=SI(ESTVIDE(Feuil2!A1);" & """" & ";Feuil2!A1)"
ne marche pas car il faudrait 6 guillemets :
1" pour le début de chaine, 2"" pour la premiere ", 2 autres " pour la 2nde ", et une dernière pour indiquer la fin de chaine.
"=SI(ESTVIDE(Feuil2!A1);" & """""" & ";Feuil2!A1)"
fonctionne.
que tu peux écrire directement :
"=SI(ESTVIDE(Feuil2!A1);"""";Feuil2!A1) "
2 doubles " (donc 4 au total) pour indiquer une double " (tu suis ? ;-) )
eric
eric
On double la " pour qu'elle ne soit pas considérée comme une fin de chaine par vba, mais comme le caractère ".
f = "=SI(ESTVIDE(Feuil2!A1);" & """" & ";Feuil2!A1)"
ne marche pas car il faudrait 6 guillemets :
1" pour le début de chaine, 2"" pour la premiere ", 2 autres " pour la 2nde ", et une dernière pour indiquer la fin de chaine.
"=SI(ESTVIDE(Feuil2!A1);" & """""" & ";Feuil2!A1)"
fonctionne.
que tu peux écrire directement :
"=SI(ESTVIDE(Feuil2!A1);"""";Feuil2!A1) "
2 doubles " (donc 4 au total) pour indiquer une double " (tu suis ? ;-) )
eric
eric
ccm81
Messages postés
10907
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
24 janvier 2025
2 430
29 mai 2012 à 09:36
29 mai 2012 à 09:36
merci eric de ces précisions,
as tu une explication à propos de la différence d'interprétation entre " et chr(34)
en plus j'ai essayé ça qui marche aussi!
f = "=SI(ESTVIDE(Feuil2!A1);" & Chr(34) & Chr(34) & ";Feuil2!A1)"
bonne journée
as tu une explication à propos de la différence d'interprétation entre " et chr(34)
en plus j'ai essayé ça qui marche aussi!
f = "=SI(ESTVIDE(Feuil2!A1);" & Chr(34) & Chr(34) & ";Feuil2!A1)"
bonne journée
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 254
Modifié par eriiic le 29/05/2012 à 11:49
Modifié par eriiic le 29/05/2012 à 11:49
Bonjour,
Chr(34) ne risque pas d'être interprété comme une fin de chaine, on ne le double pas. Et il n'a pas besoin de " " en début et en fin de chaine.
Pour avoir un caractère " :
- soit chr(34)
- soit "" (pour avoir 1 caractère ") mis entre 2 " de début et de fin de chaine
c'est à dire : """"
f = "=SI(ESTVIDE(Feuil2!A1);" & Chr(34) & Chr(34) & ";Feuil2!A1)"
peut s'écrire :
f = "=SI(ESTVIDE(Feuil2!A1);" & """" & """" & ";Feuil2!A1)"
eric
Chr(34) ne risque pas d'être interprété comme une fin de chaine, on ne le double pas. Et il n'a pas besoin de " " en début et en fin de chaine.
Pour avoir un caractère " :
- soit chr(34)
- soit "" (pour avoir 1 caractère ") mis entre 2 " de début et de fin de chaine
c'est à dire : """"
f = "=SI(ESTVIDE(Feuil2!A1);" & Chr(34) & Chr(34) & ";Feuil2!A1)"
peut s'écrire :
f = "=SI(ESTVIDE(Feuil2!A1);" & """" & """" & ";Feuil2!A1)"
eric