VBA écrire directement le résultat d'une formule

Bonsoir à tous,

Comment remplacer le code formule par un code résultat direct ?

aujourd'hui j'ai çà qui écrit une formule:

    Plg.FormulaR1C1 = "=IF(SUMPRODUCT((R[1]C[-17]:R[10]C[-17]=RC[-17])*(R[1]C[-11]:R[10]C[-11]+R[1]C[-7]:R[10]C[-7]=RC[-11]+RC[-7]+TIME(R1C13,0,0))+(SUMPRODUCT((R[-10]C[-17]:R[-1]C[-17]=RC[-17])*(R[-10]C[-11]:R[-1]C[-11]+R[-10]C[-7]:R[-1]C[-7]=RC[-11]+RC[-7]-TIME(R1C13,0,0)))))>0, 1, 0)"

J'essaye d'obtenir directement le résultat de la même formule:

Cel=WorksheetFunction.if(SUMPRODUCT((cel.offset(1,-17):cel.offset(10,-17)=cel.offset(0,-17))*(cel.offset(1,-11):cel.offset(10,-11)+cel.offset(1,-7):cel.offset(10,-7)=cel.offset(0,-11)+cel.offset(0,-7)+time(range("$m$1"),0,0))+(SUMPRODUCT((cel.offset(-10,-17):cel.offset(-1,-17)=cel.offset(0,-17))*(cel.offset(-10,-11):(cel.offset(-1,-11)+cel.offset(-10,-7):cel.offset(-1,-7)=cel.offset(-10,-11)+cel.offset(0,-7)-time(range($m$1,0,0)))))>0,1,0)

La syntaxe n'est pas bonne,

pourriez-vous m'orienter sur le comment faire, même sur un exemple + simple ?

Merci et bonne soirée

Claude.

Bonsoir Claude,

est-ce que tu pourrais nous donner un peu plus de viandes, un fichier exemple ou le code dans son ensemble.

au lieu d'utiliser WorksheetFunction.if, tu pourrais utiliser une structure IF du genre

Si Condition1 et Condition2 alors

Résultat1

Sinon

Résultat2

Fin si

Bonsoir forum,

Voici un code qui marche Claude :

Cel = IIf(WorksheetFunction.SumProduct(Range("D1:E2"), Range("D3:E4")) = 0, "zéro", "pas zéro")

Par contre, la formule étant très simplifiée, je ne sais pas si c'est adaptable à ton cas.

ReBonsoir,

essaie cette formule:

Cel = WorksheetFunction.if((SumProduct(Cel.Offset(1, -17) & ":" & Cel.Offset(10, -17)) = Cel.Offset(0, -17)) * (Cel.Offset(1, -11) & ":" & Cel.Offset(10, -11) + Cel.Offset(1, -7) & ":" & Cel.Offset(10, -7) = Cel.Offset(0, -11) + Cel.Offset(0, -7) + Time(Range("$m$1"), 0, 0)) + (SumProduct((Cel.Offset(-10, -17) & ":" & Cel.Offset(-1, -17) = Cel.Offset(0, -17)) * (Cel.Offset(-10, -11) & ":" & (Cel.Offset(-1, -11) + Cel.Offset(-10, -7) & ":" & Cel.Offset(-1, -7) = Cel.Offset(-10, -11) + Cel.Offset(0, -7) - Time(Range("$m$1", 0, 0)))))) > 0, 1, 0)

j'ai mis les des guillemets pour encadrer les : et $m$1. C'est une formule assez dur à vérifier chez moi donc essaie ça et dis moi si ça marche. Pour plus de lisibilité tu devrais par contre essayé avec un IF vba est faire tes tests à part pour mieux t'y retrouver :

Test1: SumProduct(Cel.Offset(1, -17) & ":" & Cel.Offset(10, -17)) = Cel.Offset(0, -17)) ...
Test2: ...

If Test1 + Test2 >0
 cel = 1
else
 cel = 0
end if

re,

merci à vous deux, je le sent bien ton code Math,

je finis ma soupe et je teste,

c'est en rapport avec ce lien:

https://www.excel-pratique.com/forum/viewtopic.php?t=11723

à tout à l'heure

Claude.

re,

J'ai préparé un extrait de fichier pour tester avec le code de Math

çà coince sur Offset ,

https://www.excel-pratique.com/~files/doc2/Chevreuil_test.xls

Amicalement

Claude.

Bonsoir,

Voici une solution.

Je ne sais pas si cela peut te convenir : Fichier

Bonjour à tous,

Merci readi, ton code à le gros avantage de rendre claire une formule en la décomposant.

Je l'ai tester sur le fichier réel (boucle sur 200300 lignes)

çà marche mais le temps de traitement est + long ( environ 80 secondes contre 34 dans

ma version actuelle).

Je pense que tout les Set de préparation ralentissent,

La formule dans le style de celle Math, serait + directe, mais difficile à écrire !

encore merci

Amicalement

Claude.

édit: on ne met la formule que dans les cellules préalablement filtrées avec

le critère MOD = $M$1 (voir U2)

1test-2.xlsx (12.89 Ko)

Bonjour à tous,

Claude, 46 secondes de plus c'est très acceptable, surtout que la fonction de readi est beaucoup plus lisible ( Autant de paranthèse c'est étoudissant ). Si jamais vous avez des changements à faire sur la fonction dans l'avenir, la perte de 46 secondes va largement être compensé par la rapidité à laquelle vous allez pouvoir modifier la fonction.

Bonjour à tous,

Math, si j'ai ouvert ce fil, c'était pour gagner sur le temps de traitement, non pour en perdre,

ne serait-ce qu'une seconde.

Autant resté sur la formule écrite (.Formula="------etc..)

Dommage que tu n'ai pas poursuivi sur ton idée.

En tout cas merci à toi et à readi

Amicalement

Claude.

Bonjour Claude,

je te reviens avec t'as formule, ça ne marche toujours pas mais ça avance.

Cel = Evaluate("If(SumProduct((Cel.Offset(1, -17).Address & "":"" & Cel.Offset(10, -17).Address = Cel.Offset(0, -17)) * (Cel.Offset(1, -11).Address & "":"" & Cel.Offset(10, -11).Address + Cel.Offset(1, -7).Address & "":"" & Cel.Offset(10, -7).Address = Cel.Offset(0, -11).Address + Cel.Offset(0, -7).Address + Time(Range(""$m$1""), 0, 0)) + (.SumProduct((Cel.Offset(-10, -17).Address & "":"" & Cel.Offset(-1, -17).Address = Cel.Offset(0, -17).Address) * (Cel.Offset(-10, -11).Address & "":"" & (Cel.Offset(-1, -11).Address + Cel.Offset(-10, -7).Address & "":"" & Cel.Offset(-1, -7).Address = Cel.Offset(-10, -11).Address + Cel.Offset(0, -7).Address - Time(Range(""$m$1""), 0, 0)))))) > 0, 1, 0)")

La formule fonctionne mais elle retour #Valeur comme résultat. Il faudrait tester si les valeurs prises dans la formule sont tous bonne. Peut-être evaluer la formule en plusieur partie et ensuite tout regroupé. J'ai ajouté dans cette formule .address après les cel.offset pour faire référence au adresse de cellule et non au valeur, ça bloquait les sumproduct, et j'ai utilisé evaluate pour calculer le tout.

En espérant que ça t'aide un peu

Bonsoir à tous,

Merci Math, laisse tomber, c'est trop complexe à mettre en place et à vérifier.

mon idée était sans doute une mauvaise idée !

Je mets le fil en résolu, mais sait t-on jamais...

Amicalement

Claude.

Bonjour à tous,

Finalement, j'ai réussi à écrire cette formule en VBA

1) En formule

2) En Dur

Conclusion: aucun gain de temps de traitement, au contraire par rapport à FormulaR1C1 = "=etc…

testé sur un fichier de 200300 lignes.

Fichier raccourci:

https://www.excel-pratique.com/~files/doc2/Chevreuil_test2.xls

Merci readi, Math et vba-new de m'avoir orienté.

Amicalement

Claude.

Rechercher des sujets similaires à "vba ecrire directement resultat formule"