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

Syntaxe : appartenance et calcul

  • Initiateur de la discussion Initiateur de la discussion Mattharm
  • 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 !

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

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
 
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))
@+
 
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:
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

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
 
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:
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

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

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.
 
- 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
4
Affichages
281
Réponses
25
Affichages
2 K
G
Réponses
3
Affichages
775
L
Réponses
12
Affichages
1 K
LeSaintKebab
L
Réponses
12
Affichages
1 K
A
Réponses
1
Affichages
1 K
Astragor
A
P
Réponses
4
Affichages
1 K
printemps 2021
P
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…