Bloc "If" à plusieurs conditions

Bonjour,

Afin de lancer une procédure spécifique, j'aimerais vérifier 3 cellules de mon classeur que j'appelle sous le format de variable. Le contenu des cellules peut-être soit une date ou vide.

Dim date1, date2, date3 date1 = Feuil1.Range("A5").Value date2 = Feuil2.Range("A5").Value date3 = Feuil3.Range("A5").Value

J'aimerais lancer ma procédure dans le cas où au moins l'une des trois dates est différente de la date actuelle (j'utilise la variable "date_voulue" pour vérifier l'égalité entre mes cellules et la date actuelle). Toutefois, je ne souhaite pas que la procédure traite l'absence de valeur dans l'une des cellules comme une date différente de la date actuelle : elle doit simplement ignorer la cellule vide.

Je n'arrive pas du tout à construire ma fonction "If".

Sub BKtest()
Dim date1, date2, date3
Dim date_test
Dim date_voulue

date_test = Now()
date_voulue = Format(date_test, "mm/dd/yyyy")

date1 = Feuil1.Range("A5").Value
date2 = Feuil2.Range("A5").Value
date3 = Feuil3.Range("A5").Value

If XXX Then
' procédure
End If

End Sub

Merci d'avance pour votre aide,

Baptiste

Bonjour,

Un essai ...

Sub BKtest()
Dim date1, date2, date3
Dim date_test
Dim date_voulue

    date_test = Now()
    date_voulue = Format(date_test, "mm/dd/yyyy")

    date1 = Format(Feuil1.Range("A5").Value, "mm/dd/yyyy")
    date2 = Format(Feuil2.Range("A5").Value, "mm/dd/yyyy")
    date3 = Format(Feuil3.Range("A5").Value, "mm/dd/yyyy")

    If date1 <> date_voulue Or date2 <> date_voulue Or date3 <> date_voulue Then
        MsgBox " Au moins une date est différente d'aujourd'hui. "
    ' procédure
    Else
        MsgBox " Aucune des 3 dates n'est différente d'aujourd'hui."
    End If
End Sub

ric

Salut horusbk, salut ric,

une autre idée

Sub BKtest()
Dim date_compar, date_test, date_voulue

date_test = Now()
date_voulue = Format(date_test, "mm/dd/yyyy")

For i = 1 To 3
date_compar = Format(Worksheets("Feuil" & i).Range("A5").Value, "mm/dd/yyyy")
    If date_compar <> "" And date_compar <> date_voulue Then
    ' procédure
    Exit Sub
    End If
Next i
End Sub

@++

Bonjour tout le monde !

Autre proposition à tester (qui gère la possibilité d'une cellule A5 vide) :

Sub BKtest()

Dim i As Byte, Res As Integer

Res = 1 
For i = 1 To 3 'Boucle sur les feuilles
    With Sheets(i)
        If Not IsEmpty(.Range("A5")) Then Res = Res * (Int(.Range("A5")) <> Date) 'Si date différente, Res devient 0
    End With
Next i
If Not Res = 1 Then Call NomProcédure

End Sub

Salut Pedro22, m3ellem1 & Ric

Merci pour vos retours ! Je viens de tester vos propositions et celle de m3ellem1 me convient parfaitement.

Toutefois j'aurais deux questions concernant ton code :

Worksheets("Feuil" & i)

Le nom "Feuil" correspond au nom de l'onglet qui peut-être modifié par l'utilisateur ou au nom par défaut de la feuille de classeur (qu'on peut voir dans l'éditeur VBA) ?

Dans mon cas, sur mon fichier final, il s'agit des feuilles : Feuil1, Feuil5 et Feuil6. Est-ce possible d'adapter cette partie du coup ?

For i = 1 To 3 'Boucle sur les feuilles

Enfin, si je souhaite ajouter une procédure lorsque Res = 1. Quel est le meilleur emplacement dans le code pour ajouter l'appel vers ma macro ?

Merci encore pour votre aide !

Baptiste

On peut faire référence au nom de la feuille (i est un nombre) :

Worksheets("Feuil" & i)

Ou à la position de la feuille (ordre donné par le nombre i ici) :

Worksheets(i)

Tu peux aussi restreindre la boucle à des noms prédéfinis :

Dim F As Variant
For Each F In Array("Feuil1", "Feuil5", "Feuil6")
    Worksheets(F) 'gnagnagna...
Next F

J'imagine que Res = 1 fait référence à ma proposition, c'est donc à la fin qu'il faut vérifier si Res est toujours égal à 1 (valeur de départ par défaut). Tu as plusieurs possibilités :

If Res = 0 Then 
    'Procédure1
Else 'Si Res n'est pas égal 0, c'est que Res = 1
    'Procédure2
End If

Ou :

Select Case Res
    Case 0
        'Procédure1
    Case 1
        'Procédure2
End Select

Salut Pedro22,

J'ai repris tes explications en adaptant le code de m3ellem1.

Sub BKtest()
Dim date_compar, date_test, date_voulue
Dim F As Variant

date_test = Now()
date_voulue = Format(date_test, "mm/dd/yyyy")

For Each F In Array("Feuil1", "Feuil2", "Feuil3")
date_compar = Format(Worksheets(F).Range("A5").Value, "mm/dd/yyyy")
    If date_compar <> "" And date_compar <> date_voulue Then
    ' procédure
    MsgBox "dates différentes"
    Else
    MsgBox "dates identiques"
    'Exit Sub
    End If
Next F
End Sub

J'ai une erreur qui pointe sur la ligne ci-dessous avec comme message "Erreur d'exécution '9' : l'indice n'appartient pas à la sélection.".

For Each F In Array("Feuil1", "Feuil2", "Feuil3")

Sachant que sur mon fichier test, les "Feuil1", "Feuil2", "Feuil3" portent un nom différent dans la barre d'onglets des feuilles de classeur.

Merci pour l'explication de Res !

On parle bien du nom des feuilles, c'est à dire que dans ton classeur on doit retrouver une feuille appelée "Feuil1", etc. Ce qui n'est pas ton cas d'après le message d'erreur.

L'autre problème d'imbriquer le lancement des procédures dans la boucle, c'est que tu travailles individuellement sur chacune des 3 dates. Or, si j'ai bien compris, il faudrait attendre d'avoir balayé les 3 pour déterminer si elles sont toutes identiques (et/ou vides) ou pas. C'est pour ça que j'utilisais une variable intermédiaire Res, qui déterminait après la boucle la procédure à lancer.

On parle bien du nom des feuilles, c'est à dire que dans ton classeur on doit retrouver une feuille appelée "Feuil1", etc. Ce qui n'est pas ton cas d'après le message d'erreur.

Dans ce cas est-il possible d'utiliser les noms par défaut (encadrés en rouge ci-dessous) des feuilles de classeur pour cette boucle ?

Ainsi, si jamais le nom de ces feuilles venait à changer, le programme ne sera pas cassé.

For Each F In Array("Feuil1", "Feuil2", "Feuil3")
200520091419833976

Merci

Bonjour horusbk, bonjour Pedro ,

à tester

Sub BKtest()
Dim date_compar, date_test, date_voulue
Dim F As Variant
Dim ws As Worksheet

date_test = Now()
date_voulue = Format(date_test, "mm/dd/yyyy")

For Each ws In Worksheets
    For Each F In Array("Feuil1", "Feuil2", "Feuil3")
        If ws.CodeName = F Then
        ws.Activate
        date_compar = Format(ws.Range("A5").Value, "mm/dd/yyyy")
            If date_compar <> "" And date_compar <> date_voulue Then
                ' procédure
                MsgBox "Bien dates différentes"
                Exit For
                Else
                MsgBox "Mauvais dates identiques"
                Exit For
                'Exit Sub
            End If
        End If
    Next F
Next ws
End Sub

Bonne journée

Bonjour m3ellem1

Merci pour ton retour. On approche du but !

Comme disait Pedro22 : d'imbriquer le lancement des procédures dans la boucle, c'est que tu travailles individuellement sur chacune des 3 dates.

Pour éviter cela, peut-on réécrire ainsi la procédure afin d'avoir un seul résultat ?

Sub BKtest()
Dim date_compar, date_test, date_voulue
Dim F As Variant
Dim ws As Worksheet

date_test = Now()
date_voulue = Format(date_test, "mm/dd/yyyy")

For Each F In Array("Feuil1", "Feuil2", "Feuil3")
    For Each ws In Worksheets
        If ws.CodeName = F Then
        date_compar = Format(ws.Range("A5").Value, "mm/dd/yyyy")
            If date_compar <> "" And date_compar <> date_voulue Then
                ' procédure
                MsgBox "Bien dates différentes"
                Exit Sub
            End If
        End If
    Next ws
Next F
    MsgBox "Mauvais dates identiques"
    ' procedure
End Sub

Si j'ai bien compris c'est le ws.CodeName qui permet d'identifier le nom "par défaut" de la feuille de classeur ?

Merci encore.

Baptiste

Salut Baptiste,

oui je pense que ca devrait faonctionner comme ca. Je viens de faire un petit changement dans le code, j'ai changé l'ordre des boucles For

Donc, dés qu'une feuille nous réalise les conditions on quitte immédiatement la SUB avec "Exit Sub"

Et si aucune feuille n'est trouvée, il passe au " MsgBox "Mauvais: aucune Feuille trouvée avec des dates différentes"" et la procédure qui le suit ...

Sub BKtest()
Dim date_compar, date_test, date_voulue
Dim F As Variant
Dim ws As Worksheet
Dim t As Integer

date_test = Now()
date_voulue = Format(date_test, "mm/dd/yyyy")

For Each ws In Worksheets
    For Each F In Array("Feuil1", "Feuil2", "Feuil3")
        If ws.CodeName = F Then
        date_compar = Format(ws.Range("A5").Value, "mm/dd/yyyy")
            If date_compar <> "" And date_compar <> date_voulue Then
                ' procédure
                MsgBox "Bien dates différentes"
                Exit Sub
            End If
        End If
    Next F
Next ws

    MsgBox "Mauvais: aucune Feuille trouvée avec des dates différentes"
    ' procedure
End Sub

Si j'ai bien compris c'est le ws.CodeName qui permet d'identifier le nom "par défaut" de la feuille de classeur ?

oui c'est bien ca

sheet name

@++

Salut m3ellem1

Merci beaucoup ça fonctionne très bien !

Je vais à présent remplacer les msgbox par mes procédures.

Je passe le sujet comme résolu.

@++

Rechercher des sujets similaires à "bloc conditions"