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")
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
@++
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.
@++