XL 2010 Conditions qui ne passent pas

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

  • Exclusion clé.xlsm
    24 KB · Affichages: 10
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"

patricktoulon

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

cathodique

XLDnaute Barbatruc
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.
 

soan

XLDnaute Barbatruc
Inactif
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:

Discussions similaires

Statistiques des forums

Discussions
314 487
Messages
2 110 119
Membres
110 676
dernier inscrit
Hoolaurent