Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

conversion de formule en texte et vice versa

14 réponses
Avatar
lion10
Bonjour

Dans une cellule A2 j'ai une formule par exemple
en A1 j'ai = texte_formule_1
cela marche comme je veux ok, j'obtiens bien le résultat correspondant à la
formule.

Mais dans une autre cellule A2 je veux créer une formule
du style =texte_formule_1 + complément_texte qui me donnerait un second
résultat.

L'idée est donc de concaténer le texte récupéré de A1 et le texte
complémentaire qui pourrait être contenu dans A3.

Seulement je ne sais pas le faire, car il s'agit du texte d'une formule
sinon je connais bien l'opérateur de concaténation "&".

Est ce possible de le faire hors vba sous ecell 2003 ?

J'ai vu sous le forum la fonction vba :
Function Afficheformule(x)
Afficheformule = x.Formula
End Function

mais pb elle me renvoie par ex :
en i219 j'ai =DECALER(action_s11;0;(X$155-11)*7;;)
en i234 j'ai = (AfficheFormule(I219)) et la valeur renvoyée est
=OFFSET(action_s11,0,(X$155-11)*7,,)

Il faudrait ensuite que je supprime le début de la chaine et puis que
reconvertisse le tout en formule.

D'avance merci
cdlt

4 réponses

1 2
Avatar
lion10
Bonjour Corto
Merci de m'aider à converger vers une solution.

Je commence à comprendre certaines erreurs :
1) Erreur 1 :
---------------
affiche formule avec formulalocal renvoie decaler(xxx;xx;)
affiche formule avec formula renvoie offser(xxx,xx,xx)
Dans le premier cas cela ne fonctionne pas à moins je l'ai vérifié de :
-remplacer decaler par offset,
-puis remplacer les ; par des ,.

Q1) Cela m'amène donc à la question suivante doit on coder tout en anglais
autrement dit en gardant formula, ou si on met formulalocal y at-il une
astuce qui précise à la fct evaluate que l'on lui donne une instruction en
français ?

2) Erreur 2 :
----------------

Lorsque je modifie la fct dans le module visual basic, si je ne modifie pas
la cellule qui appelle la fct , excell garde en mémoire l'ancienne fonction
visual et on ne voit pas le changement.

Q2) y-at-il un moyen de s'en affranchir ?

J'ai fait un essai sans trim puisque je n'avais pas d'espace et cela ne fct
pas , j'en déduis que trim est utile parcequ'il renvoie une variable de type
explicite string ?

3) Erreur 3 :
---------------

cela ne fct pas car evaluate prend la chaine de texte sans signe = et il se
trouve que je le rajoutais, ce qui créait une erreur.

Q3) Par contre je fais face à une impossibilité, car dans mon cas la formule
est matriciel, donc de la forme {üt(xxx)}. Comment fait on dans ce cas pour
stipuler que c'est un calcul matriciel ?

Q4) Enfin je reviens sur ce que j'avais compris au début.
Activecelle.formula ="üt(xxx)" à quoi cela sert-il finalement ?
Juste à dire qu'il y a une cellule à remplir par une fct mais ne sert pas à
calculer . Ce qui expliquerait que faute de demander le cacul par une syntaxe
particulière , la valeur de la cellule est comme une variable non initialisée
et renvoie donc #erreur ?

cdlt lion10


"Corto" a écrit :

Bonjour lion10,
Pour la cellule L204 il faut remplacer ta fonction Aff_date par la
suivante :
Function Aff_date()
Aff_date = Now
End Function
Pour la fonction Evalueformule :
Function Evalueformule(x)
Evalueformule = Evaluate(Trim(x))
End Function
Trim sert à supprimer les espaces inutiles dans la chaine de caractères.
et Afficheformule :
Function Afficheformule(x)
Afficheformule = x.FormulaLocal
End Function

Ce que je ne comprend pas dans ta démarche c'est pouquoi tu veux mettre
4 formules et deux fonctions pour obtenir le même résultat que si tu
avais mis = L197 en L200

Corto

lion10 a écrit :
> Bonjour corto,
> Pour cherche je comprends mieux pourquoi il ne trouve pas ma chaine ds la
> deuxième ligne issu du décalage de actions11. J'aurai pensé qd même que le
> calcul matriciel permette de faire la recherche de lma chaine en faisant la
> recherche ligne par ligne cad par ligne de 7 colonnes.
>
> Sinon je reviens à mon pb de base ds cet essai simple et je reformule donc :
> en l197 j'ai une formule simple de concaténation
> en l198 j'extrait la formule sans signe = car fct substitue
> en l199 je recré la chaine =i194 & i195
> en l200 je passe cette chaine à la fct evalue formule.
> et j'attends de voir en L200 le résultat donc essai 5 essai 6 ds le cas de
> cet exemple.
>
> Autre exemple en l204 j'attends de voir la date du jour suite à l'évaluation
> de la formule maintenant.
>
>
> cdlt lion10
>
> "Corto" a écrit :
>
>
>> Bonjour lion10,
>> La fonction CHERCHE : *CHERCHE*(*texte_cherché*;*texte*;no_départ)
>> attend comme paramètre une chaine de caractère et pas une plage de
>> cellules, pour rechercher dans une plage de cellule, il faut utiliser*
>> **EQUIV*(*valeur_cherchée*;*matrice_recherche*;type).
>> Dans une fonction tu dois impérativement renvoyer une valeur
>> Function Aff_date()
>> Aff_date = Now
>> End Function
>> Pour le reste, je ne comprends pas ce que tu cherches à faire, si les
>> formules en I198, I199 et I200 fonctionnaient ça ne ferait rien de plus
>> que si tu mettait directement dans I200 = I197.
>>
>> Corto
>>
>> lion10 a écrit :
>>
>>> Bonjour Corto
>>>
>>> Vraiment merci de revenir à mon aide.
>>> http://cjoint.com/data/kcmQlD2mAN.htm
>>>
>>> Dans le fichier j'ai marqué en rouge mes problèmes :
>>> fonction evalue formule
>>> fonction aff date
>>> et éventuellement un mystère concernant le dysfonctionnement de la fonction
>>> cherche en matriciel.
>>>
>>> Cordialement Lion10
>>>
>>> "Corto" a écrit :
>>>
>>>
>>>
>>>> Bonjour lion10,
>>>> Désolé, j'étais en congé ces deux dernier jours pour l'Aïd el Fitr.
>>>> La formule (qui fonctionne chez moi) est :
>>>> [A5].Formula = "=OFFSET(action_s11,0,(X$155-11)*7)"
>>>> ou [A5].FormulaLocal = "ÞCALER(action_s11;0;(X$155-11)*7)"
>>>> NB les séparateurs en Anglais sont des , en Français ce sont des ;
>>>> Je me suis bien sûr débrouillé pour que 11 < X$155 < 46 pour que la
>>>> formule donne un résultat correct ( >0 et < 256)
>>>> Si tu n'y arrives toujours pas, mets ton fichier sur cjoint.com et poste
>>>> l'adresse générée.
>>>>
>>>> Corto
>>>>
>>>> lion10 a écrit :
>>>>
>>>>
>>>>> bonjour
>>>>>
>>>>> je suis tjs bloqué.
>>>>> j'ai recherché sur le net mais mes essais restent sans résultat je récupère
>>>>> tjs #erreur !!
>>>>>
>>>>> Pourtant j'ai corrigé en mettant :
>>>>> Function Evalueformule(x)
>>>>> ActiveCell.Formula = x
>>>>> End Function
>>>>>
>>>>> J'ai essayé avec formulalocal, formula en rajoutant aussi R1C1 et même avec
>>>>> une chaine x toute bête genre ¡*a2
>>>>>
>>>>> Ma fonction est dans le même module que la fonction affiche formule ce ne
>>>>> doit pas être un pb de visibilité export ??
>>>>>
>>>>> D'avance merci
>>>>>
>>>>>
>>>>>
>>>>> "lion10" a écrit :
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>> Merci mais j'ai un pb je suis débutant en VBA, j'ai donc mis dans un module
>>>>>> Function Evalueformule(x)
>>>>>> Value.FormulaLocal = x
>>>>>> End Function
>>>>>>
>>>>>> Et dans le tableur je passe en argument la formule auquelle j'ai ajouté les
>>>>>> accolades du calcul matriciel soit =("{=" & I234 & "}")
>>>>>> Donc en résumé x reçoit bien la bonne formule mais cela me donne un #erreur
>>>>>> contrairement à la formule qui fct.
>>>>>> x= {= DECALER(action_s11;0;(X$155-11)*7;;)}
>>>>>>
>>>>>> Faut-il mettre value., ou formulalocal.value, ... ou que sais je ? j'ai
>>>>>> fait différents essais et chercher sur internet, l'aide de visual c'est BOF,
>>>>>> c'est l'échec.
>>>>>>
>>>>>> cdlt
>>>>>>
>>>>>> "Corto" a écrit :
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>> Bonjour lion10,
>>>>>>> Au lieu d'affecter [A5] = "ÞCALER(action_s11;0;(X$155-11)*7;;)"
>>>>>>> (Propriété par défaut : Value), affecte la chaine à la propriété
>>>>>>> FormulaLocal. ou alors [A5].Formula = "OFFSET(action_s11;0;(X$155-11)*7;;)".
>>>>>>>
>>>>>>> Corto
>>>>>>>
>>>>>>> lion10 a écrit :
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> Bonjour
>>>>>>>> Merci pour vos premières réponses mais il me reste à convertir le texte en
>>>>>>>> formule.
>>>>>>>> je suis passé par substitue pour remplacer offset par decaler.
>>>>>>>> Dans mon exemple j'ai récupérer une valeur qui correspond à la chaine de
>>>>>>>> texte de la formule, mais je veux maintenant faire la transformation inverse
>>>>>>>> autrement dit :
>>>>>>>> J'ai dans une cellule A5 la chaine de texte
>>>>>>>> "ÞCALER(action_s11;0;(X$155-11)*7;;)" et je veux obtenir en A6
>>>>>>>> l'évaluation de la formule issu du texte de A5.
>>>>>>>>
>>>>>>>> D'avance merci
>>>>>>>>
>>>>>>>> cdlt
>>>>>>>>
>>>>>>>>
>>>>>>>> "lion10" a écrit :
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>> Bonjour
>>>>>>>>>
>>>>>>>>> Dans une cellule A2 j'ai une formule par exemple
>>>>>>>>> en A1 j'ai = texte_formule_1
>>>>>>>>> cela marche comme je veux ok, j'obtiens bien le résultat correspondant à la
>>>>>>>>> formule.
>>>>>>>>>
>>>>>>>>> Mais dans une autre cellule A2 je veux créer une formule
>>>>>>>>> du style =texte_formule_1 + complément_texte qui me donnerait un second
>>>>>>>>> résultat.
>>>>>>>>>
>>>>>>>>> L'idée est donc de concaténer le texte récupéré de A1 et le texte
>>>>>>>>> complémentaire qui pourrait être contenu dans A3.
>>>>>>>>>
>>>>>>>>> Seulement je ne sais pas le faire, car il s'agit du texte d'une formule
>>>>>>>>> sinon je connais bien l'opérateur de concaténation "&".
>>>>>>>>>
>>>>>>>>> Est ce possible de le faire hors vba sous ecell 2003 ?
>>>>>>>>>
>>>>>>>>> J'ai vu sous le forum la fonction vba :
>>>>>>>>> Function Afficheformule(x)
>>>>>>>>> Afficheformule = x.Formula
>>>>>>>>> End Function
>>>>>>>>>
>>>>>>>>> mais pb elle me renvoie par ex :
>>>>>>>>> en i219 j'ai ÞCALER(action_s11;0;(X$155-11)*7;;)
>>>>>>>>> en i234 j'ai = (AfficheFormule(I219)) et la valeur renvoyée est
>>>>>>>>> =OFFSET(action_s11,0,(X$155-11)*7,,)
>>>>>>>>>
>>>>>>>>> Il faudrait ensuite que je supprime le début de la chaine et puis que
>>>>>>>>> reconvertisse le tout en formule.
>>>>>>>>>
>>>>>>>>> D'avance merci
>>>>>>>>> cdlt
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>



Avatar
lion10
Bonjour Corto

Merci pour ces nouvelles précisions qui en appellent d'autres .

Concernant R1 ,
------------------ J'ai bien noté ta préférence pour travailler en anglais
, du reste il me semble que l'aide de vb en français descrit les opérandes
anglaises.
Mais pour ma culture au risque de paraître minortitaire et d'avoir des
difficultés pour porter du code qui souvent est en anglais, si toutefois je
souhaitais travailler en français et donc avec des ; aulieu de , quel est
l'astuce pour spécifier ce choix par défaut à visual basic ?

Concernant R2
---------------- volatile cela me rappel le langage c ok.

Concernant R3,
------------------ pour les formules matriciellles en fait j'ai constaté
que dans l'état avec le code que tu m'as fournit vb interprète bien les
valeurs et par défaut c'est surprenant en matriciel.
J'en veux pour preuve un essai que j'ai fait qui renvoie #valeur s'il n'est
pas évalué en matriciel via les {.
En utilisant les fct affiche formule puis évalue, (sans les accolades donc
comme tu me l'a précisé) j'ai bien le bon résultat et non #valeur comme si le
résultat était évalué automatiquement en matriciel.

Je n'ai pas fait l'essai via formulaarray qui est sans doute à utiliser via
activcell.formulaarray.

Concernant R4,
------------------- je saisis. Une fonction comme en c renvoie une valeur
en l'occurence son résultat que je ne positionnais pas d'où l'erreur
affichée dans la cellule.
Active cell permet avec value d'agir sur les propriétés affichées par une
cellule.

Et la je demande bien une confirmation :
Q5) Dans une cellule comme on met =xxx, xxx est une ct ou une fonction
puisqu'il faut renvoyer un résultat. Donc si je comprends bien une sub
procédure n'est appelée que dans le code VB ou sur des actions touches
clavier, bouton de dialogue,... etc.

Q6 ) A moins ? de l'appeler ds une cellule via =procedure_xx sachant que
dans le code vb procedure_xx va initialiser la valeur de la cellule active ;
celle où la procédure est appelée à moins que cela corresponde à une autre
cellule par exemple ?

Q7) Tu n'as pas réagis concernant l'utilité de trim est ce bien ce que je
pensais cad pour forcer un type en string, équivalent du cast en c ?

cdlt lion10

"Corto" a écrit :

Bonjour lion10,
R1) Je trouve que le plus simple est de travailler en VBA avec les
fonctions en Anglais et de ne garder FormulaLocal que quand on veut
afficher la formule.
R2) Tu peux forcer Excel à recalculer la fonction en précisant le mot
clé : Application.*Volatile*. Je te conseille d'aller lire l'aide VBA
sur cette méthode.
|Function UneFonction()
Application.*Volatile
Instructions
*End Function|
R3) Pour que VBA enregistre la formule comme matricielle, il faut
l'affecter à la propriété FormulaArray au lieu de Formula. *Il ne faut
pas mettre les accolades*, c'est toujour Excel qui doit les ajouter lui
même.
R4) Pas du tout quand tu rentres ActiveCell.Formula ="üt(xxx)" Excel
calcule cette fonction, le #ERREUR provient de ce que tes fonctions ne
renvoyaient aucune valeur. Comme je te l'avais dis dans mon premier
email, une fonction doit renvoyer une valeur. Si tu veux affecter des
valeurs dans des cellules (ActiveCell = XXX), il faut utiliser une macro
(définie par le mot clé Sub), dans une fonction (définie par Function)
tu dois affecter une valeur au nom de la fonction (MaFonction = XXX). Je
te conseille aussi de bien lire l'aide VBA sur ces deux mots clés.

Corto

lion10 a écrit :
> Bonjour Corto
> Merci de m'aider à converger vers une solution.
>
> Je commence à comprendre certaines erreurs :
> 1) Erreur 1 :
> ---------------
> affiche formule avec formulalocal renvoie decaler(xxx;xx;)
> affiche formule avec formula renvoie offser(xxx,xx,xx)
> Dans le premier cas cela ne fonctionne pas à moins je l'ai vérifié de :
> -remplacer decaler par offset,
> -puis remplacer les ; par des ,.
>
> Q1) Cela m'amène donc à la question suivante doit on coder tout en anglais
> autrement dit en gardant formula, ou si on met formulalocal y at-il une
> astuce qui précise à la fct evaluate que l'on lui donne une instruction en
> français ?
>
> 2) Erreur 2 :
> ----------------
>
> Lorsque je modifie la fct dans le module visual basic, si je ne modifie pas
> la cellule qui appelle la fct , excell garde en mémoire l'ancienne fonction
> visual et on ne voit pas le changement.
>
> Q2) y-at-il un moyen de s'en affranchir ?
>
> J'ai fait un essai sans trim puisque je n'avais pas d'espace et cela ne fct
> pas , j'en déduis que trim est utile parcequ'il renvoie une variable de type
> explicite string ?
>
> 3) Erreur 3 :
> ---------------
>
> cela ne fct pas car evaluate prend la chaine de texte sans signe = et il se
> trouve que je le rajoutais, ce qui créait une erreur.
>
> Q3) Par contre je fais face à une impossibilité, car dans mon cas la formule
> est matriciel, donc de la forme {üt(xxx)}. Comment fait on dans ce cas pour
> stipuler que c'est un calcul matriciel ?
>
> Q4) Enfin je reviens sur ce que j'avais compris au début.
> Activecelle.formula ="üt(xxx)" à quoi cela sert-il finalement ?
> Juste à dire qu'il y a une cellule à remplir par une fct mais ne sert pas à
> calculer . Ce qui expliquerait que faute de demander le cacul par une syntaxe
> particulière , la valeur de la cellule est comme une variable non initialisée
> et renvoie donc #erreur ?
>
> cdlt lion10
>
>
> "Corto" a écrit :
>
>
>> Bonjour lion10,
>> Pour la cellule L204 il faut remplacer ta fonction Aff_date par la
>> suivante :
>> Function Aff_date()
>> Aff_date = Now
>> End Function
>> Pour la fonction Evalueformule :
>> Function Evalueformule(x)
>> Evalueformule = Evaluate(Trim(x))
>> End Function
>> Trim sert à supprimer les espaces inutiles dans la chaine de caractères.
>> et Afficheformule :
>> Function Afficheformule(x)
>> Afficheformule = x.FormulaLocal
>> End Function
>>
>> Ce que je ne comprend pas dans ta démarche c'est pouquoi tu veux mettre
>> 4 formules et deux fonctions pour obtenir le même résultat que si tu
>> avais mis = L197 en L200
>>
>> Corto
>>
>> lion10 a écrit :
>>
>>> Bonjour corto,
>>> Pour cherche je comprends mieux pourquoi il ne trouve pas ma chaine ds la
>>> deuxième ligne issu du décalage de actions11. J'aurai pensé qd même que le
>>> calcul matriciel permette de faire la recherche de lma chaine en faisant la
>>> recherche ligne par ligne cad par ligne de 7 colonnes.
>>>
>>> Sinon je reviens à mon pb de base ds cet essai simple et je reformule donc :
>>> en l197 j'ai une formule simple de concaténation
>>> en l198 j'extrait la formule sans signe = car fct substitue
>>> en l199 je recré la chaine =i194 & i195
>>> en l200 je passe cette chaine à la fct evalue formule.
>>> et j'attends de voir en L200 le résultat donc essai 5 essai 6 ds le cas de
>>> cet exemple.
>>>
>>> Autre exemple en l204 j'attends de voir la date du jour suite à l'évaluation
>>> de la formule maintenant.
>>>
>>>
>>> cdlt lion10
>>>
>>> "Corto" a écrit :
>>>
>>>
>>>
>>>> Bonjour lion10,
>>>> La fonction CHERCHE : *CHERCHE*(*texte_cherché*;*texte*;no_départ)
>>>> attend comme paramètre une chaine de caractère et pas une plage de
>>>> cellules, pour rechercher dans une plage de cellule, il faut utiliser*
>>>> **EQUIV*(*valeur_cherchée*;*matrice_recherche*;type).
>>>> Dans une fonction tu dois impérativement renvoyer une valeur
>>>> Function Aff_date()
>>>> Aff_date = Now
>>>> End Function
>>>> Pour le reste, je ne comprends pas ce que tu cherches à faire, si les
>>>> formules en I198, I199 et I200 fonctionnaient ça ne ferait rien de plus
>>>> que si tu mettait directement dans I200 = I197.
>>>>
>>>> Corto
>>>>
>>>> lion10 a écrit :
>>>>
>>>>
>>>>> Bonjour Corto
>>>>>
>>>>> Vraiment merci de revenir à mon aide.
>>>>> http://cjoint.com/data/kcmQlD2mAN.htm
>>>>>
>>>>> Dans le fichier j'ai marqué en rouge mes problèmes :
>>>>> fonction evalue formule
>>>>> fonction aff date
>>>>> et éventuellement un mystère concernant le dysfonctionnement de la fonction
>>>>> cherche en matriciel.
>>>>>
>>>>> Cordialement Lion10
>>>>>
>>>>> "Corto" a écrit :
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>> Bonjour lion10,
>>>>>> Désolé, j'étais en congé ces deux dernier jours pour l'Aïd el Fitr.
>>>>>> La formule (qui fonctionne chez moi) est :
>>>>>> [A5].Formula = "=OFFSET(action_s11,0,(X$155-11)*7)"
>>>>>> ou [A5].FormulaLocal = "ÞCALER(action_s11;0;(X$155-11)*7)"
>>>>>> NB les séparateurs en Anglais sont des , en Français ce sont des ;
>>>>>> Je me suis bien sûr débrouillé pour que 11 < X$155 < 46 pour que la
>>>>>> formule donne un résultat correct ( >0 et < 256)
>>>>>> Si tu n'y arrives toujours pas, mets ton fichier sur cjoint.com et poste
>>>>>> l'adresse générée.
>>>>>>
>>>>>> Corto
>>>>>>
>>>>>> lion10 a écrit :
>>>>>>
>>>>>>
>>>>>>
>>>>>>> bonjour
>>>>>>>
>>>>>>> je suis tjs bloqué.
>>>>>>> j'ai recherché sur le net mais mes essais restent sans résultat je récupère
>>>>>>> tjs #erreur !!
>>>>>>>
>>>>>>> Pourtant j'ai corrigé en mettant :
>>>>>>> Function Evalueformule(x)
>>>>>>> ActiveCell.Formula = x
>>>>>>> End Function
>>>>>>>
>>>>>>> J'ai essayé avec formulalocal, formula en rajoutant aussi R1C1 et même avec
>>>>>>> une chaine x toute bête genre ¡*a2
>>>>>>>
>>>>>>> Ma fonction est dans le même module que la fonction affiche formule ce ne
>>>>>>> doit pas être un pb de visibilité export ??
>>>>>>>
>>>>>>> D'avance merci
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> "lion10" a écrit :
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> Merci mais j'ai un pb je suis débutant en VBA, j'ai donc mis dans un module
>>>>>>>> Function Evalueformule(x)
>>>>>>>> Value.FormulaLocal = x
>>>>>>>> End Function
>>>>>>>>
>>>>>>>> Et dans le tableur je passe en argument la formule auquelle j'ai ajouté les
>>>>>>>> accolades du calcul matriciel soit =("{=" & I234 & "}")
>>>>>>>> Donc en résumé x reçoit bien la bonne formule mais cela me donne un #erreur
>>>>>>>> contrairement à la formule qui fct.
>>>>>>>> x= {= DECALER(action_s11;0;(X$155-11)*7;;)}
>>>>>>>>
>>>>>>>> Faut-il mettre value., ou formulalocal.value, ... ou que sais je ? j'ai
>>>>>>>> fait différents essais et chercher sur internet, l'aide de visual c'est BOF,
>>>>>>>> c'est l'échec.
>>>>>>>>
>>>>>>>> cdlt
>>>>>>>>
>>>>>>>> "Corto" a écrit :
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>> Bonjour lion10,
>>>>>>>>> Au lieu d'affecter [A5] = "ÞCALER(action_s11;0;(X$155-11)*7;;)"
>>>>>>>>> (Propriété par défaut : Value), affecte la chaine à la propriété
>>>>>>>>> FormulaLocal. ou alors [A5].Formula = "OFFSET(action_s11;0;(X$155-11)*7;;)".
>>>>>>>>>
>>>>>>>>> Corto
>>>>>>>>>
>>>>>>>>> lion10 a écrit :
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> Bonjour
>>>>>>>>>> Merci pour vos premières réponses mais il me reste à convertir le texte en
>>>>>>>>>> formule.
>>>>>>>>>> je suis passé par substitue pour remplacer offset par decaler.
>>>>>>>>>> Dans mon exemple j'ai récupérer une valeur qui correspond à la chaine de
>>>>>>>>>> texte de la formule, mais je veux maintenant faire la transformation inverse
>>>>>>>>>> autrement dit :
>>>>>>>>>> J'ai dans une cellule A5 la chaine de texte
>>>>>>>>>> "ÞCALER(action_s11;0;(X$155-11)*7;;)" et je veux obtenir en A6
>>>>>>>>>> l'évaluation de la formule issu du texte de A5.
>>>>>>>>>>
>>>>>>>>>> D'avance merci
>>>>>>>>>>
>>>>>>>>>> cdlt
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> "lion10" a écrit :
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> Bonjour
>>>>>>>>>>>
>>>>>>>>>>> Dans une cellule A2 j'ai une formule par exemple
>>>>>>>>>>> en A1 j'ai = texte_formule_1
>>>>>>>>>>> cela marche comme je veux ok, j'obtiens bien le résultat correspondant à la
>>>>>>>>>>> formule.
>>>>>>>>>>>
>>>>>>>>>>> Mais dans une autre cellule A2 je veux créer une formule
>>>>>>>>>>> du style =texte_formule_1 + complément_texte qui me donnerait un second
>>>>>>>>>>> résultat.
>>>>>>>>>>>
>>>>>>>>>>> L'idée est donc de concaténer le texte récupéré de A1 et le texte
>>>>>>>>>>> complémentaire qui pourrait être contenu dans A3.
>>>>>>>>>>>
>>>>>>>>>>> Seulement je ne sais pas le faire, car il s'agit du texte d'une formule
>>>>>>>>>>> sinon je connais bien l'opérateur de concaténation "&".
>>>>>>>>>>>
>>>>>>>>>>> Est ce possible de le faire hors vba sous ecell 2003 ?
>>>>>>>>>>>
>>>>>>>>>>> J'ai vu sous le forum la fonction vba :
>>>>>>>>>>> Function Afficheformule(x)
>>>>>>>>>>> Afficheformule = x.Formula
>>>>>>>>>>> End Function
>>>>>>>>>>>
>>>>>>>>>>> mais pb elle me renvoie par ex :
>>>>>>>>>>> en i219 j'ai ÞCALER(action_s11;0;(X$155-11)*7;;)
>>>>>>>>>>> en i234 j'ai = (AfficheFormule(I219)) et la valeur renvoyée est
>>>>>>>>>>> =OFFSET(action_s11,0,(X$155-11)*7,,)
>>>>>>>>>>>
>>>>>>>>>>> Il faudrait ensuite que je supprime le début de la chaine et puis que
>>>>>>>>>>> reconvertisse le tout en formule.
>>>>>>>>>>>
>>>>>>>>>>> D'avance merci
>>>>>>>>>>> cdlt


Avatar
Corto
Bonjour lion10,
si toutefois je souhaitais travailler en français et donc avec des ;
aulieu de , quel est l'astuce pour spécifier ce choix par déf aut à
visual basic ?


Il n'est pas possible à ma connaissance de spécifier à VBA de travailler
avec les fonction en Français, c'est pourquoi je préconisait de rester
sur les fonctions en Anglais. Je t'avais envoyé dans un email pré cédent
le fichier dans lequel tu peux retrouver la correspondance.
Tu peux retrouver la correspondance avec les fonctions en Français
dans le fichier suivant (Office 2003).
C:Program FilesMicrosoft OfficeOFFICE111036VBALIST.XLS
Si tu as une autre version que 2003, il faut remplacer OFFICE11 par :
OFFICE08 : Office 97
OFFICE09 : Office 2000
OFFICE10 : Office 2002
OFFICE12 : Office 2007
En utilisant les fct affiche formule puis évalue, (sans les accola des
donc comme tu me l'a précisé) j'ai bien le bon résultat et non #valeur
comme si le
résultat était évalué automatiquement en matriciel.


Quand tu récupères une fonction matricielle dans une cellule et que tu
la réaffectes à une autre cellule, il n'y a pas besoin de l'aff ecter à
FormulaArray. Mais si tu entres un texte il ne faut pas écrire
CELLULE.Formula = {Fonction(Paramètres)} mais CELLULE.FormulaArray =
Fonction(Paramètres).
Je n'ai pas fait l'essai via formulaarray qui est sans doute à
utiliser via ActiveCell.FormulaArray.


C'est bien ça.
Donc si je comprends bien une sub procédure n'est appelée que dans le code VB ou sur des actions touches clavier, bouton de dialogue,. .. etc.


Toujours d'accord.
Q6 ) A moins ? de l'appeler ds une cellule via =procedure_xx sachant que dans le code vb procedure_xx va initialiser la valeur de la cellule a ctive ; celle où la procédure est appelée à moins que cela corresponde à une autre cellule par exemple ?


Là non, si tu rentres le nom d'une macro dans une cellule Excel va t e
mettre un message "Nom non valide", il faut l'appeler par Outils =>
Macros ou, comme tu disais dans la question précédente, l'affec ter à une
touche ou à un bouton. Ta macro peut mettre à jour la valeur de la
cellule active ou de n'importe quelle plage de cellule que tu précis eras
dans le code de la macro.
Q7) Tu n'as pas réagis concernant l'utilité de trim est ce b ien ce que je pensais cad pour forcer un type en string, équivalent du cast en c ?


Je ne connais pas la raison mais le problème ne vient pas de VBA mai s de
Excel. Dans ton classeur d'exemple j'ai essayé de rentrer les formul es à
la main, quand je recopiais tes formules et que j'essayais de les
valider avec Ctrl+Alt+Enter il me mettait #VALEUR et quand je supprimais
les espaces la formule fonctionnait. Je n'ai pas trop cherché la rai son
et j'ai ajouté TRIM dans la macro.

Corto

lion10 a écrit :
Bonjour Corto

Merci pour ces nouvelles précisions qui en appellent d'autres .

Concernant R1 ,
------------------ J'ai bien noté ta préférence pour tr availler en anglais
, du reste il me semble que l'aide de vb en français descrit les o pérandes
anglaises.
Mais pour ma culture au risque de paraître minortitaire et d'avoir des
difficultés pour porter du code qui souvent est en anglais, si tou tefois je
souhaitais travailler en français et donc avec des ; aulieu de , q uel est
l'astuce pour spécifier ce choix par défaut à visual bas ic ?

Concernant R2
---------------- volatile cela me rappel le langage c ok.

Concernant R3,
------------------ pour les formules matriciellles en fait j'ai const até
que dans l'état avec le code que tu m'as fournit vb interprèt e bien les
valeurs et par défaut c'est surprenant en matriciel.
J'en veux pour preuve un essai que j'ai fait qui renvoie #valeur s'il n 'est
pas évalué en matriciel via les {.
En utilisant les fct affiche formule puis évalue, (sans les accola des donc
comme tu me l'a précisé) j'ai bien le bon résultat et no n #valeur comme si le
résultat était évalué automatiquement en matriciel.

Je n'ai pas fait l'essai via formulaarray qui est sans doute à uti liser via
activcell.formulaarray.

Concernant R4,
------------------- je saisis. Une fonction comme en c renvoie une va leur
en l'occurence son résultat que je ne positionnais pas d'où l'erreur
affichée dans la cellule.
Active cell permet avec value d'agir sur les propriétés affic hées par une
cellule.

Et la je demande bien une confirmation :
Q5) Dans une cellule comme on met =xxx, xxx est une ct ou une fonct ion
puisqu'il faut renvoyer un résultat. Donc si je comprends bien une sub
procédure n'est appelée que dans le code VB ou sur des action s touches
clavier, bouton de dialogue,... etc.

Q6 ) A moins ? de l'appeler ds une cellule via =procedure_xx sachant que
dans le code vb procedure_xx va initialiser la valeur de la cellule act ive ;
celle où la procédure est appelée à moins que cela corresponde à une autre
cellule par exemple ?

Q7) Tu n'as pas réagis concernant l'utilité de trim est ce b ien ce que je
pensais cad pour forcer un type en string, équivalent du cast en c ?

cdlt lion10

"Corto" a écrit :


Bonjour lion10,
R1) Je trouve que le plus simple est de travailler en VBA avec les
fonctions en Anglais et de ne garder FormulaLocal que quand on veut
afficher la formule.
R2) Tu peux forcer Excel à recalculer la fonction en précisa nt le mot
clé : Application.*Volatile*. Je te conseille d'aller lire l'aide VBA
sur cette méthode.
|Function UneFonction()
Application.*Volatile
Instructions
*End Function|
R3) Pour que VBA enregistre la formule comme matricielle, il faut
l'affecter à la propriété FormulaArray au lieu de Formu la. *Il ne faut
pas mettre les accolades*, c'est toujour Excel qui doit les ajouter lu i
même.
R4) Pas du tout quand tu rentres ActiveCell.Formula ="üt(xxx)" E xcel
calcule cette fonction, le #ERREUR provient de ce que tes fonctions ne
renvoyaient aucune valeur. Comme je te l'avais dis dans mon premier
email, une fonction doit renvoyer une valeur. Si tu veux affecter des
valeurs dans des cellules (ActiveCell = XXX), il faut utiliser une m acro
(définie par le mot clé Sub), dans une fonction (défini e par Function)
tu dois affecter une valeur au nom de la fonction (MaFonction = XXX) . Je
te conseille aussi de bien lire l'aide VBA sur ces deux mots clés .

Corto

lion10 a écrit :

Bonjour Corto
Merci de m'aider à converger vers une solution.

Je commence à comprendre certaines erreurs :
1) Erreur 1 :
---------------
affiche formule avec formulalocal renvoie decaler(xxx;xx;)
affiche formule avec formula renvoie offser(xxx,xx,xx)
Dans le premier cas cela ne fonctionne pas à moins je l'ai vé rifié de :
-remplacer decaler par offset,
-puis remplacer les ; par des ,.

Q1) Cela m'amène donc à la question suivante doit on coder tout en anglais
autrement dit en gardant formula, ou si on met formulalocal y at-il u ne
astuce qui précise à la fct evaluate que l'on lui donne une instruction en
français ?

2) Erreur 2 :
----------------

Lorsque je modifie la fct dans le module visual basic, si je ne modif ie pas
la cellule qui appelle la fct , excell garde en mémoire l'ancien ne fonction
visual et on ne voit pas le changement.

Q2) y-at-il un moyen de s'en affranchir ?

J'ai fait un essai sans trim puisque je n'avais pas d'espace et cela ne fct
pas , j'en déduis que trim est utile parcequ'il renvoie une vari able de type
explicite string ?

3) Erreur 3 :
---------------

cela ne fct pas car evaluate prend la chaine de texte sans signe = et il se
trouve que je le rajoutais, ce qui créait une erreur.

Q3) Par contre je fais face à une impossibilité, car dans m on cas la formule
est matriciel, donc de la forme {üt(xxx)}. Comment fait on dans c e cas pour
stipuler que c'est un calcul matriciel ?

Q4) Enfin je reviens sur ce que j'avais compris au début.
Activecelle.formula ="üt(xxx)" à quoi cela sert-il finalem ent ?
Juste à dire qu'il y a une cellule à remplir par une fct ma is ne sert pas à
calculer . Ce qui expliquerait que faute de demander le cacul par une syntaxe
particulière , la valeur de la cellule est comme une variable no n initialisée
et renvoie donc #erreur ?

cdlt lion10


"Corto" a écrit :



Bonjour lion10,
Pour la cellule L204 il faut remplacer ta fonction Aff_date par la
suivante :
Function Aff_date()
Aff_date = Now
End Function
Pour la fonction Evalueformule :
Function Evalueformule(x)
Evalueformule = Evaluate(Trim(x))
End Function
Trim sert à supprimer les espaces inutiles dans la chaine de ca ractères.
et Afficheformule :
Function Afficheformule(x)
Afficheformule = x.FormulaLocal
End Function

Ce que je ne comprend pas dans ta démarche c'est pouquoi tu veu x mettre
4 formules et deux fonctions pour obtenir le même résultat que si tu
avais mis = L197 en L200

Corto

lion10 a écrit :


Bonjour corto,
Pour cherche je comprends mieux pourquoi il ne trouve pas ma chaine ds la
deuxième ligne issu du décalage de actions11. J'aurai pen sé qd même que le
calcul matriciel permette de faire la recherche de lma chaine en fa isant la
recherche ligne par ligne cad par ligne de 7 colonnes.

Sinon je reviens à mon pb de base ds cet essai simple et je re formule donc :
en l197 j'ai une formule simple de concaténation
en l198 j'extrait la formule sans signe = car fct substitue
en l199 je recré la chaine =i194 & i195
en l200 je passe cette chaine à la fct evalue formule.
et j'attends de voir en L200 le résultat donc essai 5 essai 6 ds le cas de
cet exemple.

Autre exemple en l204 j'attends de voir la date du jour suite à l'évaluation
de la formule maintenant.


cdlt lion10

"Corto" a écrit :




Bonjour lion10,
La fonction CHERCHE : *CHERCHE*(*texte_cherché*;*texte*;no_dà ©part)
attend comme paramètre une chaine de caractère et pas un e plage de
cellules, pour rechercher dans une plage de cellule, il faut utili ser*
**EQUIV*(*valeur_cherchée*;*matrice_recherche*;type).
Dans une fonction tu dois impérativement renvoyer une valeur
Function Aff_date()
Aff_date = Now
End Function
Pour le reste, je ne comprends pas ce que tu cherches à faire , si les
formules en I198, I199 et I200 fonctionnaient ça ne ferait ri en de plus
que si tu mettait directement dans I200 = I197.

Corto

lion10 a écrit :



Bonjour Corto

Vraiment merci de revenir à mon aide.
http://cjoint.com/data/kcmQlD2mAN.htm

Dans le fichier j'ai marqué en rouge mes problèmes :
fonction evalue formule
fonction aff date
et éventuellement un mystère concernant le dysfonctionn ement de la fonction
cherche en matriciel.

Cordialement Lion10

"Corto" a écrit :





Bonjour lion10,
Désolé, j'étais en congé ces deux dernier jo urs pour l'Aïd el Fitr.
La formule (qui fonctionne chez moi) est :
[A5].Formula = "=OFFSET(action_s11,0,(X$155-11)*7)"
ou [A5].FormulaLocal = "ÞCALER(action_s11;0;(X$155-11)*7)"
NB les séparateurs en Anglais sont des , en Français c e sont des ;
Je me suis bien sûr débrouillé pour que 11 < X$15 5 < 46 pour que la
formule donne un résultat correct ( >0 et < 256)
Si tu n'y arrives toujours pas, mets ton fichier sur cjoint.com et poste
l'adresse générée.

Corto

lion10 a écrit :




bonjour

je suis tjs bloqué.
j'ai recherché sur le net mais mes essais restent sans rà ©sultat je récupère
tjs #erreur !!

Pourtant j'ai corrigé en mettant :
Function Evalueformule(x)
ActiveCell.Formula = x
End Function

J'ai essayé avec formulalocal, formula en rajoutant aussi R1C1 et même avec
une chaine x toute bête genre ¡*a2

Ma fonction est dans le même module que la fonction affich e formule ce ne
doit pas être un pb de visibilité export ??

D'avance merci



"lion10" a écrit :






Merci mais j'ai un pb je suis débutant en VBA, j'ai donc mis dans un module
Function Evalueformule(x)
Value.FormulaLocal = x
End Function

Et dans le tableur je passe en argument la formule auquelle j' ai ajouté les
accolades du calcul matriciel soit =("{=" & I234 & "}")
Donc en résumé x reçoit bien la bonne formule m ais cela me donne un #erreur
contrairement à la formule qui fct.
x= {= DECALER(action_s11;0;(X$155-11)*7;;)}

Faut-il mettre value., ou formulalocal.value, ... ou que sais je ? j'ai
fait différents essais et chercher sur internet, l'aide d e visual c'est BOF,
c'est l'échec.

cdlt

"Corto" a écrit :






Bonjour lion10,
Au lieu d'affecter [A5] = "ÞCALER(action_s11;0;(X$155-1 1)*7;;)"
(Propriété par défaut : Value), affecte la cha ine à la propriété
FormulaLocal. ou alors [A5].Formula = "OFFSET(action_s11;0; (X$155-11)*7;;)".

Corto

lion10 a écrit :





Bonjour
Merci pour vos premières réponses mais il me reste à convertir le texte en
formule.
je suis passé par substitue pour remplacer offset par d ecaler.
Dans mon exemple j'ai récupérer une valeur qui cor respond à la chaine de
texte de la formule, mais je veux maintenant faire la transf ormation inverse
autrement dit :
J'ai dans une cellule A5 la chaine de texte
"ÞCALER(action_s11;0;(X$155-11)*7;;)" et je veux obteni r en A6
l'évaluation de la formule issu du texte de A5.

D'avance merci

cdlt


"lion10" a écrit :







Bonjour

Dans une cellule A2 j'ai une formule par exemple
en A1 j'ai = texte_formule_1
cela marche comme je veux ok, j'obtiens bien le résult at correspondant à la
formule.

Mais dans une autre cellule A2 je veux créer une formu le
du style =texte_formule_1 + complément_texte qui me donnerait un second
résultat.

L'idée est donc de concaténer le texte récup éré de A1 et le texte
complémentaire qui pourrait être contenu dans A3.

Seulement je ne sais pas le faire, car il s'agit du texte d 'une formule
sinon je connais bien l'opérateur de concaténatio n "&".

Est ce possible de le faire hors vba sous ecell 2003 ?

J'ai vu sous le forum la fonction vba :
Function Afficheformule(x)
Afficheformule = x.Formula
End Function

mais pb elle me renvoie par ex :
en i219 j'ai ÞCALER(action_s11;0;(X$155-11)*7;;)
en i234 j'ai = (AfficheFormule(I219)) et la valeur renvoy ée est
=OFFSET(action_s11,0,(X$155-11)*7,,)

Il faudrait ensuite que je supprime le début de la ch aine et puis que
reconvertisse le tout en formule.

D'avance merci
cdlt



























Avatar
lion10
bonjour corto

merci pour ces derniers compléments tout est clair maintenant.

cdlt lion10

"Corto" a écrit :

Bonjour lion10,
> si toutefois je souhaitais travailler en français et donc avec des ;
> aulieu de , quel est l'astuce pour spécifier ce choix par défaut à
> visual basic ?
Il n'est pas possible à ma connaissance de spécifier à VBA de travailler
avec les fonction en Français, c'est pourquoi je préconisait de rester
sur les fonctions en Anglais. Je t'avais envoyé dans un email précédent
le fichier dans lequel tu peux retrouver la correspondance.
> Tu peux retrouver la correspondance avec les fonctions en Français
> dans le fichier suivant (Office 2003).
> C:Program FilesMicrosoft OfficeOFFICE111036VBALIST.XLS
> Si tu as une autre version que 2003, il faut remplacer OFFICE11 par :
> OFFICE08 : Office 97
> OFFICE09 : Office 2000
> OFFICE10 : Office 2002
> OFFICE12 : Office 2007
> En utilisant les fct affiche formule puis évalue, (sans les accolades
> donc comme tu me l'a précisé) j'ai bien le bon résultat et non #valeur
> comme si le
> résultat était évalué automatiquement en matriciel.
Quand tu récupères une fonction matricielle dans une cellule et que tu
la réaffectes à une autre cellule, il n'y a pas besoin de l'affecter à
FormulaArray. Mais si tu entres un texte il ne faut pas écrire
CELLULE.Formula = {Fonction(Paramètres)} mais CELLULE.FormulaArray =
Fonction(Paramètres).
> Je n'ai pas fait l'essai via formulaarray qui est sans doute à
> utiliser via ActiveCell.FormulaArray.
C'est bien ça.
> Donc si je comprends bien une sub procédure n'est appelée que dans le code VB ou sur des actions touches clavier, bouton de dialogue,... etc.
Toujours d'accord.
> Q6 ) A moins ? de l'appeler ds une cellule via =procedure_xx sachant que dans le code vb procedure_xx va initialiser la valeur de la cellule active ; celle où la procédure est appelée à moins que cela corresponde à une autre cellule par exemple ?
Là non, si tu rentres le nom d'une macro dans une cellule Excel va te
mettre un message "Nom non valide", il faut l'appeler par Outils =>
Macros ou, comme tu disais dans la question précédente, l'affecter à une
touche ou à un bouton. Ta macro peut mettre à jour la valeur de la
cellule active ou de n'importe quelle plage de cellule que tu préciseras
dans le code de la macro.
> Q7) Tu n'as pas réagis concernant l'utilité de trim est ce bien ce que je pensais cad pour forcer un type en string, équivalent du cast en c ?
Je ne connais pas la raison mais le problème ne vient pas de VBA mais de
Excel. Dans ton classeur d'exemple j'ai essayé de rentrer les formules à
la main, quand je recopiais tes formules et que j'essayais de les
valider avec Ctrl+Alt+Enter il me mettait #VALEUR et quand je supprimais
les espaces la formule fonctionnait. Je n'ai pas trop cherché la raison
et j'ai ajouté TRIM dans la macro.

Corto

lion10 a écrit :
> Bonjour Corto
>
> Merci pour ces nouvelles précisions qui en appellent d'autres .
>
> Concernant R1 ,
> ------------------ J'ai bien noté ta préférence pour travailler en anglais
> , du reste il me semble que l'aide de vb en français descrit les opérandes
> anglaises.
> Mais pour ma culture au risque de paraître minortitaire et d'avoir des
> difficultés pour porter du code qui souvent est en anglais, si toutefois je
> souhaitais travailler en français et donc avec des ; aulieu de , quel est
> l'astuce pour spécifier ce choix par défaut à visual basic ?
>
> Concernant R2
> ---------------- volatile cela me rappel le langage c ok.
>
> Concernant R3,
> ------------------ pour les formules matriciellles en fait j'ai constaté
> que dans l'état avec le code que tu m'as fournit vb interprète bien les
> valeurs et par défaut c'est surprenant en matriciel.
> J'en veux pour preuve un essai que j'ai fait qui renvoie #valeur s'il n'est
> pas évalué en matriciel via les {.
> En utilisant les fct affiche formule puis évalue, (sans les accolades donc
> comme tu me l'a précisé) j'ai bien le bon résultat et non #valeur comme si le
> résultat était évalué automatiquement en matriciel.
>
> Je n'ai pas fait l'essai via formulaarray qui est sans doute à utiliser via
> activcell.formulaarray.
>
> Concernant R4,
> ------------------- je saisis. Une fonction comme en c renvoie une valeur
> en l'occurence son résultat que je ne positionnais pas d'où l'erreur
> affichée dans la cellule.
> Active cell permet avec value d'agir sur les propriétés affichées par une
> cellule.
>
> Et la je demande bien une confirmation :
> Q5) Dans une cellule comme on met =xxx, xxx est une ct ou une fonction
> puisqu'il faut renvoyer un résultat. Donc si je comprends bien une sub
> procédure n'est appelée que dans le code VB ou sur des actions touches
> clavier, bouton de dialogue,... etc.
>
> Q6 ) A moins ? de l'appeler ds une cellule via =procedure_xx sachant que
> dans le code vb procedure_xx va initialiser la valeur de la cellule active ;
> celle où la procédure est appelée à moins que cela corresponde à une autre
> cellule par exemple ?
>
> Q7) Tu n'as pas réagis concernant l'utilité de trim est ce bien ce que je
> pensais cad pour forcer un type en string, équivalent du cast en c ?
>
> cdlt lion10
>
> "Corto" a écrit :
>
>
>> Bonjour lion10,
>> R1) Je trouve que le plus simple est de travailler en VBA avec les
>> fonctions en Anglais et de ne garder FormulaLocal que quand on veut
>> afficher la formule.
>> R2) Tu peux forcer Excel à recalculer la fonction en précisant le mot
>> clé : Application.*Volatile*. Je te conseille d'aller lire l'aide VBA
>> sur cette méthode.
>> |Function UneFonction()
>> Application.*Volatile
>> Instructions
>> *End Function|
>> R3) Pour que VBA enregistre la formule comme matricielle, il faut
>> l'affecter à la propriété FormulaArray au lieu de Formula. *Il ne faut
>> pas mettre les accolades*, c'est toujour Excel qui doit les ajouter lui
>> même.
>> R4) Pas du tout quand tu rentres ActiveCell.Formula ="üt(xxx)" Excel
>> calcule cette fonction, le #ERREUR provient de ce que tes fonctions ne
>> renvoyaient aucune valeur. Comme je te l'avais dis dans mon premier
>> email, une fonction doit renvoyer une valeur. Si tu veux affecter des
>> valeurs dans des cellules (ActiveCell = XXX), il faut utiliser une macro
>> (définie par le mot clé Sub), dans une fonction (définie par Function)
>> tu dois affecter une valeur au nom de la fonction (MaFonction = XXX). Je
>> te conseille aussi de bien lire l'aide VBA sur ces deux mots clés.
>>
>> Corto
>>
>> lion10 a écrit :
>>
>>> Bonjour Corto
>>> Merci de m'aider à converger vers une solution.
>>>
>>> Je commence à comprendre certaines erreurs :
>>> 1) Erreur 1 :
>>> ---------------
>>> affiche formule avec formulalocal renvoie decaler(xxx;xx;)
>>> affiche formule avec formula renvoie offser(xxx,xx,xx)
>>> Dans le premier cas cela ne fonctionne pas à moins je l'ai vérifié de :
>>> -remplacer decaler par offset,
>>> -puis remplacer les ; par des ,.
>>>
>>> Q1) Cela m'amène donc à la question suivante doit on coder tout en anglais
>>> autrement dit en gardant formula, ou si on met formulalocal y at-il une
>>> astuce qui précise à la fct evaluate que l'on lui donne une instruction en
>>> français ?
>>>
>>> 2) Erreur 2 :
>>> ----------------
>>>
>>> Lorsque je modifie la fct dans le module visual basic, si je ne modifie pas
>>> la cellule qui appelle la fct , excell garde en mémoire l'ancienne fonction
>>> visual et on ne voit pas le changement.
>>>
>>> Q2) y-at-il un moyen de s'en affranchir ?
>>>
>>> J'ai fait un essai sans trim puisque je n'avais pas d'espace et cela ne fct
>>> pas , j'en déduis que trim est utile parcequ'il renvoie une variable de type
>>> explicite string ?
>>>
>>> 3) Erreur 3 :
>>> ---------------
>>>
>>> cela ne fct pas car evaluate prend la chaine de texte sans signe = et il se
>>> trouve que je le rajoutais, ce qui créait une erreur.
>>>
>>> Q3) Par contre je fais face à une impossibilité, car dans mon cas la formule
>>> est matriciel, donc de la forme {üt(xxx)}. Comment fait on dans ce cas pour
>>> stipuler que c'est un calcul matriciel ?
>>>
>>> Q4) Enfin je reviens sur ce que j'avais compris au début.
>>> Activecelle.formula ="üt(xxx)" à quoi cela sert-il finalement ?
>>> Juste à dire qu'il y a une cellule à remplir par une fct mais ne sert pas à
>>> calculer . Ce qui expliquerait que faute de demander le cacul par une syntaxe
>>> particulière , la valeur de la cellule est comme une variable non initialisée
>>> et renvoie donc #erreur ?
>>>
>>> cdlt lion10
>>>
>>>
>>> "Corto" a écrit :
>>>
>>>
>>>
>>>> Bonjour lion10,
>>>> Pour la cellule L204 il faut remplacer ta fonction Aff_date par la
>>>> suivante :
>>>> Function Aff_date()
>>>> Aff_date = Now
>>>> End Function
>>>> Pour la fonction Evalueformule :
>>>> Function Evalueformule(x)
>>>> Evalueformule = Evaluate(Trim(x))
>>>> End Function
>>>> Trim sert à supprimer les espaces inutiles dans la chaine de caractères.
>>>> et Afficheformule :
>>>> Function Afficheformule(x)
>>>> Afficheformule = x.FormulaLocal
>>>> End Function
>>>>
>>>> Ce que je ne comprend pas dans ta démarche c'est pouquoi tu veux mettre
>>>> 4 formules et deux fonctions pour obtenir le même résultat que si tu
>>>> avais mis = L197 en L200
>>>>
>>>> Corto
>>>>
>>>> lion10 a écrit :
>>>>
>>>>
>>>>> Bonjour corto,
>>>>> Pour cherche je comprends mieux pourquoi il ne trouve pas ma chaine ds la
>>>>> deuxième ligne issu du décalage de actions11. J'aurai pensé qd même que le
>>>>> calcul matriciel permette de faire la recherche de lma chaine en faisant la
>>>>> recherche ligne par ligne cad par ligne de 7 colonnes.
>>>>>
>>>>> Sinon je reviens à mon pb de base ds cet essai simple et je reformule donc :
>>>>> en l197 j'ai une formule simple de concaténation
>>>>> en l198 j'extrait la formule sans signe = car fct substitue
>>>>> en l199 je recré la chaine =i194 & i195
>>>>> en l200 je passe cette chaine à la fct evalue formule.
>>>>> et j'attends de voir en L200 le résultat donc essai 5 essai 6 ds le cas de
>>>>> cet exemple.
>>>>>
>>>>> Autre exemple en l204 j'attends de voir la date du jour suite à l'évaluation
>>>>> de la formule maintenant.
>>>>>
>>>>>
>>>>> cdlt lion10
>>>>>
>>>>> "Corto" a écrit :
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>> Bonjour lion10,
>>>>>> La fonction CHERCHE : *CHERCHE*(*texte_cherché*;*texte*;no_départ)
>>>>>> attend comme paramètre une chaine de caractère et pas une plage de
>>>>>> cellules, pour rechercher dans une plage de cellule, il faut utiliser*
>>>>>> **EQUIV*(*valeur_cherchée*;*matrice_recherche*;type).
>>>>>> Dans une fonction tu dois impérativement renvoyer une valeur
>>>>>> Function Aff_date()
>>>>>> Aff_date = Now
>>>>>> End Function
>>>>>> Pour le reste, je ne comprends pas ce que tu cherches à faire, si les
>>>>>> formules en I198, I199 et I200 fonctionnaient ça ne ferait rien de plus
>>>>>> que si tu mettait directement dans I200 = I197.
>>>>>>
>>>>>> Corto
>>>>>>
>>>>>> lion10 a écrit :
>>>>>>
>>>>>>
>>>>>>
>>>>>>> Bonjour Corto
>>>>>>>
>>>>>>> Vraiment merci de revenir à mon aide.
>>>>>>> http://cjoint.com/data/kcmQlD2mAN.htm
>>>>>>>
>>>>>>> Dans le fichier j'ai marqué en rouge mes problèmes :
>>>>>>> fonction evalue formule
>>>>>>> fonction aff date
>>>>>>> et éventuellement un mystère concernant le dysfonctionnement de la fonction
>>>>>>> cherche en matriciel.
>>>>>>>
>>>>>>> Cordialement Lion10
>>>>>>>
>>>>>>> "Corto" a écrit :
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> Bonjour lion10,
>>>>>>>> Désolé, j'étais en congé ces deux dernier jours pour l'Aïd el Fitr.
>>>>>>>> La formule (qui fonctionne chez moi) est :
>>>>>>>> [A5].Formula = "=OFFSET(action_s11,0,(X$155-11)*7)"
>>>>>>>> ou [A5].FormulaLocal = "ÞCALER(action_s11;0;(X$155-11)*7)"
>>>>>>>> NB les séparateurs en Anglais sont des , en Français ce sont des ;
>>>>>>>> Je me suis bien sûr débrouillé pour que 11 < X$155 < 46 pour que la
>>>>>>>> formule donne un résultat correct ( >0 et < 256)
>>>>>>>> Si tu n'y arrives toujours pas, mets ton fichier sur cjoint.com et poste
>>>>>>>> l'adresse générée.
>>>>>>>>
>>>>>>>> Corto
>>>>>>>>
>>>>>>>> lion10 a écrit :
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>> bonjour
>>>>>>>>>
>>>>>>>>> je suis tjs bloqué.
>>>>>>>>> j'ai recherché sur le net mais mes essais restent sans résultat je récupère
>>>>>>>>> tjs #erreur !!
>>>>>>>>>
>>>>>>>>> Pourtant j'ai corrigé en mettant :
>>>>>>>>> Function Evalueformule(x)
>>>>>>>>> ActiveCell.Formula = x


1 2