XL 2019 Copie de la formule d'une cellule avec indexation des références

PRy

XLDnaute Nouveau
Bonjour à toutes et tous (expertes et experts) !!

En ces temps difficiles, j'espère que vous vous portez bien...

Cela fait deux jours que je bute sur un "petit" problème (pour vous, grand pour moi) : la copie d'une formule.
Explication : par macro j'essaie de copier une formule d'une cellule dans une autre cellule (en l’occurrence celle d'en dessous).
Après quelques recherches, j'ai trouvé :

exemple : en ligne 82 ,j'ai la formule suivante : =SI(G82="";"";SI(K82>D82;K82+G82;D82+G82))
Quand ma macro la copie en ligne 83 cela donne : =SI(G82="";"";SI(K82>D82;K82+G82;D82+G82))

Donc la copie fonctionne bien, mais j'aimerai qu'à la place de "82" la formule soit indexée par le numéro de ligne et donne : =SI(G83="";"";SI(K83>D83;K83+G83;D83+G83)). Et je n'ai pas trouvé comment !! (même en regardant sur le site de mon "maître" excellentissime Jacques Boisgontier !!).

Voici le bout de code trouvé sur le net que j'utilise (c'est sans doute pas très académique, mais j'arrive à "me" comprendre !! ) :

With Worksheets("ALED")
Formule = .Range(Cells(DerniereLigne, 8), Cells(DerniereLigne, 8)).Formula
End With
With Worksheets("ALED")
.Range(Cells(DerniereLigne + 1, 8), Cells(DerniereLigne + 1, 8)).Formula = Formule
End With

Si vous avez une solution, je suis preneur ...

Merci d'avance
 
Solution
Vous n'avez pas besoin de faire ça !
Travaillez avec FormulaR1C1 bon sang !
En H8, en notation A1 française (propriété FormulaLocal que je n'utilise jamais) :
Code:
=SI($G8="";"";MAX($D8;$K8)+$G8)
Se traduit en notation R1C1 par :
Code:
=IF(RC7="","",MAX(RC4,RC11)+RC7)
quelle que soit la ligne, puisque les références relatives le sont toujours par rapport à la cellule qui porte la formule. Et ça peut donc se programmer par :
VB:
Feuil1.[H8].FormulaR1C1 = "=IF(RC7="""","""",MAX(RC4,RC11)+RC7)"
Remarque: Il y a aussi la notation L1C1 (propriété FormulaR1C1Local), en laquelle ça s'écrirait :
Code:
=SI(LC7="";"";MAX(LC4;LC11)+LC7){/CODE]
mais elle est probablement très peu utilisée.

PRy

XLDnaute Nouveau
Hello,

Essaye
VB:
With Worksheets("ALED")
    .Cells(derniereligne, 8).Copy
    .Cells(derniereligne + 1, 8).Select
    .Paste
    Application.CutCopyMode = False
End With

(je sais, copier coller n'est pas très propre...)

Bonjour D.D.
Merci pour ta proposition..... mais malheureusement, elle donne le même résultat !!
Le "concours" reste ouvert !!
En tout cas, merci vraiment....
 

PRy

XLDnaute Nouveau
Merci pour ce fichier exemple... qui fonctionne. Je l'ai bidouillé pour introduire une fonction ressemblante avec celle que j'utilise.... et cela fonctionne dans ton fichier.
Mais j'ai copié, vérifié ce bout de code dans mon fichier, et il n'y a pas à "tortillé", cela ne fonctionne pas !!!

Comme il y a des noms de personne dans mon fichier et que c'est un peu confidentiel, j'ai fabriqué un fichier de test avec toutes les macros du dossier. Et cela ne marche pas !
il faut aller dans la feuille Archive 2020 et cliquer sur " bouton 3". Accepter l'année proposée (2020) et saisir la ligne 2 ou 3 (les seules que j'ai gardée) ... et voir dans la feuille "ALED" la dernière ligne ...

Si cela peut vous aider à m'aider !!!!

Merci !!!
 

Pièces jointes

  • Test copie formule.xlsm
    155.2 KB · Affichages: 3

Dranreb

XLDnaute Barbatruc
Bonsoir.
Au lieu de reproduire une mauvaise Formula, pour quoi n'installeriez vous pas la bonne FormulaR1C1 :
VB:
Feuil1.Cells(DernièreLigne + 1, "H").FormulaR1C1 = "=IF(RC7="""","""",MAX(RC4,RC11)+RC7)"
Comme ça c'est la même à toutes les lignes !
 
Dernière édition:

PRy

XLDnaute Nouveau
Bonsoir.
Au lieu de reproduire une mauvaise Formula, pour quoi n'installeriez vous pas la bonne FormulaR1C1 :
VB:
Feuil1.Cells(DernièreLigne + 1, "H").FormulaR1C1 = "=IF(RC7="""","""",MAX(RC4,RC11)+RC7)"
Comme ça c'est la même à toutes les lignes !

Bonsoir

Merci pour cette idée.
Malheureusement, mon faible niveau vba ne me permet pas de l'implémenter !
Quand j'essaie de mettre simplement la formule dans la cellule à la main... j'ai une erreur #NOM?.
J'ai compris qu'il me fallait mettre cela en français....
Cela donne : =SI(RC7="";"";MAX(RC4;RC11)+RC7)
Seulement cela ne fonctionne pas : résultat : cellule vide.
En fait, si j'écris " =si(RC7=""; "toto"; "tata") le résultat est toto....
En fait : RC7 n'est pas correctement traduit : si j'écris simplement =RC7 le résultat est 0 alors qu'il y a 60 dans la colonne 7 de la ligne ....
Bref.... j'avais trouvé une solution, qui implémentée à la main directement dans la celule en tant que formule fonctionne... mais mise dans le code me donne une formule 1004....
Le code :
Formule = "=SI(INDIRECT(CONCATENER(""G"";LIGNE()))="""";"""";MAX(INDIRECT(CONCATENER(""D"";LIGNE()));INDIRECT(CONCATENER(""K"";LIGNE())))+INDIRECT(CONCATENER(""G""; LIGNE())))"

'End With
With Worksheets("ALED")
.Range(Cells(DerniereLigne + 1, 8), Cells(DerniereLigne + 1, 8)).Formula = Formule
End With

Bon, j'avance un peu, peut-être pas le plus académiquement... mais je bloque encore.... si vous avez des idées !!

Merci d'avance
 

Pièces jointes

  • Test copie formule.xlsm
    151.2 KB · Affichages: 2

Dranreb

XLDnaute Barbatruc
Vous n'avez pas besoin de faire ça !
Travaillez avec FormulaR1C1 bon sang !
En H8, en notation A1 française (propriété FormulaLocal que je n'utilise jamais) :
Code:
=SI($G8="";"";MAX($D8;$K8)+$G8)
Se traduit en notation R1C1 par :
Code:
=IF(RC7="","",MAX(RC4,RC11)+RC7)
quelle que soit la ligne, puisque les références relatives le sont toujours par rapport à la cellule qui porte la formule. Et ça peut donc se programmer par :
VB:
Feuil1.[H8].FormulaR1C1 = "=IF(RC7="""","""",MAX(RC4,RC11)+RC7)"
Remarque: Il y a aussi la notation L1C1 (propriété FormulaR1C1Local), en laquelle ça s'écrirait :
Code:
=SI(LC7="";"";MAX(LC4;LC11)+LC7){/CODE]
mais elle est probablement très peu utilisée.
 
Dernière édition:

PRy

XLDnaute Nouveau
Vous n'avez pas besoin de faire ça !
Travaillez avec FormulaR1C1 bon sang !
En H8, en notation A1 française (propriété FormulaLocal que je n'utilise jamais) :
Code:
=SI($G8="";"";MAX($D8;$K8)+$G8)
Se traduit en notation R1C1 par :
Code:
=IF(RC7="","",MAX(RC4,RC11)+RC7)
quelle que soit la ligne, puisque les références relatives le sont toujours par rapport à la cellule qui porte la formule. Et ça peut donc se programmer par :
VB:
Feuil1.[H8].FormulaR1C1 = "=IF(RC7="""","""",MAX(RC4,RC11)+RC7)"
Remarque: Il y a aussi la notation L1C1 (propriété FormulaR1C1Local), en laquelle ça s'écrirait :
Code:
=SI(LC7="";"";MAX(LC4;LC11)+LC7){/CODE]
mais elle est probablement très peu utilisée.


Bonjour,
Eh oui, cela peut vous paraitre simple et évident, mais pour moi.... c'est toujours un peu compliqué et je ne maîtrise pas tout !! :)
Et j'en apprends tous les jours....

En tout cas merci : j'ai enfin une solution :
la voici :
Worksheets("ALED").Cells(DerniereLigne + 1, 8).FormulaR1C1Local = "=SI(LC7="""";"""";MAX(LC4;LC11)+LC7)"
et cela donne dans la cellule en ligne 14 (par exemple) : =SI($G14="";"";MAX($D14;$K14)+$G14)

Grand grand merci pour votre aide !!!
 

Discussions similaires

Statistiques des forums

Discussions
312 216
Messages
2 086 344
Membres
103 194
dernier inscrit
rtison