Macro conditionnelle

  • Initiateur de la discussion Sylvain
  • Date de début
S

Sylvain

Guest
Bonjour,

Je viens de me lancer dans l'utilisation de macro sous Excel et après une bonne journée de progrès, je coince un peu...

Dans une cellule, je posséde le dernier jour d'un mois,
ex: vendredi 30 avril.

Selon le mois et l'année, le dernier jour du mois peut être 28, 29, 30 ou 31.

Comment peut-on créer une macro (ou une condition), qui en fonction du dernier jour du mois va lancer automatiquement une autre macro spécifique à chaque dernier jour.
ex: dernier jour 28, je voudrais que se lance la macro 1
dernier jour 29, je voudrais que se lance la macro 2
...

Merci de votre aide,
Cordialement, Sylvain
 
L

Lord Nelson

Guest
Salut Sylvain,

Supposons que la date soit en B3, tu pourrais traiter cette donnée comme ceci :

Sub Orientation()
Dim DT As Date
DT = Range("Feuil1!B3")
If IsDate(DT) Then
Select Case Day(DT)
Case 28
Macro28
Case 29
Macro29
Case 30
Macro30
Case 31
Macro31
Case Else
End Select
End If
End Sub

La macro "Orientation" récupère le contenu de B3, vérifie qu'il s'agit bien d'une date et en extrait le jour (Fonction Day).
Suivant ce jour, le Select Case lance la procédure correspondante ou ne fait rien (Case Else).

A+
LN
 
@

@+Thierry

Guest
Re: Macro conditionnelle sur "End Of Month"

Bonjour Sylvain, LN, le Forum

Attention mon Amiral, nous allons droit sur les récifs !!! En effet, le Select Case proposé va déclencher la Macro28 même le 28 janvier, ou tous les 28 de tous les mois, et j'ai cru bien comprendre que Sylvain voulait le déclenchement d'une macro conditionnellement si la date dans une cellule déterminée était bien la fin du mois... (ou alors j'arrête la bière le Vendredi soir !!)

Maintenant, Sylvain veut probablement générer un tableau différent en fonction du mois concerné, (ou quelque chose de similaire) si le mois à 28 jours ou 29, ou 30 ou 31...

Voici ce que je propose, en supposant que Sylvain a son tableau avec des Dates dans la colonne "A"...

Cette procédure va scanner la dernière cellule de la Colonne "A" pour déterminer si c'est bien une date (sinon Erreur gérée), puis déterminer si c'est bien le dernier jour du mois (sinon indication du nombre de jours avant la fin du mois en question), et donc si c'est bien le dernier jour du mois, on peut alors utiliser la procédure Select Case.

Sub CheckingEndOfMonth() '@+Thierry
Dim WS As Worksheet
Dim CURDate As Date
Dim EOMDate As Date
Dim L As Integer

Set WS = ThisWorkbook.Sheets("Feuil1")

L = WS.Range("A65536").End(xlUp).Row
WS.Activate

On Error GoTo ErrorHandler
CURDate = WS.Cells(L, 1)
EOMDate = Evaluate("DATE(YEAR(A" & L & "),MONTH(A" & L & ")+1,1)-1")

If CURDate = EOMDate Then
MsgBox "la date est bien une fin de mois" & vbCrLf & "La macro Fin de Mois va maintenant s'éxécuter !"
MacroFinDeMois CURDate

Else
MsgBox "Il reste " & EOMDate - CURDate & " jours avant la fin du mois de " & Format(CURDate, "MMMM")
End If

Exit Sub
ErrorHandler:
If Err = 13 Then
MsgBox "La valeur de la cellule A" & L & " n'est pas une date valide : " & WS.Cells(L, 1)
Else
MsgBox "Erreur non répertoriée," & Err.Number & " " & Err.Description
End If
End Sub

Sub MacroFinDeMois(TheDate As Date)
Select Case Day(TheDate)
Case 28
MsgBox "Nous sommes en Février Non-Bisextil"
Case 29
MsgBox "Nous sommes en Février Bisextil"
Case 30
MsgBox "Nous sommes en " & Format(TheDate, "MMMM") & " et il y a 30 jours !!"
Case 31
MsgBox "Nous sommes en " & Format(TheDate, "MMMM") & " et il y a 31 jours !!"
Case Else
End Select
End Sub


Bon Premier Mai à Tous et Toutes
@+Thierry
 
S

Sylvain

Guest
En fait, j'ai une feuille par mois comme tu as deviné mais dans une cellule de chaque page, j'ai la date du dernier jour du mois donc je ne pense pas qu'il y ait un problème.

je veux juste qu'en fonction du nombre de jour dans le mois une macro se lance, donc en vérifiant la date du dernier jour je pense que c'est bon.

Mais je me plante peut-être... Si tu as un avis Thierry (ou qui que ce soit), n'hésites pas !

Merci en tout cas d'avoir donné ton avis !
Bonne continuation, Sylvain
 
@

@+Thierry

Guest
Re Sylvain, LN

Le plus simple et de faire un essai, dans un classeur Vierge, en "Feuil1" colonne "A" tu tapes des dates, par exemple de "A1" à "A5"... Puis tu fais tourner les deux macros que je te propose en lançant CheckingEndOfMonth.

Tu auras des messages différents en fonction de la date qui est en dernière cellule de la colonne "A" (A5 si tu as suivi mon exemple).

Puis tu nous dit !!!

Bon Aprèm
@+Thierry
 
L

Lord Nelson

Guest
Re: Macro conditionnelle sur "End Of Month"

Salut Thierry,

Désolé de te contredire, mais Sylvain a dit :

"Dans une cellule, je posséde le dernier jour d'un mois,
ex: vendredi 30 avril."

Donc son problème n'est pas de savoir s'il s'agit bien du dernier jour du mois mais plutôt d'orienter l'exécution de son programme en fonction de cette donnée.

C'est à cette seule préoccupation que répond mon Select Case.

Cela dit, ton code est intéressant, comme toujours, et pourra être utilisé avec profit.

A+ et bon vent !
LN
 
@

@+Thierry

Guest
Re: Macro conditionnelle sur "End Of Month"

Hello LN

Oui je disais que je devrais arrêter la bière du Vendredi Soir au Pub, le samedi j'ai toujours du mal à démarrer !!

Oui en effet si Sylvain à réellement une date qui est réellement le dernier jour du mois, alors le CheckingEndOfMOnth n'a pas lieu d'être ici !!! Enfin oui comme tu dis il servira sûrement avec profit à pas mal

D'ailleurs je me suis pris un peu la tête pour le rédiger ce Code, au début je me suis dit j'utilise la Fin.Mois (EOMONTH) de l'XLA Utilitaire d'analyse, mais alors que neni pour placer çà en WorksheetFonction ! Donc Evalute et tout le tsoin tsoin, génial pour se réveiller dans la brume !! lol

Bonne fin de 1er Mai
@+Thierry
 
L

Lord Nelson

Guest
Salut Sylvain et Thierry,

Comme Thierry parlait de prise de tête, je n'ai pu résister au test de la date et vous propose ceci en passant par la précieuse fonction DateSerial :

Sub Orientation()
Dim DT As Date, Verif As Date
If IsDate(Range("Dates!B3")) Then
DT = Range("Dates!B3")
Verif = DateSerial(Year(DT), Month(DT) + 1, 0)
If DT = Verif Then
Select Case Day(DT)
Case 28
'Macro28
Case 29
'Macro29
Case 30
'Macro30
Case 31
'Macro31
Case Else
End Select
MsgBox CStr(Verif) & " OK " & CStr(DT)
Else
MsgBox "La date à traiter n'est pas une fin de mois"
End If
Else
MsgBox "La date entrée n'est pas valide"
End If
End Sub

Et je me suis aperçu avec ravissement que DateSerial traitait aussi les dates antérieures au 1/1/1900, ce qui élargit sensiblement ma ligne d'horizon pour de futures expéditions au long cours.

A+
LN
 
@

@+Thierry

Guest
ALors Là !!!
smiley_397.gif




Chapeau Bas Mon Amiral !!!!
smiley_409.gif


J'embarque de suite pour un tour du monde !!!

Bon Premier Mai à Tous et Toutes
@+Thierry
 
L

Lord Nelson

Guest
Merci Thierry, je suis confus et merci à Sylvain pour cette question qui nous aura appris quelque chose.

A propos de DateSerial, en poussant un peu, j'ai le sentiment d'un verre à moitié plein ou à moitié vide.

Cette fonction nous permet de reconstituer des dates antérieures au 1/1/1900 mais, malheureusement, pas avant le 1/1/0100 ce qui nous prive de notre Antiquité romaine, grecque, égyptienne et j'en passe...

Le 1er janvier 0100, une année avant le IIe siècle après JC, prend la valeur -657434 et l'on s'arrête là. Quelqu'un saurait-il dire pourquoi alors que l'on est très loin de la capacité théorique d'un nombre entier codé en 32 bits (- 2 milliards et quelques).

A vrai dire, j'aurais mieux compris un point au 1/1/0001, faute d'une année 0000. Mais bon, faisons avec. DateSerial reste quand même utile pour la généalogie et l'histoire à partir du IIe siècle.

A+
LN
 
S

sylvain

Guest
Eh ben...

Si je pensais que ça pouvait aller si loin... En tout cas, mille mercis !!

Je possède bie déjà une date qui est le dernier jour du mois et en fonction de cette date, je veux effectuer telle ou telle macro.

Je m'excuse d'en redemander mais saveze s'il est possible d'automatiser le lancement de la macro. Par exmple, la macro Orientation de LN qui se lancerait toutes les minutes sans avoir à créer un bouton ou sélectionner la commande ?

Encore mille mercis LN, Thierry et très bonne continuation

Sylvain
 
@

@+Thierry

Guest
Salut Sylvain, LN, le Forum

Attention parfois le OnTime peut être la source de problème, donc prévoir un back up de ton fichier.

Et aussi l'aide donne un exemple pour lancer un OnTime Now + TimeValue... mais ne donne pas d'exemple pour Stopper le Bazar !!!

Voici une Méthode complète

Option Explicit

Public StopIt As Boolean

Sub RunIt() 'on Lance par là
StopIt = False
TheMacro
End Sub

Sub TimeTimeTime()
If Not StopIt = True Then
Application.OnTime Now + TimeValue("00:00:05"), "TheMacro"
End If
End Sub

Sub TheMacro()
MsgBox "Je Suis La Mcro redondante toutes les minutes !!!", vbInformation, "LOL"
TimeTimeTime
End Sub


Sub StopperMoiCa() 'on Stop Par là
StopIt = True
End Sub

Bonne Fin de Jounée
@+Thierry
 

Statistiques des forums

Discussions
314 190
Messages
2 106 992
Membres
109 734
dernier inscrit
JoFco