Syntaxe : appartenance et calcul

Mattharm

XLDnaute Occasionnel
Bonjour à tous,

J'aurais besoin de comparer deux chiffres par une soustraction en prenant en compte une intersection de valeurs.

Par exemple la série 10,11,12 --> à exclure.

Si j'ai A =14 et B = 7 j'aimerais que A-B me retourne 4.
J'aimerais donc développer une boucle de type :

Code:
if {10,11,12} apppartient à {B,A} then
Resultat = A-B-3

Merci d'avance,
Mattharm
 

Excel-lent

XLDnaute Barbatruc
Re : Syntaxe : appartenance et calcul

Bonsoir Mattharm,

J'ai pas tout compris! Tu peux détailler? Par exemple en joignant un petit fichier excel avec :
-> plusieurs cas de figure
-> les résultats attendus et expliquer pourquoi et comment tu arrive à ce résultat
-> où se trouve tes données
-> la façon sous laquelle tu veux le résultat? Dans une cellule? Une Boite de dialogue? ...?

Mattharm à dit:
Par exemple la série 10,11,12 --> à exclure.

Si j'ai A =14 et B = 7 j'aimerais que A-B me retourne 4.
J'aimerais donc développer une boucle de type :

Code:
if {10,11,12} apppartient à {B,A} then
Resultat = A-B-3

A = 14 -> n'appartient pas à la série : 10,11,12
B=7 -> n'appartient pas à la série : 10,11,12

Pourtant pour arriver à A-B = 4 il faut faire : A-B-3 (comme si A et B appartenait à la série indiqué)

D'autres questions :
-> que faut-il faire lorsqu'il n'y a que A ou B qui appartient à la série : 10,11,12
-> que faut-il faire lorsque ni A ni B n'appartient à la série : 10,11,12
-> où se trouve ta liste dans ton fichier.
-> tu veux la réponse via une formule uniquement? Tu es ouvert aux solutions en VBA?
-> ...?

A te lire

Bonne soirée
 

Mattharm

XLDnaute Occasionnel
Re : Syntaxe : appartenance et calcul

Bonsoir Excel-lent,

Ci joint le fichier xls.
J'aimerais développer une solution vba.

Je me débrouille pour l'intégration dans mon code. Il me manque juste la notion pour le faire ;)


Merci pour le coup de main.

Mattharm.
 

Pièces jointes

  • Test.xls
    22.5 KB · Affichages: 71
  • Test.xls
    22.5 KB · Affichages: 75
  • Test.xls
    22.5 KB · Affichages: 67

Excel-lent

XLDnaute Barbatruc
Re : Syntaxe : appartenance et calcul

Bonsoir Mattharm,

Merci pour la pièce jointe, c'est tout de suite plus clair :)

Et plus rapide pour nous pour trouver la solution adéquat.

-> prend le fichier mis en ligne
-> clic sur "Alt" + "F11"
-> sur la Feuil1 colle la macro ci-dessous :

Code:
Sub Proposition1()

Dim ligne As Long
Dim AppartientSérie As Byte
Dim AB As Long

Range("F1") = "Résultat obtenu par la macro"

For ligne = 2 To 39
    AppartientSérie = 0
    
[COLOR="Green"]    'Si A < B alors ...[/COLOR]
    If Cells(ligne, 1) <= Cells(ligne, 2) Then
    
        For AB = Cells(ligne, 1) To Cells(ligne, 2)
            If AB = 10 Or AB = 11 Or AB = 12 Then
                AppartientSérie = AppartientSérie + 1
            End If
        
        Next AB
    
        Cells(ligne, 6) = Cells(ligne, 1) - Cells(ligne, 2) + AppartientSérie
    End If

[COLOR="Green"]    'Si A > B alors ...[/COLOR]
    If Cells(ligne, 1) > Cells(ligne, 2) Then
    
        For AB = Cells(ligne, 2) To Cells(ligne, 1)
            If AB = 10 Or AB = 11 Or AB = 12 Then
                AppartientSérie = AppartientSérie + 1
            End If
        
        Next AB
    
        Cells(ligne, 6) = Cells(ligne, 1) - Cells(ligne, 2) - AppartientSérie
    End If

Next ligne

End Sub

Il est possible de faire une macro plus simple, plus courte, mais au moins elle fonctionne à la perfection (que j'ai pu tester grâce à ton fichier - merci encore - j'ai ainsi gagné beaucoup de temps).

Cela correspond à tes attentes?

A te lire

Cordialement
 

Tibo

XLDnaute Barbatruc
Re : Syntaxe : appartenance et calcul

Bonsoir,

Bien que ce soit le VBA qui soit privilégié dans le cas présent, une solution formule :

Code:
=MAX(A1:B1)-MIN(A1:B1)-SOMMEPROD((ESTNUM(EQUIV({10;11;12};LIGNE(INDIRECT(
MIN(A1:B1)&":"&MAX(A1:B1)));0))*1))
@+
 

Mattharm

XLDnaute Occasionnel
Re : Syntaxe : appartenance et calcul

Bonsoir,

Ok pour la solution de Excel-Lent. Je n'avais pas pensé à la boucle incrémantante.

Par contre Tibo.... :( j'ai un peu plus de mal à suivre :
1) On cherche le min & le max entre la colonne A et B
2) On enlève la SOMMEPROD de je sais pas quoi... ^^
je ne comprends pas la deuxième partie du code...

Est il possible de le modifier pour ne pas tester le min&max et réaliser toujours A-B ?

Merci à vous deux.


Mattharm.
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Syntaxe : appartenance et calcul

Bonsoir,

Une autre solution VBA avec cette fonction Macro à placer dans un Module :

Code:
Function D(A As Long, B As Long) As Long
Dim tablo
tablo = Array(10, 11, 12)
If A > B Then
  While A > B
    B = B + 1
    If IsError(Application.Match(B, tablo, o)) Then D = D + 1
  Wend
Else
  While A < B
    B = B - 1
    If IsError(Application.Match(B, tablo, o)) Then D = D - 1
  Wend
End If
End Function

Entrer cette formule en D2 :

=D(A2;B2)

A+
 

Pièces jointes

  • Test(1).xls
    29.5 KB · Affichages: 51
  • Test(1).xls
    29.5 KB · Affichages: 60
  • Test(1).xls
    29.5 KB · Affichages: 50

ROGER2327

XLDnaute Barbatruc
Re : Syntaxe : appartenance et calcul

Bonsoir à tous
Code:
[COLOR="DarkSlateGray"][B]=A2-B2-(MAX(10;MIN(A2;B2))<=MIN(12;MAX(A2;B2)))*SIGNE(A2-B2)*(1+MIN(12;MAX(A2;B2))-MAX(10;MIN(A2;B2)))[/B][/COLOR]

Code:
[COLOR="DarkSlateGray"][B]Function DD&(a&, b&)
Application.Volatile
   With Application.WorksheetFunction
      DD = a - b + (.Max(10, .Min(a, b)) <= .Min(12, .Max(a, b))) * Sgn(a - b) * (1 + .Min(12, .Max(a, b)) - .Max(10, .Min(a, b)))
   End With
End Function[/B][/COLOR]
Syntaxe : =DD(A2;B2)

Sans certitude aucune...​
ROGER2327
#3163
 

Tibo

XLDnaute Barbatruc
Re : Syntaxe : appartenance et calcul

Mattharm,

Les MIN et MAX étaient simplement destinés à gérer le cas où A1 aurait été inférieur à B1. Si tel ne devait jamais être le cas, on peut effectivement simplifier la formule qui devient :

Code:
=A1-B1-SOMMEPROD((ESTNUM(EQUIV({10;11;12};LIGNE(INDIRECT(A1&":"&B1));0))*1))
La partie SOMMEPROD :

On génère d'abord une matrice de nombres LIGNE(INDIRECT(A1&":"&B1)) qui va de A1 à B1

Ensuite, avec EQUIV, on va chercher si les nombres {10;11;12} sont présent dans cette matrice.

Cette fonction va retourner #N/A ou une valeur numérique si 10, 11 ou 12 sont trouvés.

Avec ESTNUM associé à EQUIV, on va déterminer le nombre de valeurs trouvées, c'est-à-dire le nombre de fois où 10, 11 ou 12 ont été trouvés.

Reste à déduire de A1-B1 ce résultat.

Voilou pour la tentative d'explication sur le pourquoi du comment.

@+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Syntaxe : appartenance et calcul

Bonjour le fil, le forum,

Une fonction macro beaucoup plus logique que celle que j'avais proposée :

Code:
Function D(A As Long, B As Long) As Long
Dim tablo, i As Byte, n As Byte
tablo = Array(10, 11, 12)
For i = 0 To UBound(tablo)
If (tablo(i) - A) * (tablo(i) - B) < 0 Then n = n + 1 'si entre A et B
Next
D = A - B + n * IIf(A > B, -1, 1)
End Function

A+
 

Pièces jointes

  • Test(2).xls
    30 KB · Affichages: 53
  • Test(2).xls
    30 KB · Affichages: 57
  • Test(2).xls
    30 KB · Affichages: 55

job75

XLDnaute Barbatruc
Re : Syntaxe : appartenance et calcul

Re,

Une formule avec SOMMEPROD également en D2 :

Code:
=A2-B2+SOMMEPROD((({10;11;12}-A2)*({10;11;12}-B2)<0)*(-1)^(A2>B2))

Elle fait exactement la même chose que la fonction macro de mon précédent post.

A+
 

Pièces jointes

  • Test(3).xls
    30.5 KB · Affichages: 47
  • Test(3).xls
    30.5 KB · Affichages: 45
  • Test(3).xls
    30.5 KB · Affichages: 45

Mattharm

XLDnaute Occasionnel
Re : Syntaxe : appartenance et calcul

Bonjour,

Merci à tous pour votre aide.
J'ai fait un mix des réponses pour sortir une fonction vba qui va bien.

La formule vba augmente grandement la vitesse de mise à jour comparée à la formule excel en cellule.

;)
Mattharm.
 

Discussions similaires

Statistiques des forums

Discussions
312 389
Messages
2 087 892
Membres
103 673
dernier inscrit
FmZoner