XL 2010 Conditions qui ne passent pas

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 !

cathodique

XLDnaute Barbatruc
Bonjour 🙂,

Je m'en remets à vous pour un problème.
D'une BD, je voudrais totaliser des comptes en colonne C mais en excluant les comptes commençant par 88 ou 99.
J'ai beau essayer ça ne passe pas. Les comptes 88 et 99 sont toujours présents dans le tableau final.
VB:
Option Explicit

Sub test()
    Dim d As Object, TbRes(), tbd(), dl As Long, ligne As Long, clé, lig As Integer
    Dim BD As Worksheet, col As Byte
    Set d = CreateObject("Scripting.Dictionary")
    Set BD = Sheets("BD")

    Application.ScreenUpdating = False

    ''//*********************************************************
    tbd = BD.Range("A2:L" & BD.Cells(Rows.Count, 1).End(xlUp).Row).Value2

    'totalisation par compte
    ReDim TbRes(1 To UBound(tbd), 1 To 6)
    For ligne = 1 To UBound(tbd)
        clé = tbd(ligne, 3)
        If Left(clé, 2) <> 88 Or Left(clé, 2) <> 99 Then '**condition qui pose problème
            If d.exists(clé) Then
                lig = d(clé)
            Else
                d(clé) = d.Count + 1
                lig = d.Count  ' index
                TbRes(lig, 1) = tbd(ligne, 3)
                TbRes(lig, 2) = tbd(ligne, 4)
                TbRes(lig, 4) = tbd(ligne, 10)
                TbRes(lig, 5) = tbd(ligne, 11)
            End If
            col = IIf(tbd(ligne, 5) = "Dépenses", 6, 7)
            TbRes(lig, 3) = TbRes(lig, 3) + tbd(ligne, col)
        End If
    Next ligne

    With Feuil2
        .Cells.ClearContents
        .[A1].Resize(UBound(TbRes), UBound(TbRes, 2)) = TbRes
    End With
    Application.ScreenUpdating = True
    '
    MsgBox "terminé"
Set BD = Nothing: Set d = Nothing: Erase tbd: Erase TbRes

End Sub

En vous remerciant par avance.
 

Pièces jointes

Solution
bonjour @cathodique
l'erreur que tu fait est simple
If Left(clé, 2) <> 88 or Left(clé, 2) <> 99 Then 'ici

If Left(clé, 2) <> 88 And Left(clé, 2) <> 99 Then 'ici

je te donne MA règle d'or
quand tu utilise des operations logiques(and, or ,xor) avec des operateurs"<>"
NE JAMAIS UTILISER OR
CAR dans ton cas "or Left(clé, 2) <> 99" annule le "Left(clé, 2) <> 88" et inversement

et si ça peut t'aider a comprendre traduit toi la ligne en francais
est ce que je veux

si left(clé,2)<>"88" ou si left(clé,2)<>"99"' ce qui n'a pas de sens logique puisque tu veux zapper les deux
ou
si left(clé,2)<>"88" et aussi si left(clé,2)<>"99"
bonjour @cathodique
l'erreur que tu fait est simple
If Left(clé, 2) <> 88 or Left(clé, 2) <> 99 Then 'ici

If Left(clé, 2) <> 88 And Left(clé, 2) <> 99 Then 'ici

je te donne MA règle d'or
quand tu utilise des operations logiques(and, or ,xor) avec des operateurs"<>"
NE JAMAIS UTILISER OR
CAR dans ton cas "or Left(clé, 2) <> 99" annule le "Left(clé, 2) <> 88" et inversement

et si ça peut t'aider a comprendre traduit toi la ligne en francais
est ce que je veux

si left(clé,2)<>"88" ou si left(clé,2)<>"99"' ce qui n'a pas de sens logique puisque tu veux zapper les deux
ou
si left(clé,2)<>"88" et aussi si left(clé,2)<>"99"
 
Dernière édition:
bonjour @cathodique
l'erreur que tu fait est simple
If Left(clé, 2) <> 88 or Left(clé, 2) <> 99 Then 'ici

If Left(clé, 2) <> 88 And Left(clé, 2) <> 99 Then 'ici

je te donne MA règle d'or
quand tu utilise des operations logiques(and, or ,xor) avec des operateurs"<>"
NE JAMAIS UTILISER OR
CAR dans ton cas "or Left(clé, 2) <> 99" annule le "Left(clé, 2) <> 88" et inversement

et si ça peut t'aider a comprendre traduit toi la ligne en francais
est ce que je veux

si left(clé,2)<>"88" ou si left(clé,2)<>"99"' ce qui n'a pas de sens logique puisque tu veux zapper les deux
ou
si left(clé,2)<>"88" et aussi si left(clé,2)<>"99"
Bonjour Patrick😉,

1 000 000 de mercis. Tu me sauves car mon code va vraiment se simplifier.
Comme tu as pu le constater, je me suis encore mêlé les pinceaux rien qu'avec OR. En effet, comme tu me l'expliques, ce que j'ai fait est illogique. Pour être honnête, je n'ai jamais utilisé l'opérateur XOR. Je sais qu'on l'appelle OU EXCLUSIF. D'ailleurs, je ne sais pas dans quel contexte il peut être utilisé.

Encore merci. Bonne journée.
 
Bonjour cathodique, patrick,

OR = l'un ou l'autre, ou les deux à la fois.

XOR = l'un ou l'autre mais pas les deux en même temps,
car XOR = eXclusive OR = OU eXclusif.

sur des nombres binaires, XOR 1 permet d'inverser l'état d'un bit :
s'il est à 1, il passe à 0 ; et inversement : s'il est à 0, il passe à 1 ;
ceci pour le bit 0 seulement ; exemple : masque de bits à adapter
pour un octet (= 8 bits) en fonction des bits qu'on veut inverser.

j'en avais surtout l'utilité pour des opérations bit à bit sur des nombres
en binaire stockés dans des octets (bytes) ou des mots (word), voire des
double-mots (dword) ; sinon, pour une utilisation dans des expressions
mathématiques, c'est moins évident d'en trouver une utilité concrète.

attention : ne pas confondre 1 bit avec 1 byte (= 1 octet = 8 bits) !
bit est l'abréviation de binary digit : chiffre binaire (0 ou 1).


soan
 
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
4
Affichages
461
Réponses
10
Affichages
282
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
481
Réponses
35
Affichages
2 K
Réponses
40
Affichages
3 K
Réponses
16
Affichages
1 K
Retour