VBA : bug avec la fonction AND et les IF à deux conditions

Bonjour,

J'essaie de coder un programme en VBA sur un tableur de suivi de documents (le contenu des cellules est une date) pour qu'Excel génère des MsgBox en fonction de l'avancement des dossiers. Sauf que quand je lance la macro, les msgbox générées sont complètement fausses par rapport aux dates entrées dans le tableur.

Quelqu'un verrait-il l'erreur de mon programme ? Merci beaucoup

Sub start()

For i = 3 To 8

Dim a As Date

Dim b As Date

Dim c As Date

a = Cells(i, 4).Value

b = Cells(i, 5).Value

c = Cells(i, 6).Value

If c = 0 And Date > b Then

MsgBox "Retard de " & (Date - b) & " jours"

ElseIf Date > (a + 30) And b = c = 0 Then

MsgBox "Retard de plus de 30 jours"

Else

MsgBox "All good"

End If

Next

End Sub

Bonjour.

Déjà déclare tes variables a, b et c en dehors du for, ça évitera à Excel de le refaire à chaque fois.

Ensuite tu parles de problèmes, dans quel if surviennent-ils ?

A quoi correspondent a, b et c ? c à la fin du projet, a au début ? Ou autre ?

Bonne journée.

Bonjour,

Bérénice a écrit :

ElseIf Date > (a + 30) And b = c = 0 Then

je doute que vba apprécie vraiment cette syntaxe

Merci de me le signaler, je ne savais pas trop comment l'exprimer parce que en écrivant cells(i, 5).value = 0 and cells(i, 6).value = 0, VBA me signalait une erreur et c'est en combinant qu'il a arrêté de le signaler... Je ne savais pas si c'était bon signe ou non ^^

Je débute un peu

Mon vrai problème c'est avec AND.

Quand je teste la macro, Excel ne tient pas compte des deux conditions dans chaque If, et choisit une réponse au hasard, le Then qu'il utilise dans la msgbox ne correspond jamais au cas de figure testé.


Elhevan a écrit :

Bonjour.

Déjà déclare tes variables a, b et c en dehors du for, ça évitera à Excel de le refaire à chaque fois.

Ensuite tu parles de problèmes, dans quel if surviennent-ils ?

A quoi correspondent a, b et c ? c à la fin du projet, a au début ? Ou autre ?

Bonne journée.

a, b, c sont les cellules de trois colonnes contenant des dates respectivement de réclamation de document, date limite de réception (qui n'est pas systématique, d'où mon ElseIf), et date de réception

à savoir que c= 0 et c = "" ce n'est pas la même chose ^^

minanse a écrit :

à savoir que c= 0 et c = "" ce n'est pas la même chose ^^

Ca paraît très bête d'avoir mis 0, je m'en rends bien compte, mais je n'arrivais même pas à exécuter la macro avec les " ", vba a planté --'

D'ailleurs, ça fait partie indirectement des plaisanteries que génère la macro : si pour le cas de figure où une cellule de (i, 5) et de (i, 6) sont vides simultanément, au lieu de me signaler qu'il y a plus de 30 jours de retard il utilise le Then du 1er If et me calcule qu'il s'est passé 45555 jours (environ) depuis sa date zéro...(aka le 1er janvier 1900, visiblement l'an zéro de excel). Et c'est évidemment faux^^

Essaye avec

ElseIf Date > (a + 30) And IsEmpty(b) and IsEmpty(c) Then

(et pareil pour le c du dessus)

Edit : Remarque c'des variables, je sais pas si ça va passer, repasse par les cellules si ça passe pas.

c'est possible d'avoir un petit fichier ??

Euh oui, deux minutes je crée un fichier test pour vous


Voilà !


Elhevan a écrit :

Essaye avec

ElseIf Date > (a + 30) And IsEmpty(b) and IsEmpty(c) Then

(et pareil pour le c du dessus)

Edit : Remarque c'des variables, je sais pas si ça va passer, repasse par les cellules si ça passe pas.

Ok alors je viens de tester (je pensais comme toi en fait, qu'avec les variables ça planterait), ça a marché pour le début... Mais ça déraille pour les lignes 6 à 8... Et je pense que si je changeais les dates ça planterait aléatoirement aussi --'

8test.xlsm (14.07 Ko)

bonjour,

une proposition de correction

Sub Macro2()
    For i = 3 To 8
        a = Cells(i, 4).Value
        b = Cells(i, 5).Value
        c = Cells(i, 6).Value
        If c = 0 And b <> "" And Date > b Then
            MsgBox "Retard de " & Date - b & " jours"
        ElseIf Date > (a + 30) And b = "" And c = "" Then
            MsgBox "Retard"
        Else
            MsgBox "All good"
        End If
    Next
End Sub

Merci infiniment à tous les trois !!!

Rechercher des sujets similaires à "vba bug fonction deux conditions"