IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Executer une macro une seule fois par mois [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Points : 72
    Points
    72
    Par défaut Executer une macro une seule fois par mois
    Bonjour à tous,

    Je souhaiterai executer une macro une seule fois par mois me permettant ensuite d'archiver les données contenu dans mon document.

    Le souci, c'est que lorsque j'arrive le 1er du mois, au moment de l'archivage, cela me rééxecute mon code à chaque ouverture, j'aimerai que ça l'execute une seule fois par mois et cela même le 1er du mois.

    J'ai essayé quelques trucs Avec un compteur, cela ne fonctionne pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    Public cpt As Integer
     
    Function Test_changement_mois()
    'Test si la macro a ete execute une fois dans la journee .
    If cpt = 1 Then
            Exit Function
    '-----------------------------------------------------------------------------------
    'On vérifie s'il nous faut "un formulaire vierge" ou "celui rempli le jour précédent" :
    '-----------------------------------------------------------------------------------
     
    'On compare le mois du "jour précédent" avec le mois du "jour actuel":
    If Month(Date) <> Month(Date - 1) Then
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
     
    '------------------------------------------------------------------
    '                       Enregistrement et classement du
    '                     formulaire rempli le mois précédent
    '------------------------------------------------------------------
    'Enregistrement du fichier du mois :
    Dim nom As String
    Dim chemin As String
        nom = Month(Date - 1) & "_" & Year(Date) '--> Nom du fichier d'enregistrement contenu dans cellule A1 (Gestion des déchets)
        chemin = "\\filer4\controles_production$\Historique\Gestion des déchets\PDF"    '-->Chemin d'enregistrement en PDF
     
    'Suppression de l'onglet "Carte"
    For i = 1 To ThisWorkbook.Worksheets.Count
        If ThisWorkbook.Worksheets(i).Name = "Carte" Then
    Sheets("Carte").Activate
    ActiveSheet.Unprotect "protection"
    Sheets("Carte").Delete
        End If
    Next i
     
    'Traitement des pages (affichage de la barre des onglets et suppressions des boutons de navigations)
    Sheets("Densité").Activate
    ActiveSheet.Unprotect "protection"
    ActiveSheet.Shapes.Range(Array("CommandButton1")).Select
        Selection.Delete
    ActiveSheet.Shapes.Range(Array("CommandButton2")).Select
        Selection.Delete
    ActiveWindow.DisplayWorkbookTabs = True
     
    Sheets("BDD").Activate
    ActiveSheet.Unprotect "protection"
    ActiveSheet.Shapes.Range(Array("CommandButton1")).Select
        Selection.Delete
    ActiveSheet.Shapes.Range(Array("CommandButton2")).Select
        Selection.Delete
    ActiveWindow.DisplayWorkbookTabs = True
     
    Sheets("Rapport").Activate
    ActiveSheet.Unprotect "protection"
    ActiveSheet.Shapes.Range(Array("CommandButton1")).Select
        Selection.Delete
    ActiveSheet.Shapes.Range(Array("CommandButton2")).Select
        Selection.Delete
    ActiveWindow.DisplayWorkbookTabs = True
     
    'Enregistrement en xlsx
    'ActiveWorkbook.SaveAs Filename:="" & chemin & nom & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
     
    'Enregistrement en pdf
    ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _
         Filename:="" & chemin & nom & ".pdf", _
         Quality:=xlQualityStandard, _
         IncludeDocProperties:=True, _
         IgnorePrintAreas:=False, _
         OpenAfterPublish:=False
     
    MsgBox "Données du mois précédent sauvegardé dans :" & chemin & nom & ".pdf"
     
    '------------------------------------------------------------------
    '                        Ouverture du formulaire vierge
    '------------------------------------------------------------------
    'On ouvre un formulaire vierge :
        Workbooks.Open Filename:= _
            "\\filer4\controles_production$\Formulaires\Gestion des déchets.xlsm"
    'On supprime le contenu de la BDD
    Sheets("BDD").Range("A3:AP99999").ClearContents
    Range("A3").Select
    'On revient sur la vue "Carte"
    Sheets("Carte").Activate
     
    Application.DisplayAlerts = False
    Application.ScreenUpdating = True
    End If
        End If
        cpt = 1
    End Function
    Merci d'avance pour votre Aide !!

    GK

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    A la fin de ta macro, place dans une cellule (pour l'exemple, je choisis A1) le numéro du mois en cours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").Value = Month(Date)
    En début de macro, compare la valeur de cette cellule au mois courant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("A1").Value = Month(Date) Then Exit Sub

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Points : 72
    Points
    72
    Par défaut
    Merci de ton aide ! Tu veux de je test ce nouveau code à l'aide d'un Bouton ?

    Il s'agit d'une fonction en réalité et non d'un SUB

    EDIT 9:53 : Lors d'un clic sur le Bouton permettant de lancer la fonction, il ne se passe rien, donc "Exit function" fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     Public cpt As Integer
     
    Function Test_changement_mois()
    'Test si la macro a ete execute une fois dans la journee .
    If Sheets("MDP").Range("A1").Value = Month(Date) Then Exit Function
    '-----------------------------------------------------------------------------------
    'On vérifie s'il nous faut "un formulaire vierge" ou "celui rempli le jour précédent" :
    '-----------------------------------------------------------------------------------
    'On compare le mois du "jour précédent" avec le mois du "jour actuel":
    If Month(Date) <> Month(Date - 1) Then
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
     
    '------------------------------------------------------------------
    '                       Enregistrement et classement du
    '                     formulaire rempli le mois précédent
    '------------------------------------------------------------------
    'Enregistrement du fichier du mois :
    Dim nom As String
    Dim chemin As String
        nom = Month(Date - 1) & "_" & Year(Date) '--> Nom du fichier d'enregistrement contenu dans cellule A1 (Gestion des déchets)
        chemin = "\\filer4\controles_production$\Historique\Gestion des déchets\PDF"    '-->Chemin d'enregistrement en PDF
     
    'Suppression de l'onglet "Carte"
    For i = 1 To ThisWorkbook.Worksheets.Count
        If ThisWorkbook.Worksheets(i).Name = "Carte" Then
    Sheets("Carte").Activate
    ActiveSheet.Unprotect "protection"
    Sheets("Carte").Delete
        End If
    Next i
     
    'Traitement des pages (affichage de la barre des onglets et suppressions des boutons de navigations)
    Sheets("Densité").Activate
    ActiveSheet.Unprotect "protection"
    ActiveSheet.Shapes.Range(Array("CommandButton1")).Select
        Selection.Delete
    ActiveSheet.Shapes.Range(Array("CommandButton2")).Select
        Selection.Delete
    ActiveWindow.DisplayWorkbookTabs = True
     
    Sheets("BDD").Activate
    ActiveSheet.Unprotect "protection"
    ActiveSheet.Shapes.Range(Array("CommandButton1")).Select
        Selection.Delete
    ActiveSheet.Shapes.Range(Array("CommandButton2")).Select
        Selection.Delete
    ActiveWindow.DisplayWorkbookTabs = True
     
    Sheets("Rapport").Activate
    ActiveSheet.Unprotect "protection"
    ActiveSheet.Shapes.Range(Array("CommandButton1")).Select
        Selection.Delete
    ActiveSheet.Shapes.Range(Array("CommandButton2")).Select
        Selection.Delete
    ActiveWindow.DisplayWorkbookTabs = True
     
    'Enregistrement en xlsx
    'ActiveWorkbook.SaveAs Filename:="" & chemin & nom & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
     
    'Enregistrement en pdf
    ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _
         Filename:="" & chemin & nom & ".pdf", _
         Quality:=xlQualityStandard, _
         IncludeDocProperties:=True, _
         IgnorePrintAreas:=False, _
         OpenAfterPublish:=False
     
    MsgBox "Données du mois précédent sauvegardé dans :" & chemin & nom & ".pdf"
     
    '------------------------------------------------------------------
    '                        Ouverture du formulaire vierge
    '------------------------------------------------------------------
    'On ouvre un formulaire vierge :
        Workbooks.Open Filename:= _
            "\\filer4\controles_production$\Formulaires\Gestion des déchets.xlsm"
    'On supprime le contenu de la BDD
    Sheets("BDD").Range("A3:AP99999").ClearContents
    Range("A3").Select
    'On revient sur la vue "Carte"
    Sheets("Carte").Activate
     
    Application.DisplayAlerts = False
    Application.ScreenUpdating = True
    End If
        Sheets("MDP").Range("A1").Value = Month(Date)
    End Function

  4. #4
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Tout ceci est devenu inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Month(Date) <> Month(Date - 1) Then
    Tout comme le End If à la fin.

    Citation Envoyé par Ghost0000 Voir le message
    Il s'agit d'une fonction en réalité et non d'un SUB
    A mon avis, c'est une mauvaise idée.
    Une fonction est chargée de renvoyer une valeur.
    Un Sub est chargé de réaliser une action.

    Si tu utilises l'un pour l'autre, parfois ça peut marcher mais tu risques d'avoir souvent des problèmes.

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Points : 72
    Points
    72
    Par défaut
    Le souci c'est que j'ai besoin de faire appel à cette fonction à plusieurs moments au Niveau de mon document (à chaque entrée de données dans le formulaire) et à part une fonction je vois pas comment faire...

    Merci encore de ton Aide !!

    Voici mon code modifier selon tes préconisations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    Function Test_changement_mois()
    'Test si la macro a ete execute une fois dans la journee .
    If Sheets("MDP").Range("A1000").Value = Month(Date) Then Exit Function
    '-----------------------------------------------------------------------------------
    'On vérifie s'il nous faut "un formulaire vierge" ou "celui rempli le jour précédent" :
    '-----------------------------------------------------------------------------------
    'On compare le mois du "jour précédent" avec le mois du "jour actuel":
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
     
    '------------------------------------------------------------------
    '                       Enregistrement et classement du
    '                     formulaire rempli le mois précédent
    '------------------------------------------------------------------
    'Enregistrement du fichier du mois :
    Dim nom As String
    Dim chemin As String
        nom = Month(Date - 1) & "_" & Year(Date) '--> Nom du fichier d'enregistrement contenu dans cellule A1 (Gestion des déchets)
        chemin = "\\filer4\controles_production$\Historique\Gestion des déchets\PDF"    '-->Chemin d'enregistrement en PDF
     
    'Suppression de l'onglet "Carte"
    'For i = 1 To ThisWorkbook.Worksheets.Count
    '    If ThisWorkbook.Worksheets(i).Name = "Carte" Then
    'Sheets("Carte").Activate
    'ActiveSheet.Unprotect "protection"
    'Sheets("Carte").Delete
    '    End If
    'Next i
     
    'Traitement des pages (affichage de la barre des onglets et suppressions des boutons de navigations)
    'Sheets("Densité").Activate
    'ActiveSheet.Unprotect "protection"
    'ActiveSheet.Shapes.Range(Array("CommandButton1")).Select
    '    Selection.Delete
    'ActiveSheet.Shapes.Range(Array("CommandButton2")).Select
    '    Selection.Delete
    'ActiveWindow.DisplayWorkbookTabs = True
    '
    'Sheets("BDD").Activate
    'ActiveSheet.Unprotect "protection"
    'ActiveSheet.Shapes.Range(Array("CommandButton1")).Select
    '    Selection.Delete
    'ActiveSheet.Shapes.Range(Array("CommandButton2")).Select
    '    Selection.Delete
    'ActiveWindow.DisplayWorkbookTabs = True
    '
    'Sheets("Rapport").Activate
    'ActiveSheet.Unprotect "protection"
    'ActiveSheet.Shapes.Range(Array("CommandButton1")).Select
    '    Selection.Delete
    'ActiveSheet.Shapes.Range(Array("CommandButton2")).Select
    '    Selection.Delete
    'ActiveWindow.DisplayWorkbookTabs = True
     
    'Enregistrement en xlsx
    'ActiveWorkbook.SaveAs Filename:="" & chemin & nom & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
     
    'Enregistrement en pdf
    ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _
         Filename:="" & chemin & nom & ".pdf", _
         Quality:=xlQualityStandard, _
         IncludeDocProperties:=True, _
         IgnorePrintAreas:=False, _
         OpenAfterPublish:=False
     
    MsgBox "Données du mois précédent sauvegardé dans :" & chemin & nom & ".pdf"
     
    '------------------------------------------------------------------
    '                        Ouverture du formulaire vierge
    '------------------------------------------------------------------
    'On ouvre un formulaire vierge :
        Workbooks.Open Filename:= _
            "\\filer4\controles_production$\Formulaires\Gestion des déchets.xlsm"
    'On supprime le contenu de la BDD
    Sheets("BDD").Range("A3:AP99999").ClearContents
    Range("A3").Select
    'On revient sur la vue "Carte"
    Sheets("Carte").Activate
     
    Application.DisplayAlerts = False
    Application.ScreenUpdating = True
     
    Sheets("MDP").Range("A1000").Value = Month(Date)
    End Function

  6. #6
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Ghost0000 Voir le message
    Le souci c'est que j'ai besoin de faire appel à cette fonction à plusieurs moments au Niveau de mon document (à chaque entrée de données dans le formulaire) et à part une fonction je vois pas comment faire...
    Etant donné qu'elle ne doit fonctionner qu'une fois par mois, je ne comprends pas trop tes explications.
    Il suffirait, me semble-t-il, de la lancer à l'ouverture de fichier avec une macro évènementielle Workbook_Open().

    A moins que ce soit un fichier ouvert en permanence et, dans ce cas, ce serait beaucoup plus simple à gérer avec un OnTime.

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Points : 72
    Points
    72
    Par défaut
    Je veux prévoir tous les cas de figures : des personnes pourraient faire tourner ce fichier Excel sans le fermer pendant plusieurs jours... d'où ce choix un peu bizarre... également des Sauvegarde régulière à chaque saisie de données sont réalisés...

  8. #8
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Remplace le début de ton code par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Workbook_Open()
        If Sheets("MDP").Range("A1000").Value = Month(Date) Then
            Application.OnTime DateSerial(Year(Date),Mounth(Date)+1,1) + (1/24)
            Exit Sub
        End If
    Quand le fichier est ouvert, la macro vérifie si elle doit se lancer.
    Si ce n'est pas le cas, elle se relancera le 1er du mois à 1h du matin si le fichier est rester ouvert jusque là.

    N'oublie pas de changer le End Function par End Sub.

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2012
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 180
    Points : 72
    Points
    72
    Par défaut
    Merci de ton aide, j'ai fais ça afin de me simplifier la vie...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Workbook_Open()
    Test_changement_mois 'J'appel ma fonction ICI
    Sheets("Carte").Activate
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. exécuter une macro 1 seule fois par semaine ?
    Par deby23 dans le forum VBA Access
    Réponses: 9
    Dernier message: 20/12/2012, 12h22
  2. Réponses: 8
    Dernier message: 15/12/2009, 12h04
  3. lu tous les jours mais exécuté une seule fois par mois
    Par sianto dans le forum Scripts/Batch
    Réponses: 13
    Dernier message: 17/11/2008, 10h08
  4. [MySQL] N'afficher la page que une seul fois par jour par ip
    Par Nutaak dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/12/2007, 18h38
  5. Réponses: 2
    Dernier message: 04/07/2006, 03h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo