OVH Cloud OVH Cloud

Définir la formule par macro d'une cellule

9 réponses
Avatar
Colasmar
Bonjour,
J'abuse de la gentillesse de ceux qui aident les débutants comme moi.

Me voilà confronté au problème suivant :
je voudrais que ma macro recopie une formule de calcul qui se trouve dans
une cellule vers une autre cellule mais en l'adaptant.
Par exemple la formul en F24 est = BDlire(F18:G22;2;AB23:AB24) et je
voudrais la recopier en F26 et qu'elle soit =BDlire(F18:G22;2;AB25:AB26)
Donc je ne peux pas utiliser la copie qui adapte les référence, je ne peux
pas utiliser des référence absolue pour la base car elle aussi vaire de place.
J'ai essayé de récupérer la formule dans une variable mais je n'y arrive pas.

Bon eh bien merci d'avance à ceux qui peuvent m'apporter quelques éclairages.
Amicalement et bon week-end

9 réponses

Avatar
Patrick BASTARD
Bonjour, *Colasmar*

C'est, comme tant de choses, juste une question de dollars :
ta cellule en F24 = BDlire(F$18:G$22;2;AB23:AB24)
deviendra en F26= BDlire(F$18:G$22;2;AB25:AB26)
car les $ figent les références.

--
Bien amicordialement,
P. Bastard


Bonjour,
J'abuse de la gentillesse de ceux qui aident les débutants comme moi.

Me voilà confronté au problème suivant :
je voudrais que ma macro recopie une formule de calcul qui se trouve
dans
une cellule vers une autre cellule mais en l'adaptant.
Par exemple la formul en F24 est = BDlire(F18:G22;2;AB23:AB24) et je
voudrais la recopier en F26 et qu'elle soit
½lire(F18:G22;2;AB25:AB26)
Donc je ne peux pas utiliser la copie qui adapte les référence, je ne
peux pas utiliser des référence absolue pour la base car elle aussi
vaire de place. J'ai essayé de récupérer la formule dans une variable
mais je n'y arrive pas.

Bon eh bien merci d'avance à ceux qui peuvent m'apporter quelques
éclairages. Amicalement et bon week-end


Avatar
Colasmar
Merci Patrick mais je l'ai indiqué dans le message je ne peux pas utiliser de
référence absolue sinon je n'aurai pas ce problème.
Il faut donc que ma macro récupère la formule et que j'arrive à la modifier
avant de la recopier dans la nouvelle cellule.
Donc si tu as une autre idée...



Bonjour, *Colasmar*

C'est, comme tant de choses, juste une question de dollars :
ta cellule en F24 = BDlire(F$18:G$22;2;AB23:AB24)
deviendra en F26= BDlire(F$18:G$22;2;AB25:AB26)
car les $ figent les références.

--
Bien amicordialement,
P. Bastard


Bonjour,
J'abuse de la gentillesse de ceux qui aident les débutants comme moi.

Me voilà confronté au problème suivant :
je voudrais que ma macro recopie une formule de calcul qui se trouve
dans
une cellule vers une autre cellule mais en l'adaptant.
Par exemple la formul en F24 est = BDlire(F18:G22;2;AB23:AB24) et je
voudrais la recopier en F26 et qu'elle soit
½lire(F18:G22;2;AB25:AB26)
Donc je ne peux pas utiliser la copie qui adapte les référence, je ne
peux pas utiliser des référence absolue pour la base car elle aussi
vaire de place. J'ai essayé de récupérer la formule dans une variable
mais je n'y arrive pas.

Bon eh bien merci d'avance à ceux qui peuvent m'apporter quelques
éclairages. Amicalement et bon week-end







Avatar
michdenis
Colasmar,

Si tu disais quel est l'information que tu veux retrouver dans ton tableau,
il y a des formules plus "simples" que BdLire()

Tu dis que ton tableau change de plage... qu'est-ce que cela est supposé
vouloir dire ?


Salutations!


"Colasmar" a écrit dans le message de news:

Bonjour,
J'abuse de la gentillesse de ceux qui aident les débutants comme moi.

Me voilà confronté au problème suivant :
je voudrais que ma macro recopie une formule de calcul qui se trouve dans
une cellule vers une autre cellule mais en l'adaptant.
Par exemple la formul en F24 est = BDlire(F18:G22;2;AB23:AB24) et je
voudrais la recopier en F26 et qu'elle soit ½lire(F18:G22;2;AB25:AB26)
Donc je ne peux pas utiliser la copie qui adapte les référence, je ne peux
pas utiliser des référence absolue pour la base car elle aussi vaire de place.
J'ai essayé de récupérer la formule dans une variable mais je n'y arrive pas.

Bon eh bien merci d'avance à ceux qui peuvent m'apporter quelques éclairages.
Amicalement et bon week-end
Avatar
Colasmar
Oui je me complique peut-être la vie et l'appli que j'essaie de réaliser
n'est pas facile à expliquer (evidement acces ferait cela plus facilement
mais nous ne l'avons pas et on ne pourra pas l'acheter ):
1) j'ai une base de données Excell de Réunions (avec des dates de début, de
fin, et cela me permet de faire un mini workflow pour savoir quand on
convoque, quand on réserve les salles...
2) Pour chaque réunion que j'entre dans ma base de données, j'ai des macros
qui me permettent d'ajouter des participants (donc jsuque là je rajoute des
colonnes avec le nom des particpants et la date de leur réponse et donc j'ai
une rupture sur le champ "réunion").
3) Comme, évidemment, Excel n'est pas une base relationnelle. Je ruse en
insérant des lignes cachées pour chaque participant. Cela me permet d'insérer
un nom de champ "nom" au dessus du nom du participant. Comme cela dans les
cellules voisines, par la fonction BDLire, je vais chercher l'adresse et
d'autres informations dans une base "participants" plus bas dans la feuille.
Jusque là ça marche... et plutôt bien.

Mais après ça se complique un peu car chaque réunion peut avoir plusieurs
modules. Donc là je les insère entre l'intitulé de la réunion et les
participants.
Or comme il faut que je traite les réponses par participant, je veux
récupérer les dates de module en cours sur chaque ligne "participants"
(chaque participants n'ayant pas forcément le même module en cours).
Pour ce faire, j'ai imaginer considérer les modules commes une sous-base
(donc pareil j'ai inséré une ligne cachée ou il y a les intitulés de champs
"date de début" et "date de fin".
Ensuite dans la ligne participant, j'ustilise la fonction BDlire qui va
chercher dans cette sous-base les dates du bon module en fonction du numéro
de module en cours que l'on indique dans l'enregistrement du participant.

En gros :

Nom de réunion11 / date déb / Date fin / Date conv /
Module 1.1 / date déb/ Date fin/
Module 1.2 / Date déb/ date fin/
Module 1.3 / date déb/ date fin/ N° Mod en cours
date deb mod en cours /Date fin mod en cours 1 /N°Mod en cours/nom1/ad/
rep
date deb mod en cours /Date fin mod en cours 1 /N°Mod en cours/nom2/ad/
rep
date deb mod en cours /Date fin mod en cours 1 /N°Mod en cours/nom3/ad/
rep
Nom de réunion 2 / date déb / Date fin / Date conv
Module 2.1 / date déb/ Date fin/
Module 2.2 / Date déb/ date fin/
date deb mod en cours 2 /Date fin mod en cours / N°Mod en cours/nom n/ad/
rep
date deb mod en cours 2/Date fin mod en cours / N°Mod en cours/nom 2
/ad/rep

Donc tout cela marche très bien jusqu'à la première insertion de particpant.
Mais à la deuxième, évidement la formule qui me permet de lire la date du
module en cours ne fonctionne pas puisqu'elle ne peut s'ajuster corretement.
Quand je dis que ma base de données est mobile, c'est parceque pour chaque
réunion je créée donc cette sous-base de module et que le BDlire doit
s'adapter à celle-ci et à un numéro de module en cours qui se trouve dans
l'enregistrement "participant". C'est pour cela que j'imaginai que ma macro
pouvait, à l'insertion d'un nouveau participant, recopier la formule de
l'enregistement "particpant" précédent et l'adapter en conservant les
références de la base de données mais en changeant les références du champs
de recherche.
Bon tout cela est certainement trop compliqué mais je suis au bout de
l'aplli et il ne reste pratiquement que ce problème à régler....
En plus ça m'interesse de savoir comment récupérer une formule et la
transformer par l'intérmédiare d'une macro.

Merci pour l'aide et en tous les cas pour la compassion... envers le piètre
développeur que je suis. Bonne fin de week end.


Colasmar,

Si tu disais quel est l'information que tu veux retrouver dans ton tableau,
il y a des formules plus "simples" que BdLire()

Tu dis que ton tableau change de plage... qu'est-ce que cela est supposé
vouloir dire ?


Salutations!


"Colasmar" a écrit dans le message de news:

Bonjour,
J'abuse de la gentillesse de ceux qui aident les débutants comme moi.

Me voilà confronté au problème suivant :
je voudrais que ma macro recopie une formule de calcul qui se trouve dans
une cellule vers une autre cellule mais en l'adaptant.
Par exemple la formul en F24 est = BDlire(F18:G22;2;AB23:AB24) et je
voudrais la recopier en F26 et qu'elle soit ½lire(F18:G22;2;AB25:AB26)
Donc je ne peux pas utiliser la copie qui adapte les référence, je ne peux
pas utiliser des référence absolue pour la base car elle aussi vaire de place.
J'ai essayé de récupérer la formule dans une variable mais je n'y arrive pas.

Bon eh bien merci d'avance à ceux qui peuvent m'apporter quelques éclairages.
Amicalement et bon week-end





Avatar
michdenis
Bonjour Colasmar,

Désolé, mais je suis bien incapable de t'aider sur cette problématique.


Salutations!


"Colasmar" a écrit dans le message de news:

Oui je me complique peut-être la vie et l'appli que j'essaie de réaliser
n'est pas facile à expliquer (evidement acces ferait cela plus facilement
mais nous ne l'avons pas et on ne pourra pas l'acheter ):
1) j'ai une base de données Excell de Réunions (avec des dates de début, de
fin, et cela me permet de faire un mini workflow pour savoir quand on
convoque, quand on réserve les salles...
2) Pour chaque réunion que j'entre dans ma base de données, j'ai des macros
qui me permettent d'ajouter des participants (donc jsuque là je rajoute des
colonnes avec le nom des particpants et la date de leur réponse et donc j'ai
une rupture sur le champ "réunion").
3) Comme, évidemment, Excel n'est pas une base relationnelle. Je ruse en
insérant des lignes cachées pour chaque participant. Cela me permet d'insérer
un nom de champ "nom" au dessus du nom du participant. Comme cela dans les
cellules voisines, par la fonction BDLire, je vais chercher l'adresse et
d'autres informations dans une base "participants" plus bas dans la feuille.
Jusque là ça marche... et plutôt bien.

Mais après ça se complique un peu car chaque réunion peut avoir plusieurs
modules. Donc là je les insère entre l'intitulé de la réunion et les
participants.
Or comme il faut que je traite les réponses par participant, je veux
récupérer les dates de module en cours sur chaque ligne "participants"
(chaque participants n'ayant pas forcément le même module en cours).
Pour ce faire, j'ai imaginer considérer les modules commes une sous-base
(donc pareil j'ai inséré une ligne cachée ou il y a les intitulés de champs
"date de début" et "date de fin".
Ensuite dans la ligne participant, j'ustilise la fonction BDlire qui va
chercher dans cette sous-base les dates du bon module en fonction du numéro
de module en cours que l'on indique dans l'enregistrement du participant.

En gros :

Nom de réunion11 / date déb / Date fin / Date conv /
Module 1.1 / date déb/ Date fin/
Module 1.2 / Date déb/ date fin/
Module 1.3 / date déb/ date fin/ N° Mod en cours
date deb mod en cours /Date fin mod en cours 1 /N°Mod en cours/nom1/ad/
rep
date deb mod en cours /Date fin mod en cours 1 /N°Mod en cours/nom2/ad/
rep
date deb mod en cours /Date fin mod en cours 1 /N°Mod en cours/nom3/ad/
rep
Nom de réunion 2 / date déb / Date fin / Date conv
Module 2.1 / date déb/ Date fin/
Module 2.2 / Date déb/ date fin/
date deb mod en cours 2 /Date fin mod en cours / N°Mod en cours/nom n/ad/
rep
date deb mod en cours 2/Date fin mod en cours / N°Mod en cours/nom 2
/ad/rep

Donc tout cela marche très bien jusqu'à la première insertion de particpant.
Mais à la deuxième, évidement la formule qui me permet de lire la date du
module en cours ne fonctionne pas puisqu'elle ne peut s'ajuster corretement.
Quand je dis que ma base de données est mobile, c'est parceque pour chaque
réunion je créée donc cette sous-base de module et que le BDlire doit
s'adapter à celle-ci et à un numéro de module en cours qui se trouve dans
l'enregistrement "participant". C'est pour cela que j'imaginai que ma macro
pouvait, à l'insertion d'un nouveau participant, recopier la formule de
l'enregistement "particpant" précédent et l'adapter en conservant les
références de la base de données mais en changeant les références du champs
de recherche.
Bon tout cela est certainement trop compliqué mais je suis au bout de
l'aplli et il ne reste pratiquement que ce problème à régler....
En plus ça m'interesse de savoir comment récupérer une formule et la
transformer par l'intérmédiare d'une macro.

Merci pour l'aide et en tous les cas pour la compassion... envers le piètre
développeur que je suis. Bonne fin de week end.


Colasmar,

Si tu disais quel est l'information que tu veux retrouver dans ton tableau,
il y a des formules plus "simples" que BdLire()

Tu dis que ton tableau change de plage... qu'est-ce que cela est supposé
vouloir dire ?


Salutations!


"Colasmar" a écrit dans le message de news:

Bonjour,
J'abuse de la gentillesse de ceux qui aident les débutants comme moi.

Me voilà confronté au problème suivant :
je voudrais que ma macro recopie une formule de calcul qui se trouve dans
une cellule vers une autre cellule mais en l'adaptant.
Par exemple la formul en F24 est = BDlire(F18:G22;2;AB23:AB24) et je
voudrais la recopier en F26 et qu'elle soit ½lire(F18:G22;2;AB25:AB26)
Donc je ne peux pas utiliser la copie qui adapte les référence, je ne peux
pas utiliser des référence absolue pour la base car elle aussi vaire de place.
J'ai essayé de récupérer la formule dans une variable mais je n'y arrive pas.

Bon eh bien merci d'avance à ceux qui peuvent m'apporter quelques éclairages.
Amicalement et bon week-end





Avatar
Colasmar
Bon ben c'est pas grave merci quand même du soutien.
Par contre pour poursuivre mes recherches tu as peut être une idée sur la
façon de récupérer la formule d'une cellule dans une variable chaîne de
caractères pour pouvoir la modifier ?
J'ai essayé formule$ = Range("F30").Formula mais je n'arrive pas à
l'exploiter.


Bonjour Colasmar,

Désolé, mais je suis bien incapable de t'aider sur cette problématique.


Salutations!


"Colasmar" a écrit dans le message de news:

Oui je me complique peut-être la vie et l'appli que j'essaie de réaliser
n'est pas facile à expliquer (evidement acces ferait cela plus facilement
mais nous ne l'avons pas et on ne pourra pas l'acheter ):
1) j'ai une base de données Excell de Réunions (avec des dates de début, de
fin, et cela me permet de faire un mini workflow pour savoir quand on
convoque, quand on réserve les salles...
2) Pour chaque réunion que j'entre dans ma base de données, j'ai des macros
qui me permettent d'ajouter des participants (donc jsuque là je rajoute des
colonnes avec le nom des particpants et la date de leur réponse et donc j'ai
une rupture sur le champ "réunion").
3) Comme, évidemment, Excel n'est pas une base relationnelle. Je ruse en
insérant des lignes cachées pour chaque participant. Cela me permet d'insérer
un nom de champ "nom" au dessus du nom du participant. Comme cela dans les
cellules voisines, par la fonction BDLire, je vais chercher l'adresse et
d'autres informations dans une base "participants" plus bas dans la feuille.
Jusque là ça marche... et plutôt bien.

Mais après ça se complique un peu car chaque réunion peut avoir plusieurs
modules. Donc là je les insère entre l'intitulé de la réunion et les
participants.
Or comme il faut que je traite les réponses par participant, je veux
récupérer les dates de module en cours sur chaque ligne "participants"
(chaque participants n'ayant pas forcément le même module en cours).
Pour ce faire, j'ai imaginer considérer les modules commes une sous-base
(donc pareil j'ai inséré une ligne cachée ou il y a les intitulés de champs
"date de début" et "date de fin".
Ensuite dans la ligne participant, j'ustilise la fonction BDlire qui va
chercher dans cette sous-base les dates du bon module en fonction du numéro
de module en cours que l'on indique dans l'enregistrement du participant.

En gros :

Nom de réunion11 / date déb / Date fin / Date conv /
Module 1.1 / date déb/ Date fin/
Module 1.2 / Date déb/ date fin/
Module 1.3 / date déb/ date fin/ N° Mod en cours
date deb mod en cours /Date fin mod en cours 1 /N°Mod en cours/nom1/ad/
rep
date deb mod en cours /Date fin mod en cours 1 /N°Mod en cours/nom2/ad/
rep
date deb mod en cours /Date fin mod en cours 1 /N°Mod en cours/nom3/ad/
rep
Nom de réunion 2 / date déb / Date fin / Date conv
Module 2.1 / date déb/ Date fin/
Module 2.2 / Date déb/ date fin/
date deb mod en cours 2 /Date fin mod en cours / N°Mod en cours/nom n/ad/
rep
date deb mod en cours 2/Date fin mod en cours / N°Mod en cours/nom 2
/ad/rep

Donc tout cela marche très bien jusqu'à la première insertion de particpant.
Mais à la deuxième, évidement la formule qui me permet de lire la date du
module en cours ne fonctionne pas puisqu'elle ne peut s'ajuster corretement.
Quand je dis que ma base de données est mobile, c'est parceque pour chaque
réunion je créée donc cette sous-base de module et que le BDlire doit
s'adapter à celle-ci et à un numéro de module en cours qui se trouve dans
l'enregistrement "participant". C'est pour cela que j'imaginai que ma macro
pouvait, à l'insertion d'un nouveau participant, recopier la formule de
l'enregistement "particpant" précédent et l'adapter en conservant les
références de la base de données mais en changeant les références du champs
de recherche.
Bon tout cela est certainement trop compliqué mais je suis au bout de
l'aplli et il ne reste pratiquement que ce problème à régler....
En plus ça m'interesse de savoir comment récupérer une formule et la
transformer par l'intérmédiare d'une macro.

Merci pour l'aide et en tous les cas pour la compassion... envers le piètre
développeur que je suis. Bonne fin de week end.


Colasmar,

Si tu disais quel est l'information que tu veux retrouver dans ton tableau,
il y a des formules plus "simples" que BdLire()

Tu dis que ton tableau change de plage... qu'est-ce que cela est supposé
vouloir dire ?


Salutations!


"Colasmar" a écrit dans le message de news:

Bonjour,
J'abuse de la gentillesse de ceux qui aident les débutants comme moi.

Me voilà confronté au problème suivant :
je voudrais que ma macro recopie une formule de calcul qui se trouve dans
une cellule vers une autre cellule mais en l'adaptant.
Par exemple la formul en F24 est = BDlire(F18:G22;2;AB23:AB24) et je
voudrais la recopier en F26 et qu'elle soit ½lire(F18:G22;2;AB25:AB26)
Donc je ne peux pas utiliser la copie qui adapte les référence, je ne peux
pas utiliser des référence absolue pour la base car elle aussi vaire de place.
J'ai essayé de récupérer la formule dans une variable mais je n'y arrive pas.

Bon eh bien merci d'avance à ceux qui peuvent m'apporter quelques éclairages.
Amicalement et bon week-end










Avatar
JB
Bonjour,

Pour lire la formule en F24:

temp = [F24].Formula

As tu pensé aux fonctions Decaler(), Ligne(),Colonne() pour la recopie
de la formule.

p1= InStr(temp, "AB")
p2 = InStr(P1, temp, ":")
x = Mid(temp, P1 + 2, (p2 - P1 - 2))
Mid(temp, P1 + 2, 2) = CStr(CInt(x) + 2)
Mid(temp, P1 + 7, 2) = CStr(CInt(x) + 3)

Cordialement JB
Avatar
JB
*je ne peux pas utiliser des référence absolue pour la base car elle
aussi vaire de place.

Si la BD est déplacée, les formules sont adaptées automatiquement.
Le mieux serait de la nommer avec Insertion/Nom/Définir.

JB
Avatar
Colasmar
Eh ben non j'y avais pas pensé vu que je suis encore un peu débutant et que
je maîtrise pas toutes les finesses.
Donc merci JB t'es génial!!!


Bonjour,

Pour lire la formule en F24:

temp = [F24].Formula

As tu pensé aux fonctions Decaler(), Ligne(),Colonne() pour la recopie
de la formule.

p1= InStr(temp, "AB")
p2 = InStr(P1, temp, ":")
x = Mid(temp, P1 + 2, (p2 - P1 - 2))
Mid(temp, P1 + 2, 2) = CStr(CInt(x) + 2)
Mid(temp, P1 + 7, 2) = CStr(CInt(x) + 3)

Cordialement JB