Macro pour signaler alerte de non répétition

Chers membres salouté !

J'ai fait une certaine macro qui ne doit être exécutée qu'une seule fois par jour. J'ai besoin de faire en sorte que si une tierce personne qui, par erreur par exemple, essaye de la ré-exécuter, qu'un message d'alerte apparaisse et dise : "cette macro a déjà été exécutée en du (la date du jour), tenez-vous à la lancer une seconde fois?" , avec deux boutons qui disent soit "oui" soit "non". Bien entendu le "oui" relance l'exécution de la macro et le "non" ferme la fenêtre de discussion.

Espérant m'être fait comprendre convenablement.

Excellemment votre!

@Excellerateur

Bonjour Excellerateur,

Voici le fichier avec ce que tu souhaites avoir

Il suffit de regarder le code pour le comprendre

@+

Bonjour, il suffit par exemple de conserver la date de lancement de la macro et d'ajouter +1 à chaque utilisation.

Ensuite le code vérifie si aujourd'hui = Date conservée alors lancement macro sinon message :

Private Sub CommandButton1_Click()
Dim madate As Date
madate = Range("A1").Value  'Date actuellement conservée en cellule A1

'Si date conservée = aujourd'hui alors  "Macro1"
If madate = Format(Now, "dd/MM/yyyy") Then
Macro1
' En fin de Macro on change la date pour le lendemain
Range("A1").Value = CDate(Format(Now, "dd/MM/yyyy")) + 1
Else
'Si date différente alors message
MsgBox "Cette Macro a déja été lancée veuillez attendre 1 jour"
End If
End Sub

Oops j'ai pas rédigé assez vite ... Bonjour Bruno M45

Saloutéé la team!

Merci les gars pour votre réactivité légendaire.

D'abord @BrunoM45 (merci encore) je voudrais savoir si il me suffit de copier ton code et de le coller à la suite de ma macro pour qu'elle fonctionne? (Bien entendu en adaptant la feuille sélectionnée), ou alors il s'agit d'une autre macro qui sera indépendante de ma première?

Ensuite @Xmenpl (merci encore), même question que pour @BrunoM45 mais j'ai pas très bien compris ce que vous avez voulu dire dans:

Bonjour, il suffit pas exemple de conserver la date de lancement de la macro et d'ajouter +1 à chaque utilisation.

Merci encore!

@Excellerateur

Salouté!

Je vous mets le code initial ici

Sub Inventaire_jour_a_inventaire_veille()
'
' Inventaire_jour_a_inventaire_veille Macro
' Cette macro efface toute la plage de l'onglet Inventaire veille et puis copie et colle la plage
'inventaire du jour en lieu et place de l'onglet inventaire veille.
'

    Sheets("INVENTAIRE veille").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Sheets("INVENTAIRE Jour").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("INVENTAIRE veille").Select
    Range("A2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("INVENTAIRE Jour").Select
    Application.CutCopyMode = False
    Sheets("INSTRUCTIONS").Select

End Sub

Je ne sais donc pas si la suite doit être un code à part entière ou plutôt inscrite à la suite de celui-ci.

Merci

Re bonjour en fait je parlais de stocker la date dans une cellule libre de votre fichier. elle peut être sur la même page ou même dans un onglet masqué

Puisqu'elle ne servira qu'a vérifier si la macro a déjà été lancée.

Par exemple on va utiliser la cellule A1 de la feuille 1 ( Vous devez donc avoir un onglet "Feuil1" avec en cellule A1 11/06/2021

Le but est de tester si la date d'aujourd'hui est = à la date stockée.

Dans ce cas la macro se poursuit et en fin de macro on ajouter 1journée à la date stockée pour éviter quelle soit de nouveau lancée.

Vous auriez alors comme code:

Sub Inventaire_jour_a_inventaire_veille()
'
' Inventaire_jour_a_inventaire_veille Macro
' Cette macro efface toute la plage de l'onglet Inventaire veille et puis copie et colle la plage
'inventaire du jour en lieu et place de l'onglet inventaire veille.

Dim madate As Date
madate = Worksheet("Feuil1").Range("A1").Value  'Date actuellement conservée en cellule A1 de la feuille 1

'Si date conservée = aujourd'hui alors  "Macro1"
If madate = Format(Now, "dd/MM/yyyy") Then

    Sheets("INVENTAIRE veille").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Sheets("INVENTAIRE Jour").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("INVENTAIRE veille").Select
    Range("A2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("INVENTAIRE Jour").Select
    Application.CutCopyMode = False
    Sheets("INSTRUCTIONS").Select

' En fin de Macro on change la date pour celle du lendemain.
Worksheet("Feuil1").Range("A1").Value = CDate(Format(Now, "dd/MM/yyyy")) + 1

Else
'Si date différente alors message
MsgBox "Cette Macro a déja été lancée veuillez attendre 1 jour"
End If

End Sub

Re-Bonjour!

Du coup @Xmenpl le +1 ça ne dérangera pas le fait que les week-end il n'y a pas de manip à faire?

Salut la team!

Dans la suite de mon exercice, j'ai aussi essayé d'appliquer le code de @BrunoM45, mais il me semble que j'ai loupé quelques détails.

je ne sais pas si je devrais remettre le code de la macro initiale en entier juste au niveau où il est écris "code de la macro" .

En fait je ne sais pas où exactement il faut que j'inscrive le bout de code que vous avez fourni pour que ça marche.

Je suis en totale perdition =( ... je ne sais même pas comment adapter le nouveau code fourni .

Sub Historisation()
Application.ScreenUpdating = False
Dim Derlig&, Derlig1&

Derlig1 = Sheets("Historisation seuils franchis").Range("A" & Rows.Count).End(xlUp).Row + 1

With Sheets("Calcul des Franchissements")
    Derlig = .Range("A" & Rows.Count).End(xlUp).Row
    For i = 3 To Derlig
        Derlig1 = Sheets("Historisation seuils franchis").Range("A" & Rows.Count).End(xlUp).Row + 1
        If .Range("M" & i) = "Franchissement bas" Then

            Sheets("Historisation seuils franchis").Range("A" & Derlig1 & ":AY" & Derlig1) = .Range("A" & i & ":AY" & i).Value
        End If

        If .Range("N" & i) = "Franchissement haut" Then

           Sheets("Historisation seuils franchis").Range("A" & Derlig1 & ":AY" & Derlig1) = .Range("A" & i & ":AY" & i).Value
        End If
        If .Range("O" & i) = "Franchissement bas" Then

            Sheets("Historisation seuils franchis").Range("A" & Derlig1 & ":AY" & Derlig1) = .Range("A" & i & ":AY" & i).Value
        End If

        If .Range("P" & i) = "Franchissement haut" Then

            Sheets("Historisation seuils franchis").Range("A" & Derlig1 & ":AY" & Derlig1) = .Range("A" & i & ":AY" & i).Value
        End If
        If .Range("Q" & i) = "Franchissement bas" Then

            Sheets("Historisation seuils franchis").Range("A" & Derlig1 & ":AY" & Derlig1) = .Range("A" & i & ":AY" & i).Value
        End If

        If .Range("R" & i) = "Franchissement haut" Then

            Sheets("Historisation seuils franchis").Range("A" & Derlig1 & ":AY" & Derlig1) = .Range("A" & i & ":AY" & i).Value
        End If
        If .Range("S" & i) = "Franchissement bas" Then

            Sheets("Historisation seuils franchis").Range("A" & Derlig1 & ":AY" & Derlig1) = .Range("A" & i & ":AY" & i).Value
        End If

        If .Range("T" & i) = "Franchissement haut" Then

            Sheets("Historisation seuils franchis").Range("A" & Derlig1 & ":AY" & Derlig1) = .Range("A" & i & ":AY" & i).Value
        End If
    Next i
End With

End Sub

Sub Strat1fois()
    If Sheets("INSTRUCTIONS").Range("O1").Value = Date Then
     'demandeer si l'on doit exécuter de nouveau
     If MsgBox("cette macro a déjà été exécutée aujourd'hui, " & vbCr _
      & "tenez-vous à la lancer une seconde fois?", _
       vbQuestion + vbYesNo, "OUPS...") = vbNo Then Exit Sub
    End If
    'sinon inscrire la date de lancement
    Sheets("INSTRUCTIONS").Range("O1").Value = Date
    'code de la macro
    MsgBox "ok code lancé", vbInformation, "TOP..."

End Sub

End Sub

Je suis à votre écoute pour toute aide SVP

@Excellerateur

Re, bonjour, effectivement le +1 si week-end çà le fait pas ... je suis allé un peu vite sur le coup mais il suffit d'ajouter une condition avant le +1

pour savoir si on fera +1 ou +3 pour sauter le week-end.

Sub Inventaire_jour_a_inventaire_veille()
'
' Inventaire_jour_a_inventaire_veille Macro
' Cette macro efface toute la plage de l'onglet Inventaire veille et puis copie et colle la plage
'inventaire du jour en lieu et place de l'onglet inventaire veille.

Dim madate As Date
madate = Worksheet("Feuil1").Range("A1").Value  'Date actuellement conservée en cellule A1 de la feuille 1

'Si date conservée = aujourd'hui alors  "Macro1"
If madate = Format(Now, "dd/MM/yyyy") Then

    Sheets("INVENTAIRE veille").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Sheets("INVENTAIRE Jour").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("INVENTAIRE veille").Select
    Range("A2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("INVENTAIRE Jour").Select
    Application.CutCopyMode = False
    Sheets("INSTRUCTIONS").Select

' En fin de Macro on change la date pour celle du lendemain ou du lundi suivant
if Weekday(madate, 2)=5 Then
Worksheet("Feuil1").Range("A1").Value = CDate(Format(Now, "dd/MM/yyyy")) + 3
Else
Worksheet("Feuil1").Range("A1").Value = CDate(Format(Now, "dd/MM/yyyy")) + 1
end if

Else
'Si date différente alors message
MsgBox "Cette Macro a déja été lancée veuillez attendre 1 jour"
End If

End Sub

Re-bonjour,

Merci beaucoup @ Xmenpl pour votre contribution qui me fait avancer en effet.

Cependant, j'ai omis de préciser que je ne voudrais pas non plus que les jours fériés soient pris en compte et puis je ne pourrais me lancer dans une formule du genre "jours ouvrés" car les règles pourraient varier d'une entité à une autre.

Voilà pourquoi, l'idée de partir d'une formule date du jour me semblait plus appropriée.

Merci encore

@Excellerateur

En effet sans doute plus simple de stocker la date du dernier lancement de macro et la date du jour dans un onglet.

Ensuite facile d'ajouter une formule "Oui" ou "NON" si les deux dates sont identiques et pour verifier si on lance ou pas ?

Exemple dans avec un onglet "Param"

Sub Macro1()

Dim LANCEMENT As String
LANCEMENT = Worksheets("Param").Range("C2").Value

If LANCEMENT = "NON" Then
Worksheets("Param").Range("A2").Value = CDate(Format(Now, "dd/MM/yyyy"))
MsgBox "lancement macro"
'Inventaire_jour_a_inventaire_veille '( Enlever l'apostrophe pour activer dans votre code le lancement de votre macro)
Else
'Si "OUI" alors date identique on sort de la macro
MsgBox "Cette Macro a déja été lancée veuillez attendre 1 jour"
Exit Sub
End If

End Sub
4classeurtest.xlsm (20.24 Ko)
Rechercher des sujets similaires à "macro signaler alerte repetition"