Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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? ...?


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

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…