Ajouter formule référence relatives dans MFC via VBA

Bonjour,

Je me suis beaucoup servis du site et du forum pour apprendre à concevoir des Macro, il est très riche en ressources ! Merci de partager du savoir de la sorte.

Avant d'ouvrir ce sujet j'ai regardé dans le site et le forum si un des sujet me convenais, en vain. Je me suis donc permis d'en ouvrir un nouveau.

Je suis bloqué dans le développement d'une macro sur un point, je n'arrive pas à ajouter dans les MFC (via VBA) les formules que je souhaite en relatif.

Le code fonctionne de la sorte, les cellules selectionnées prennent en MFC la formule ET(AN28<>"";AN28<>"C") (AN28 étant un exemple) et le format voulu. A partir de la tout vas bien pour moi.

With Selection
    .FormatConditions.Delete
    .FormatConditions.Add Type:=xlExpression, Formula1:="=ET(AN28<>"""";AN28<>""C"")"
    With .FormatConditions(1)
         .Interior.ColorIndex = 3
         .StopIfTrue = False
         End With
    End With

Maintenant je nage dans la soupe lorsque que j'essai de lui faire avaler cette même formule mais en références relatives,

With Selection
    .FormatConditions.Delete
    .Selection.FormatConditions.Add Type:=xlExpression, FormulaR1C1:="=AND(R[0]C[0]<>"""",R[0]C[0]<>""C"")"
    With .FormatConditions(1)
         .Interior.ColorIndex = 3
         .StopIfTrue = False
         End With

Je n'ai pas essayé que cette solution mais en général quand Excel lit ce bloc j'ai le droit à l'erreur "438"...

Il me faudrait une solution/astuce pour que la formule en relatif aille dans la MFC de la cellule active.

Pour ce travail je suis sur Excel 2010

J'espère avoir été exhaustif dans la description du problème, si ce n'est pas le cas faite le moi savoir.

Je ne peux pas vous fournir le classeur excel il est classé défense.

D'avance merci pour vos lumières !

Bonjour,

AN28 est relatif déjà.

Que veux-tu de plus ?

eric

Bonjour,

Ton premier code est bon... Le second non

Je l'aurais toutefois écrit ainsi :

    With Selection.FormatConditions
        .Delete
        With .Add(xlExpression, "=ET(AN28<>"""";AN28<>""C"")")
            .Interior.ColorIndex = 3
        End With
    End With

[Bien que le Selection ne me botte pas trop (car mettre en VBA sur sélection, autant le faire manuellement ! Et ColorIndex devrait à mon sens être être abandonné avec les nouvelles versions d'Excel, d'autant que si mes souvenirs sont bons, c'est rouge et qu'on a en plus une constante VBA (vbRed) pour l'indiquer avec Color...]

Cordialement.

Salut Eric !

Bonjour Eric,

Oui la formule est en relatif, mais si la macro vient mettre la formule ET(AN28<>"";AN28<>"C") dans la MFC de la cellule active (disons AN22), la formule restera en AN28 ...

J'espère avoir répondu.

Merci d'être aussi prompt à répondre

Bonjour MFerrand,

Je pense que la réponse au dessus est un peu pour vous aussi.

En effet oui vous avez raison sur la rédaction (Je suis tout débutant sur les macro, personne ne m'a jamais montré).

Merci

Oui la formule est en relatif, mais si la macro vient mettre la formule ET(AN28<>"";AN28<>"C") dans la MFC de la cellule active (disons AN22), la formule restera en AN28 ...

Dans une MFC la formule affichée est toujours celle de la 1ère cellule de la plage où elle s'applique.

Teste et tu verras que c'est bon.

Eric, j'ai passé des heures à tester différentes combinaison de code, je t'ai fait un petit exemple dans Excel. Test le quand tu aura le temps, tout est indiqué dedans. Enfin si jamais tu ne comprend pas reviens vers moi.

Comme l'a dit Eric :

Dans une MFC la formule affichée est toujours celle de la 1ère cellule de la plage où elle s'applique.

Implique cellule supérieure gauche de la sélection = AN28

MFerrand, je ne pense pas que le problème vienne de là.

La formule de MFC arrive dans la cellule où je veux qu'elle aille, mais sans changer de référence, donc la MFC s'applique en fonction d'une autre cellule, ce n'est pas le résultat souhaité. Si tu as le temps regarde le document que j'ai posté un peu plus haut.

Merci.

ouille ! ouille !

C'est quoi ce code à la mords-moi... ! assorti de délire cyclothimique.

D'abord je n'ai pas besoin d'exécuter le code ! Bien qu'il me soit toujours pénible de lire du code enregistré, je le lis et cela suffit pour voir ce qu'il fait, toujours la même chose quoi que tu mettes, ce qui dénote que c'est toi qui ne sait pas très bien ce que tu fais.

Oui la formule est en relatif, mais si la macro vient mettre la formule ET(AN28<>"";AN28<>"C") dans la MFC de la cellule active (disons AN22), la formule restera en AN28 ...

Alors, ce constat est tout à fait évident ! Il n'y a rien d'étonnant à ce que la formule mise soit celle que tu as demandé de mettre !

Le problème n'est pas au niveau du code (même si à mettre à la poubelle), il est dans la définition de ce que tu veux faire, et dans un second temps dans la compréhension du comment le faire ! et 3e temps le cas échéant tu peux coder [à mon avis si coder en l'occurrence présente une utilité (mais je ne peux me prononcer dans ce fouillis tant qu'il n'est pas éclairci)], enregistrement exclu car ça pourra pas se faire ainsi.

Je te le laisse MFerrand ?

Suis un peu fatigué là et il est moins tard pour toi...

J'aime beaucoup ta franchise, au moins je vais avancer !

Alors oui pour la plupart des opérations j'ai enregistré, il n'y a que le bloc de la MFC que j'ai fais moi même.

Je voudrais seulement que les références de la formule (ET(AN28<>"";AN28<>"C")) s'adaptent à la cellule dans laquelle je vais l'insérer, si je la met dans la MFC de la cellule AN452 la formule de la MFC de cette cellule doit donner ET(AN452 <>"";AN452 <>"C"), alors j'ai essayer en lui mettant des formule en RC, mais la il bloque et ne l'insère même pas dans la MFC.

La on à la définition du ce que je veux faire non ? Je bloque sur le comment faire, je n'ai pas les outils qu'il faut !

Tu pense qu'il faut que je code différement ? Si oui comment ? Quelle technique ?

Pas à la poubelle quand même je ne pourrais pas faire mieux en si peu de temps, je suis un noob en programmation ! Il fait tous ce que j'ai envie sauf pour les MFC !


J'aime beaucoup ta franchise, au moins je vais avancer !

Alors oui pour la plupart des opérations j'ai enregistré, il n'y a que le bloc de la MFC que j'ai fais moi même.

Je voudrais seulement que les références de la formule (ET(AN28<>"";AN28<>"C")) s'adaptent à la cellule dans laquelle je vais l'insérer, si je la met dans la MFC de la cellule AN452 la formule de la MFC de cette cellule doit donner ET(AN452 <>"";AN452 <>"C"), alors j'ai essayer en lui mettant des formule en RC, mais la il bloque et ne l'insère même pas dans la MFC.

La on à la définition du ce que je veux faire non ? Je bloque sur le comment faire, je n'ai pas les outils qu'il faut !

Tu pense qu'il faut que je code différement ? Si oui comment ? Quelle technique ?

Pas à la poubelle quand même je ne pourrais pas faire mieux en si peu de temps, je suis un noob en programmation ! Il fait tous ce que j'ai envie sauf pour les MFC !

Je verrai ça demain, je suis comme Eric metropolitain .

D'abord, lorsqu'on veut coder on se réfère à la syntaxe des éléments qu'on utilise, et au premier chef, l'Aide sert à cela !

Cela évite d'écrire n'importe quoi, pour bêler ensuite que ça ne fonctionne pas... Evidemment ! (D'autant que parfois ça fonctionne mais ça donne un autre résultat ! )

Cela relève du simple bon sens. L'expérience montre d'ailleurs que plus on code, plus (et mieux) on utilise l'Aide. Le fait d'être néophyte n'en dispense pas car apprendre à s'en servir est un élément essentiel...

Ensuite en réfléchissant un peu, tu peux bien voir que ta méthode conceptuelle applique une MFC à une seule cellule à la fois, donc le caractère relatif ou absolu des références n'a plus strictement aucune incidence. De plus pour composer une telle formule conditionnelle s'appliquant à ta cellule active, il te faut l'adresse de cette cellule, donc la recueillir dans une variable de type String et composer ta formule en l'intercalant entre les fragments qui demeurent constants.

Mais si tu réfléchis un peu plus, tu pourrais considérer que tu ne serais pas très avancé avec plusieurs centaines de MFC... !!!

Qu'il serait peut-être plus judicieux qu'au fil de l'extension de ton tableau, tu reprennes la totalité de la plage d'application pour ne réintroduire qu'une MFC en éliminant la précédente. Et dans ce cas, ta formule ne varie plus ! car elle repose sur la cellule supérieure gauche de cette plage qui sera toujours la même, c'est la plage elle-même qui variera à chaque fois...

Mais ce n'est pas le seul problème, la fusion en est un autre dont tu ne tiens pas compte dans tes formules (les autres) et au demeurant, ce n'est d'ailleurs pas très clair, car tu mets une condition pour lancer l'opération qui est toujours vraie !

La clarification ne me paraît pas achevée !


Salut Eric ! Euh... je ne te remercie pas !

Suis un peu fatigué là et il est moins tard pour toi...

Là par contre, c'est l'inverse ! Je suis à l'est ! (3 heures de décalage en ce moment)

J'étais aussi un peu claqué (embouteillages que j'évite habituellement, mais quand la route est carrément coupée... ) Endormi plutôt vite mais réveillé par des crampes aux pieds : j'ai dû me lever et rester pour éviter qu'elles ne se relancent...

Ah... Elle tient pas mon excuse alors

Bon, je vais au dodo quand même !

Bonne nuit tout le monde

Bonjour, bonjour,

Je commence à utiliser l'aide alors, mais j'ai du mal à trouver ce que je veux dedans, ça viendra.

tu peux bien voir que ta méthode conceptuelle applique une MFC à une seule cellule à la fois, donc le caractère relatif ou absolu des références n'a plus strictement aucune incidence

Mais pourtant quand dans la fin de la macro j'ajoute la formule :

"=IF(RC[-6]=""C"",""conform"",""No conform"")"

dans une seule cellule, la formule reste bien relative. Mais le format R1C1 n'est pas digéré par la MFC.

il te faut l'adresse de cette cellule, donc la recueillir dans une variable de type String et composer ta formule en l'intercalant entre les fragments qui demeurent constants

Si j'ai bien compris il faut que je déclare l'adresse de ma cellule active dans une variable string :

Dim MyString As String
MyString = ActiveCell

Et qu'ensuite je remplace dans ma formule à intégrer dans la MFC :

With Selection.FormatConditions
        .Delete
        With .Add(xlExpression, "=ET(MyString<>"""";MyString<>""C"")")
             .Interior.ColorIndex = 3 
             .StopIfTrue = False
        End With
End With

Enfin en déclarant tout ça de façon correcte, car la je n'ose même pas faire le test tellement ça à l'air bancal, mais l'idée y est ?

tu pourrais considérer que tu ne serais pas très avancé avec plusieurs centaines de MFC... !!!

Pourquoi plusieurs centaines de MFC ?????

au fil de l'extension de ton tableau

En utilisation le tableau sera fixe, les données de la colonne bleu seront protégées comme tout le reste de la feuille, sauf pour la zone de saisie où la personne l'utilisant pourra entrer des valeurs ou un texte (d'ou la macro pour que le document s'adapte aux circonstances d'utilisation). En aucun cas la personne ne doit pouvoir modifier le document, sauf la zone de saisie avec les deux macros. Le document que j'ai placé en téléchargement n'est qu'un exemple pour que vous puissiez situer le problème et m'aider à le résoudre. Donc je pense que l'histoire de la plage de cellule n'est pas du tout adapté à ma problématique ...

Mes conditions sont les suivantes (dans la vraie macro) :

If Selection.Dependents <> 0 And Selection.Column = 40 And Selection.Cells.Count = 4 And Selection.Rows.Count = 1 Then
    If MsgBox("Continuer ?" & Chr(10) & "   " & Chr(10) & "NE PAS MODIFIER AILLEURS QUE ZONE DE SAISIE", vbYesNo + vbExclamation, "Attention") = vbYes Then

"Mes actions si conditions sont vraies"

End If
Else
MsgBox "Mauvaise sélection", vbOKOnly + vbCritical, "Fatal error (Erreur fatale)"
End If

Tout ça fonctionne très bien, il n'y a vraiment que cette histoire de relativité dans la MFC qui m'ennuie !!!

Je me répète !!

Qu'une formule soit en références relatives ou absolues (ou mixtes), tant que tu la mets dans une seule cellule, cela n'a aucune incidence.

Le problème est justement que tu opères cellule par cellule, mais bon ! C'est toi que cela regarde !

Tu es optimiste, tant mieux pour toi ! Mais il faut cesser de confondre Valeur et Adresse...

Cordialement.

Bonjour !

Mon code fonctionne tout comme je veux.

J'ai simplement déclaré des variable

t=ActiveCell.Adress

et je les aient insérés dans ma formule de la sorte

" & t & "

C'est grace à toi que j'ai trouvé cette solution je n'avais pas pensé aux variables ! Merci

C'est peut être balourd, mal fait, tout ce que tu veux mais je suis payé à trouver des solutions. Personne n'ira mettre le nez dedans tant que ça fonctionne.

Après si tu veux me faire évoluer, et que tu as le temps, je t’envoie mes deux codes demain et tu me dis ce qu'il aurais fallut faire, je suis preneur !

Bonne soirée.

???????????

Rechercher des sujets similaires à "ajouter formule reference relatives mfc via vba"