opérateurs arithmétiques et de comparaison sous forme de variable

  • Initiateur de la discussion Initiateur de la discussion pascal82
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

pascal82

XLDnaute Occasionnel
Bonjour à toutes et à tous,

Est-il possible de mettre les opérateurs arithmétiques et de comparaison sous forme de variable ?
Je dois déterminer une formule qui me permet de discriminer 2 séries de données. C’est pourquoi à partir d’une formule de base je fais évoluer les opérateurs arithmétiques et de comparaison afin de déterminer la plus performante.

Exemple avec les opérateurs +&– et >&< :
1° test =SI(ET((B1-C1)<(D1-E1);A1=1);1;SI(ET((B1-C1)<(D1-E1);A1=0);2;""))
2° test =SI(ET((B1+C1)<(D1-E1);A1=1);1;SI(ET((B1+C1)<(D1-E1);A1=0);2;""))
3° test =SI(ET((B1+C1)<(D1-E1);A1=1);1;SI(ET((B1-C1)<(D1+E1);A1=0);2;""))
4° test =SI(ET((B1-C1)<(D1-E1);A1=1);1;SI(ET((B1-C1)<(D1+E1);A1=0);2;""))
5° test =SI(ET((B1-C1)>(D1-E1);A1=1);1;SI(ET((B1-C1)>(D1-E1);A1=0);2;""))
6° test =SI(ET((B1+C1)>(D1-E1);A1=1);1;SI(ET((B1+C1)>(D1-E1);A1=0);2;""))
7° test =SI(ET((B1+C1)>(D1-E1);A1=1);1;SI(ET((B1-C1)>(D1+E1);A1=0);2;""))
8° test =SI(ET((B1-C1)>(D1-E1);A1=1);1;SI(ET((B1-C1)>(D1+E1);A1=0);2;""))

Merci par avance
 

Pièces jointes

Re : opérateurs arithmétiques et de comparaison sous forme de variable

Bonjour,
je ne suis pas sur d'avoir compris mais si utilise des variables dim 1°_test as string etc... cela pourrait peut etre fonctionner mais je n'est pas tester
A+.
 
Re : opérateurs arithmétiques et de comparaison sous forme de variable

Bonjour,

Merci pour ta réponse mais maintenant c’est moi qui ne comprend pas, si tu veux bien donne moi un bout de code pour débuter.
Pour résumer je veux :
1 variable pour les 4 opérateurs arithmétiques : +, –, * et /
1 variable pour les 2 opérateurs de comparaison : > et <

Nota : j’ai essayé par les « objets »mais problème de syntaxe dans la formule

Cordialement
 
Re : opérateurs arithmétiques et de comparaison sous forme de variable

Bonjour à tous,

Pas tout compris non plus, mais peut-être que ceci t'aidera:

Code:
Function GetFormule(Optional op1 As String = "+", Optional op2 As String = "<") As String
Const Base = "=IF(AND((B1@C1)?(D1@E1),A1=1),1,IF(AND((B1@C1)?(D1@E1),A1=0),2,""))"
GetFormule = Replace(Replace(Base, "@", op1), "?", op2)
End Function

Je ne l'ai pas fait en R1C1 pour ne pas avoir de formule à rallonge mais tu peux

Utilisation:

Code:
'Avec les valeurs par défaut "+" et "<"
Range("A1").Formula= GetFormule()
 
Range("A1").formula= GetFormule("-",">")
'Ou
Range("A1").Formula=GetFormule("-","<")
'Etc..

A+
 
Re : opérateurs arithmétiques et de comparaison sous forme de variable

Bonjour Hasco,Misange,Pascal82,

Bien que Hasco m'a encore étonné d'utilisé le mot "optional" dans une fonction (mot que j'ignorai dans vb) je pense que ce que tu veux est difficile à réaliser et a mon sens d'aucune utilité car tu veux 1 variable pour 4 critères différent et une autre pour deux critères
je pensé un moment a utilisé l'énumération mais si j'analyse ton exemple de 2 test = ... tu utilise a la fois l 'opérateur "+" et "-" dans la même formule
alors comment veux tu en utilisant donc comment veux tu utilisé la même variable pour deux critères différents.

Ne te vexe pas dans le fait que je dise aucune utilité car pour moi les opérateurs arithmétiques sont en quelques sortes déjà des variables

je vais me penché sur le problème mais je ne suis pas sur de pouvoir t'aider

Au plaisir.
 
Re : opérateurs arithmétiques et de comparaison sous forme de variable

Je dois déterminer une formule qui me permet de discriminer 2 séries de données. C’est pourquoi à partir d’une formule de base je fais évoluer les opérateurs arithmétiques et de comparaison afin de déterminer la plus performante.


1° test =SI(ET((B1-C1)<(D1-E1);A1=1);1;SI(ET((B1-C1)<(D1-E1);A1=0);2;""))
2° test =SI(ET((B1+C1)<(D1-E1);A1=1);1;SI(ET((B1+C1)<(D1-E1);A1=0);2;""))
3° test =SI(ET((B1+C1)<(D1-E1);A1=1);1;SI(ET((B1-C1)<(D1+E1);A1=0);2;""))
4° test =SI(ET((B1-C1)<(D1-E1);A1=1);1;SI(ET((B1-C1)<(D1+E1);A1=0);2;""))
5° test =SI(ET((B1-C1)>(D1-E1);A1=1);1;SI(ET((B1-C1)>(D1-E1);A1=0);2;""))
6° test =SI(ET((B1+C1)>(D1-E1);A1=1);1;SI(ET((B1+C1)>(D1-E1);A1=0);2;""))
7° test =SI(ET((B1+C1)>(D1-E1);A1=1);1;SI(ET((B1-C1)>(D1+E1);A1=0);2;""))
8° test =SI(ET((B1-C1)>(D1-E1);A1=1);1;SI(ET((B1-C1)>(D1+E1);A1=0);2;""))

Re,
Pourquoi ne pas faire le calcul pour chaque cas de 1° à 8° et le stocker dans un tableau qui pourra te permettre de faire la comparaison des 8 résultats pour en sortir la plus performante
Ainsi tu pourra coller la formule dans la cellule désignée.

ps: je suis occupé de bosser dessus mais j'aimerai connaitre le résultat le plus performant doit correspondre a quoi pour pouvoir continuer le code.

Code:
Sub MacroTestPage2()

Dim heure As Long, minute As Long, seconde As Long
Dim Deb As Currency
Deb = Timer

'Application.ScreenUpdating = False
   
Range("Q1:AE6300").ClearContents

Dim A As Integer
Dim B As Integer
Dim C As Integer
Dim D As Integer
Dim calcul_divers(7)
Dim i, j As Byte
Dim valeur_stocker, valeur_precedente As Double

For A = -15 To -5
For B = (A + 1) To -4
For C = (B + 1) To -3
For D = (C + 1) To -2

' formule Excel en Q1
' Attention il faut verifier que j'ai mis les bonnes formules
calcul_divers(0) = "=IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(1) = "=IF(AND((RC[" & A & "]+RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]+RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(2) = "=IF(AND((RC[" & A & "]+RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]+RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(3) = "=IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]+RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(4) = "=IF(AND((RC[" & A & "]-RC[" & B & "])>(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])>(RC[" & C & "]-RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(5) = "=IF(AND((RC[" & A & "]+RC[" & B & "])>(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]+RC[" & B & "])>(RC[" & C & "]-RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(6) = "=IF(AND((RC[" & A & "]+RC[" & B & "])>(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])>(RC[" & C & "]+RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(7) = "=IF(AND((RC[" & A & "]-RC[" & B & "])>(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])>(RC[" & C & "]+RC[" & D & "]),RC[-16]=0),2,""""))"

For i = LBound(calcul_divers) To UBound(calcul_divers)
Range("Q1").FormulaR1C1 = calcul_divers(i) '"=IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=0),2,""""))"
'Application.ScreenUpdating = True
on error resume next
valeur_precedente = Range("q1").Value
'Application.ScreenUpdating = False
'ici mettre la bonne comparaison
If valeur_precedente > valeur_stocker Then valeur_stocker = Range("q1").Value: j = i
Next
Range("Q1").FormulaR1C1 = calcul_divers(j)

Range("Q1").AutoFill Destination:=Range("Q1:Q6300"), Type:=xlFillDefault

Range("V2").Formula = "=CountIf(Q1:Q6300,1)"
Range("V3").Formula = "=CountIf(Q1:Q6300,2)"
Range("V1").Formula = "=IF((V3+V2)=0,1,(100*V2)/(V3+V2))"
Range("V4").Formula = "=(V3+V2)"

       'Evaluation et copie des resultats
       If Range("V1").Value = Range("AA1").Value And Range("V4").Value > 100 Then
           Range("AA1000").End(xlUp)(4).Resize(4, 1).Value = Range("V1:V3").Value
                End If
                
       If Range("V1").Value = Range("AB1").Value And Range("V4").Value > 100 Then
           Range("AB1000").End(xlUp)(4).Resize(4, 1).Value = Range("V1:V3").Value
                End If
                
       If Range("V1").Value = Range("AC1").Value And Range("V4").Value > 100 Then
           Range("AC1000").End(xlUp)(4).Resize(4, 1).Value = Range("V1:V3").Value
                End If
                
       If Range("V1").Value = Range("AD1").Value And Range("V4").Value > 100 Then
           Range("AD1000").End(xlUp)(4).Resize(4, 1).Value = Range("V1:V3").Value
                End If
                
       If Range("V1").Value > Range("AA1").Value And Range("V4").Value > 100 Then
                Range("AB1:AD1000").Value = Range("AA1:AC1000").Value
                Range("AA1:AA1000").ClearContents
                Range("AA1:AA3").Value = Range("V1:V3").Value
                Range("W1") = A
                Range("W2") = B
                Range("W3") = C
                Range("W4") = D
                End If
Next D
Next C
Next B
Next A

  heure = (Timer - Deb) \ 3600
  minute = ((Timer - Deb) - heure * 3600) \ 60
  seconde = (Timer - Deb) - (heure * 3600) - minute * 60
  Range("S1") = heure & " : " & minute & ":" & seconde
  
       'ActiveWorkbook.Save
             Application.ScreenUpdating = True
             
End Sub
pour exemple voir les commentaires.




A+
 
Dernière édition:
Re : opérateurs arithmétiques et de comparaison sous forme de variable

Bonjour à tous,

Si l'on veut tester (durée d'exécution ?) une formule avec divers opérateurs, c'est bien simple.

L'évaluer avec Evaluate et faire des boucles :

Code:
Sub TestOperateurs()
Dim op$, i As Byte
op = "+-*/&<>" 'liste des opérateurs à tester
For i = 1 To 7
  Calcul Mid(op, i, 1)
Next
End Sub

Sub Calcul(op$)
Dim t#, i&, resu
t = Timer
For i = 1 To 100000 'à adapter
  resu = Evaluate("=1000" & op & "2.5") 'formule que l'on veut, à adapter
Next
MsgBox "Opérateur " & op & " : " & Format(Timer - t, "0.00") & " s"
End Sub
A+
 
Dernière édition:
Re : opérateurs arithmétiques et de comparaison sous forme de variable

Re,
bonjour Job75,
il est évident que l'éxecution du code est long "environ 6:30 minutes" du fait que je passe par la cellule Q1, il faut pour y remédier travailler autrement pour le calcul je suis occuper dessus.

je te laisse vérifier si le résultat souhaité est correct je suis passé à 13 secondes en changeant l'odre du code.
Code:
Sub MacroTestPage2()

Dim heure As Long, minute As Long, seconde As Long
Dim Deb As Currency
Deb = Timer

'Application.ScreenUpdating = False
   
Range("Q1:AE6300").ClearContents

Dim A As Integer
Dim B As Integer
Dim C As Integer
Dim D As Integer
Dim calcul_divers(7)
Dim i, j As Byte
Dim valeur_stocker, valeur_precedente As Double

For A = -15 To -5
For B = (A + 1) To -4
For C = (B + 1) To -3
For D = (C + 1) To -2

' formule Excel en Q1
' Attention il faut verifier que j'ai mis les bonnes formules
calcul_divers(0) = "=IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(1) = "=IF(AND((RC[" & A & "]+RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]+RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(2) = "=IF(AND((RC[" & A & "]+RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]+RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(3) = "=IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]+RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(4) = "=IF(AND((RC[" & A & "]-RC[" & B & "])>(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])>(RC[" & C & "]-RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(5) = "=IF(AND((RC[" & A & "]+RC[" & B & "])>(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]+RC[" & B & "])>(RC[" & C & "]-RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(6) = "=IF(AND((RC[" & A & "]+RC[" & B & "])>(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])>(RC[" & C & "]+RC[" & D & "]),RC[-16]=0),2,""""))"
calcul_divers(7) = "=IF(AND((RC[" & A & "]-RC[" & B & "])>(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])>(RC[" & C & "]+RC[" & D & "]),RC[-16]=0),2,""""))"

For i = LBound(calcul_divers) To UBound(calcul_divers)
Range("Q1").FormulaR1C1 = calcul_divers(i) '"=IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=1),1,IF(AND((RC[" & A & "]-RC[" & B & "])<(RC[" & C & "]-RC[" & D & "]),RC[-16]=0),2,""""))"
'Application.ScreenUpdating = True
On Error Resume Next
valeur_precedente = Range("q1").Value

'ici mettre la bonne comparaison
If valeur_precedente > valeur_stocker Then valeur_stocker = Range("q1").Value: j = i
Next

Next D
Next C
Next B
Next A
Application.ScreenUpdating = False
Range("Q1").FormulaR1C1 = calcul_divers(j)

Range("Q1").AutoFill Destination:=Range("Q1:Q6300"), Type:=xlFillDefault

Range("V2").Formula = "=CountIf(Q1:Q6300,1)"
Range("V3").Formula = "=CountIf(Q1:Q6300,2)"
Range("V1").Formula = "=IF((V3+V2)=0,1,(100*V2)/(V3+V2))"
Range("V4").Formula = "=(V3+V2)"

       'Evaluation et copie des resultats
       If Range("V1").Value = Range("AA1").Value And Range("V4").Value > 100 Then
           Range("AA1000").End(xlUp)(4).Resize(4, 1).Value = Range("V1:V3").Value
                End If
                
       If Range("V1").Value = Range("AB1").Value And Range("V4").Value > 100 Then
           Range("AB1000").End(xlUp)(4).Resize(4, 1).Value = Range("V1:V3").Value
                End If
                
       If Range("V1").Value = Range("AC1").Value And Range("V4").Value > 100 Then
           Range("AC1000").End(xlUp)(4).Resize(4, 1).Value = Range("V1:V3").Value
                End If
                
       If Range("V1").Value = Range("AD1").Value And Range("V4").Value > 100 Then
           Range("AD1000").End(xlUp)(4).Resize(4, 1).Value = Range("V1:V3").Value
                End If
                
       If Range("V1").Value > Range("AA1").Value And Range("V4").Value > 100 Then
                Range("AB1:AD1000").Value = Range("AA1:AC1000").Value
                Range("AA1:AA1000").ClearContents
                Range("AA1:AA3").Value = Range("V1:V3").Value
                Range("W1") = A
                Range("W2") = B
                Range("W3") = C
                Range("W4") = D
                End If
  heure = (Timer - Deb) \ 3600
  minute = ((Timer - Deb) - heure * 3600) \ 60
  seconde = (Timer - Deb) - (heure * 3600) - minute * 60
  Range("S1") = heure & " : " & minute & ":" & seconde
  
       'ActiveWorkbook.Save
             Application.ScreenUpdating = True
             
End Sub
😱

A+
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
1
Affichages
726
Retour