IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème avec une condition if multiple


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 472
    Par défaut Problème avec une condition if multiple
    Bonjour,

    J'ai un souci avec une condition IF

    Pour le moment elle est comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsNull(rs!Notes) = False And rs!Notes = True Then
    Je veux la modifier en ajoutant deux autres AND comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsNull(rs!Notes) = False And IsNull(rs!RNotes) = False And  rs!Notes = True And rs!RNotes = True Then
    Mais le problème c'est que quand j'ajoute les deux AND à ma condition j'ai pas le résultat souhaité.

    Avez vous une idée sur le problème ?

    Merci

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    Passé un certain niveau d'imbrication, il faut des parenthèses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (IsNull(rs!Notes) = False) And (IsNull(rs!RNotes) = False) And  (rs!Notes = True) And (rs!RNotes = True) Then
    Voire des variables intérmédiaires qui facilitent le déboguage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim B1 as Boolean, B2 as Boolean, B3 as Boolean, B4 as Boolean
    B1 = IsNull(rs!Notes)
    B2 = IsNull(rs!RNotes)
    B3 = rs!Notes
    B4 = rs!RNotes 
    If ((B1 = False) And B2 = False) And (B3 And B4) Then
    Et là, si on execute pas-à-pas, on voit tout de suite ce qui est bon, ou pas bon.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 472
    Par défaut
    Oui j'ai essayé avec les parenthèses et rien ne s'affiche dans ma feuille excel.
    Ce code là permet d'alimenter un petit tableau dans ma feuille excel.

    Quand je mets juste deux critères j'ai bien un affichage mais quand j'en mets 4 le code m'affiche rien.

    Pour le débogage j'ai toujours du mal à déboguer des fonctions car quand je mets un point d'arrêt dans le code d'une fonction je n'arrive jamais à me positionner dans le code pour faire un débogage pas à pas.

    Le code de ma fonction est comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    Private Function InitialisationDuTableauRemarques(ByVal projectName As String) As Boolean
     
        Dim params As Variant
        Dim ligneCourant As Integer
        Dim objDBHelper As New DBHelper
     
        Dim cnx As ADODB.Connection
        Dim rs As ADODB.Recordset
        Dim cmd As ADODB.Command
        Dim prm As ADODB.Parameter
        Dim identifiant As Integer
        Dim sequenceCourant As String
        Dim premiereLigne As Integer
        Dim premiereFois As Boolean
        Dim remarquesPresents As Boolean
     
        premiereFois = True
     
        Set cnx = New ADODB.Connection
        With cnx
     
            .ConnectionString = objDBHelper.GetConnectionString
            Call .Open
        End With
     
        Set cmd = New ADODB.Command
        With cmd
     
            Set .ActiveConnection = cnx
            .CommandType = adCmdStoredProc
            .CommandText = "usp_MSP_Extract_Tableau"
     
            Set prm = cmd.CreateParameter("@ProjectName", adVarChar, adParamInput, 4000, projectName)
            Call .Parameters.Append(prm)
        End With
     
        Set rs = New ADODB.Recordset
        With rs
     
            Set .ActiveConnection = cnx
            .LockType = adLockOptimistic
            .CursorLocation = adUseClient
            .CursorType = adOpenForwardOnly
        End With
     
        Call rs.Open(cmd, , , , adCmdStoredProc)
     
        'Affichage du résultat
        With rs
     
            If .RecordCount > 0 Then
     
                Do While rs.EOF = False
     
                    If (IsNull(rs!Notes) = False) And (rs!Notes = True) And (IsNull(rs!RNotes) = False) And (rs!RNotes = True) Then     '''''''''' j'ai commenté cette ligne
     
                            ''And IsNull(rs!Notes) = False And rs!Notes = True
                            ''IsNull(rs!RNotes) = False And rs!RNotes = True
                        remarquesPresents = True
     
                        If premiereFois = True Then
     
                            Call ConstructionDeLEnteteDuTableauRemarque
     
                            Call Application.Goto(Reference:="PremiereLigneDuTableauRemarque")
                            premiereLigne = ActiveCell.Value
     
                            Call Application.Goto(Reference:="ORIGINE")
                            ligneCourant = premiereLigne - PremiereLigneDuTableauPrincipal + 1
     
                            premiereFois = False
                        End If
     
                        If IsNull(rs!Sequence) = False Then
     
                            'Il faut rajouter un index pour toutes les ressources uniquements
                            If IsNull(rs!DisplayOrder) = False Then
     
                                '1 : Correspond à une tâche
                                '2 : Correspond à une ressource
                                If rs!DisplayOrder = 1 Then
     
                                    sequenceCourant = rs!Sequence
                                    identifiant = 0
                                Else
     
                                    identifiant = identifiant + 1
                                    sequenceCourant = rs!Sequence & "." & identifiant
                                End If
     
                                ActiveCell.Offset(ligneCourant, -2).Value = rs!DisplayOrder
                            End If
     
                            ActiveCell.Offset(ligneCourant, -1).Value = "'" & CStr(sequenceCourant)
                        End If
     
                        If IsNull(rs!ProjectCode) = False Then
     
                            ActiveCell.Offset(ligneCourant, 0).Value = rs!ProjectCode
                        End If
     
                        If IsNull(rs!TaskName) = False Then
     
                            ActiveCell.Offset(ligneCourant, 1).Value = rs!TaskWBS & " / " & rs!TaskName   '''''' mon rajout pour le code WBS
                        End If
     
                        If IsNull(rs!Notes) = False Then
     
                            ActiveCell.Offset(ligneCourant, 2).Value = rs!Notes
                        End If
     
                        ligneCourant = ligneCourant + 1
                    End If
     
                    Call .MoveNext
                Loop
            End If
     
     
            Call .Close
     
        End With
     
        Call cnx.Close
     
        InitialisationDuTableauRemarques = remarquesPresents
     
        Set cnx = Nothing
        Set rs = Nothing
    End Function
    En gros le tableau m'affiche juste un genre de remarques et moi je veux ajouter un autre genre de remarques.

    Pour le moment j'arrive à afficher soit l'un soit l'autre mais moi je veux les afficher ensemble.

    Merci

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    Citation Envoyé par sab_info
    Pour le débogage j'ai toujours du mal à déboguer des fonctions car quand je mets un point d'arrêt dans le code d'une fonction je n'arrive jamais à me positionner dans le code pour faire un débogage pas à pas.
    Ton code est loin d'être trivial, alors j'aurais du mal à le débugguer moi-même juste en le lisant(je ne suis qu'un être humain, après tout, et ADO n'est pas ma spécialité). Par contre, que tu n'y arrives pas est très ennuyeux. Ce qu'il faut faire :

    (0) Mettre un point d'arrêt.
    (1) Lancer le job qui ne fait pas ce qu'on veut.
    (2) Si VBA ne passe pas par le point d'arrêt, en rajouter un plus haut dans le code et recommencer au point (1)
    (3) Si VBA s'arrête sur le point d'arrêt, alors descendre ligne à ligne en faisant [Shift]-[F8].

    Si tu as mis mes variables booléennes intermédiaires, tu verras tout de suite ce qu'elles valent. Il suffit qu'une seule soit à la mauvaise valeur pour ne pas entrer dans la suite.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 472
    Par défaut
    Ce que je faisais avant c'est de créer un Sub qui fait appel à ma fonction pour pouvoir déboguer la fonction. ça marchait mais avec cette fonction là j'ai une erreur de compilation qui me dit variable non définie


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub test()
    Call maFonctionl(monParametre)
    End Sub
    Sinon j'ai résolu mon problème en mettant un "OR" comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If (IsNull(rs!Notes) = False And rs!Notes = True) Or (IsNull(rs!RNotes) = False And rs!RNotes = True) Then

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/02/2011, 10h37
  2. [XL-2010] probléme avec une condition sous toute une colonne
    Par Fawez dans le forum Excel
    Réponses: 1
    Dernier message: 12/06/2010, 12h18
  3. Problème avec une condition IF
    Par Invité dans le forum Windows
    Réponses: 11
    Dernier message: 12/02/2009, 16h17
  4. Problème avec une Condition Ou ||
    Par Jcpan dans le forum Débuter avec Java
    Réponses: 12
    Dernier message: 14/01/2009, 12h19
  5. Problème avec une condition
    Par ghan77 dans le forum Débuter
    Réponses: 2
    Dernier message: 16/12/2005, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo