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 :

Problème d'arrêt de macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 491
    Par défaut Problème d'arrêt de macro
    Bonjour,

    J'ai une macro qui fait appel à une 2ème macro.

    Dans cette 2ème macro dans certains cas je souhaite arrêter complètement l'exécution du programme.

    J'ai utilisé "exit sub", mais le problème est que la macro 2 s'arrête et continue sur la macro de base.

    Savez-vous si il est possible d'arrêter totalement les macros imbriquées entre elles?

    Merci d'avance

    J'ai bien trouvé des brides de solutions avec une variable booléenne mais je n'arrive pas à faire le code (je suis trop nul )

    Voici le code :
    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
    92
    93
    94
    95
    96
    97
    Sub EnvoiMail()
      Dim nomfich As String
      Dim nomfich2 As String
      Dim i As Integer
        Dim cellule As String
        Dim onglet As Worksheet
        Dim Cancel As Boolean
        Dim myrep, adresse, sujet, texte, Msg, Style, Title, Response, MyString
     
     
        Msg = "Il faut enregistrer le fichier avant l'envoi" & vbCrLf & vbCrLf & "Confirmez-vous l'enregistrement ?"
        Style = vbYesNo + vbInformation    ' Définit les boutons.
        Title = "Enregistrement du bordereau de visites"    ' Définit le titre.
     
        Response = MsgBox(Msg, Style, Title) ' Affiche le message.
     
        If Response = vbYes Then    ' L'utilisateur a choisi Oui.
     
     
            If Dir(Dossier, vbDirectory) <> "" Then
                enregistrer3
                Copie_Onglets
     
            Else
                ‘programme sans importance pour ma question
            End If
     
     
         ‘suite du prog qui doit se faire uniquement si Copie_Onglets s’est déroulé jusqu’au bout
     
    End Sub
     
     
     
    Sub Copie_Onglets()
     
    Dim nomEnregistrement As String
     
    Sheets("Fonctionnement").Select
     
        Range("I2:I3").Select
        Selection.Copy
        Range("M1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
        Rep = Range("L1")
        Semaine = ("S" & Range("M1").Value & "_" & Range("M2").Value)
     
     
        fichier = ("Bordereau_" & Rep & "_" & Semaine)
     
        Sheets(Array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi")).Select
        Sheets("Vendredi").Activate
        Application.CutCopyMode = False
        Sheets(Array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi")).Copy
     
     
    nomEnregistrement = Dossier & fichier & ".xls"
       ' on vérifie que le fichier n'existe pas
        If Dir(nomEnregistrement) = "" Then 'cas où le fichier n'existe pas
            ActiveWorkbook.SaveAs Filename:=Dossier & fichier
            MsgBox ("Le fichier " & fichier & ".xls a bien été enregistré dans le répertoire" & vbCrLf & Dossier)
                ActiveWorkbook.Close False
                Sheets("Fonctionnement").Select
                Range("A1").Select
        Else
            Msg = ("Le fichier " & fichier & ".xls  existe déjà !" & vbCrLf & vbCrLf & "Voulez-vous le remplacer ?")
            Style = vbYesNo + vbInformation    ' Définit les boutons.
            Title = "Demande"    ' Définit le titre.
     
            Response = MsgBox(Msg, Style, Title) ' Affiche le message.
            If Response = vbYes Then
                Application.DisplayAlerts = False
                ActiveWorkbook.SaveAs Filename:=Dossier & fichier
                Application.DisplayAlerts = True
                MsgBox ("Le fichier " & fichier & ".xls a bien été enregistré dans le répertoire" & vbCrLf & Dossier)
                ActiveWorkbook.Close False
                Sheets("Fonctionnement").Select
                Range("A1").Select
            Else
                MsgBox ("Le fichier " & fichier & ".xls n'a pas été enregistré dans le répertoire" & vbCrLf & Dossier)
                ActiveWorkbook.Close False
                Sheets("Fonctionnement").Select
                Range("A1").Select
     
    ‘ c’est dans ce cas et uniquement dans celui-ci 
    ‘qu’il faudrait que la macro EnvoiMail
    ‘ s’arrête également
     
            End If
     
        End If
     
     
     
    End Sub
    est ce qq1 peut m'aider ?

    Merci par avance.

    Nini

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 36
    Par défaut
    Si ta macro 1 présente une boucle, peut etre quelque chose dans ce gout la peut t'aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    'Dans la macro2:
    If TaCondition
    VariableBouleenne = 1
    Exit Sub
    End If
     
    'Dans la macro1:
    Public VariableBouleenne As Boolean
    While VariableBouleenne = 1
    Do
    [...]
    Loop
    Ciao !

  3. #3
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    SAlut
    Il suffit de transformer ta 2eme macro en function et d'envoyer true ou false en fonction de sont exécution correct ou 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
    92
    93
    94
    95
    96
    97
    98
    99
    Sub EnvoiMail()
      Dim nomfich As String
      Dim nomfich2 As String
      Dim i As Integer
        Dim cellule As String
        Dim onglet As Worksheet
        Dim Cancel As Boolean
        Dim myrep, adresse, sujet, texte, Msg, Style, Title, Response, MyString
     
     
        Msg = "Il faut enregistrer le fichier avant l'envoi" & vbCrLf & vbCrLf & "Confirmez-vous l'enregistrement ?"
        Style = vbYesNo + vbInformation    ' Définit les boutons.
        Title = "Enregistrement du bordereau de visites"    ' Définit le titre.
     
        Response = MsgBox(Msg, Style, Title) ' Affiche le message.
     
        If Response = vbYes Then    ' L'utilisateur a choisi Oui.
     
     
            If Dir(Dossier, vbDirectory) <> "" Then
                enregistrer3
                If Not Copie_Onglets Then Exit Sub
     
            Else
                'programme sans importance pour ma question
            End If
     
     
         'suite du prog qui doit se faire uniquement si Copie_Onglets s’est déroulé jusqu’au bout
     
    End Sub
     
     
     
    Function Copie_Onglets()
     
    Dim nomEnregistrement As String
     
    'Initialisation
    Copie_Onglets = True
        Sheets("Fonctionnement").Select
     
        Range("I2:I3").Select
        Selection.Copy
        Range("M1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
        Rep = Range("L1")
        Semaine = ("S" & Range("M1").Value & "_" & Range("M2").Value)
     
     
        fichier = ("Bordereau_" & Rep & "_" & Semaine)
     
        Sheets(Array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi")).Select
        Sheets("Vendredi").Activate
        Application.CutCopyMode = False
        Sheets(Array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi")).Copy
     
     
    nomEnregistrement = Dossier & fichier & ".xls"
       ' on vérifie que le fichier n'existe pas
        If Dir(nomEnregistrement) = "" Then 'cas où le fichier n'existe pas
            ActiveWorkbook.SaveAs Filename:=Dossier & fichier
            MsgBox ("Le fichier " & fichier & ".xls a bien été enregistré dans le répertoire" & vbCrLf & Dossier)
                ActiveWorkbook.Close False
                Sheets("Fonctionnement").Select
                Range("A1").Select
        Else
            Msg = ("Le fichier " & fichier & ".xls  existe déjà !" & vbCrLf & vbCrLf & "Voulez-vous le remplacer ?")
            Style = vbYesNo + vbInformation    ' Définit les boutons.
            Title = "Demande"    ' Définit le titre.
     
            Response = MsgBox(Msg, Style, Title) ' Affiche le message.
            If Response = vbYes Then
                Application.DisplayAlerts = False
                ActiveWorkbook.SaveAs Filename:=Dossier & fichier
                Application.DisplayAlerts = True
                MsgBox ("Le fichier " & fichier & ".xls a bien été enregistré dans le répertoire" & vbCrLf & Dossier)
                ActiveWorkbook.Close False
                Sheets("Fonctionnement").Select
                Range("A1").Select
            Else
                MsgBox ("Le fichier " & fichier & ".xls n'a pas été enregistré dans le répertoire" & vbCrLf & Dossier)
                ActiveWorkbook.Close False
                Sheets("Fonctionnement").Select
                Range("A1").Select
     
    ' c’est dans ce cas et uniquement dans celui-ci
    'qu’il faudrait que la macro EnvoiMail
    ' s’arrête également
                Copie_Onglets = False
            End If
     
        End If
     
     
     
    End Function
    Par contre ta macro mérite d'être reprise pour enlever tout les Select et compagnie
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 491
    Par défaut
    Merci Qwazerty : tu es un chef

    Je vais pouvoir utiliser cette manip pour d'autres macro sur lesquelles j'ai bidouillé pas mal

    Par contre, tu me dis :
    Par contre ta macro mérite d'être reprise pour enlever tout les Select et compagnie
    ça pose un problème mes select ? Je les mets car je veux repositionner le curseur sur des cellules bien prises. Il ne faut pas le faire comme ça ?

    et compagnie
    c'est quoi ?

  5. #5
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    L'utilisation des Select, Activate fait perdre du temps a excel, de plus c'est inutile, sauf si tu veux vraiment que la case active change pour par exemple inciter l'utilisateur a saisir une valeur dans cette cellule.
    L'utilisation des activecell, activesheet c'est juste bon a s'emmêler les pinceau et finir par faire des modifs aux mauvais endroits.
    C'est un conseil fait en ce que tu veux mais je te conseille de faire ainsi

    Un exmple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Sheets("Fonctionnement").Select
     
        Range("I2:I3").Select
        Selection.Copy
        Range("M1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    Peut être traduit ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       Sheets("Fonctionnement").Range("I2:I3").Copy
        Range("M1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    Ça tiens moins de place, c'est plus lisible et excel n'est pas obligé de ce déplacer dans les cellules et les onglets.

    Un autre pour la route
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sheets(Array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi")).Select
        Sheets("Vendredi").Activate
        Application.CutCopyMode = False
        Sheets(Array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi")).Copy
    Sur 4 lignes, une seul est utile, la dernière, enfin elle est utile si dans une partie de code que tu ne donne pas il y a un Past qui traine (je l'ai peut être manqué)


    Petit bonus:
    Il existe la propriété application.ScreenUpdating
    Tu met cette propriété a False en début de code et a true en fin de code, ceci gel la mise a jour de l'écran, ainsi si des valeur sont saisi dans des cellule, plutot que de voir les valeur s'afficher les une apres les autres, le tableau apparaitra rempli d'un coup lors de la mise a true de ScreenUpdating.

    Retravailles un peu ton code et reposte le résultat, s'il reste des simplifications a faire je t'aiderais a les comprendre et a les réaliser.

    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 491
    Par défaut
    Bonjour Qwazerty,

    Vraiment merci pour tes conseils et ton aide.
    Je n'ai pas eu le temps depuis hier de travailler ma macro car je fais ça en plus de mon activité principal qui est de vendre.

    Bref, je potasse dessus avant vendredi et je te copie les codes mais tu risques de tomber par terre car je ne suis pas un expert et du coup, ce nest pas un code mais codebidouillage

    A+ avec le code

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 491
    Par défaut
    Bon je me lache mais j'ai un peu honte de vous montrer ce bordel de code

    Pourquoi j'ai codé comme ça ?
    parce que je ne sais pas coder et le truc c'est que ma bidouille fonctionne !

    Pour info, le programme permet 2 choses:
    1. Enregistrer les 5 onglets (un par jour) où l'utilisateur renseigne ses visites commerciales
    2. Envoyer les 5 onglets à une adresse email une fois l'enregistrement fait.

    Ensuite, il y a des trucs comme :
    - A l'ouverture, le fichier est épuré des éventuelles données d'un ancien enregistrement (Sub nettoyage).
    - Il est impossible d'enregistrer si la cellule Ix n'est pas renseignée alors que la cellule Ax n'est pas vide (Sub Verif_Observation)
    - Il faut absolument qu'au moins une date d'un des 5 onglets soit renseignée
    - Il faut absolument indiqué un représentant
    - L'enregistrement des 5 onglets se fait sur un nouveau fichier qui prend comme nom : représentant_semaine_année.xls


    Merci pour votre indulgence :

    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    Option Explicit
    Option Base 1
    Const Dossier As String = "C:\Bordereau de visites\"
    Dim verif As String
    Dim client As String
    Dim fichier As String
    Dim Rep As String
    Dim Representant As String
    Dim Refus As String
     
    Dim N_Semaine, Annee, Semaine, Jour As String
     
    Dim Msg, Style, Title, Response As String
     
     
    Sub Nettoyage()
     
    Dim onglet As Worksheet
     
    'boucle sur toutes les feuilles du classeur
    For Each onglet In Application.ActiveWorkbook.Worksheets
        If onglet.Name <> "Fonctionnement" Then
     
        onglet.Select
        Rows("10:10").Select
            Range(Selection, Selection.End(xlDown)).Select
            Range(Selection, Selection.End(xlDown)).Select
            Range(Selection, Selection.End(xlDown)).Select
            Range(Selection, Selection.End(xlDown)).Select
            Selection.ClearContents
     
        Range("C5:D5").Select
        Selection.ClearContents
        Range("G5").Select
        Selection.ClearContents
        Range("C5").Select
        End If
    Next onglet
    Sheets("Fonctionnement").Select
     
    End Sub
     
     
    Sub Maj()
    Dim cell As Range
    For Each cell In Selection
    cell.Value = UCase(cell.Value)
    Next
     
    End Sub
     
     
    Sub verif_observation()
    Dim i As Integer
    Dim cellule As String
    Dim onglet As Worksheet
    Dim Cancel As Boolean
     
     
    'boucle sur toutes les feuilles du classeur
    For Each onglet In Application.ActiveWorkbook.Worksheets
        If onglet.Name <> "Fonctionnement" Then
            onglet.Select
     
            For i = 10 To 30
            cellule = ("I" & i)
                If IsEmpty(Range("I" & i)) Then
                    If IsEmpty(Range("A" & i)) Then
                        'Exit Sub
                    Else
                        MsgBox ("Il faut absolument que l'observation d'une visite soit renseignée!" & vbCrLf & vbCrLf & "Il faut remplir la cellule " & cellule)
                        Cancel = True
                        verif = Range("I" & i).Value
                        Exit Sub
                    End If
               End If
            Next i
        End If
     
    Next onglet
     
     
    Onglets_2
     
    End Sub
     
     
     
     
    Sub enregistrer()
     
    Sheets("Fonctionnement").Select
    If Range("B3") = "" Then
        MsgBox ("Il n'y a pas de date de visite renseignée !")
        End
    Else
        Rep = InputBox("Entrez le nom du représentant" & vbCrLf & "FP pour FP" & vbCrLf & "PDA pour PA" & vbCrLf & "PDU pour PU", "Sélection")
     
        On Error Resume Next
     
        On Error GoTo 0
        Range("L1").Select
        Range("L1").Value = Rep
        Maj
        Range("A1").Select
            If IsEmpty(Range("L1")) Then
                MsgBox ("Merci d'indiquer un représentant!")
            End
         End If
     
    End If
     
    verif_observation
     
     
     
    End Sub
     
     
     
    Sub Bouton_EnregistrerLeFichier()
     
    If Dir(Dossier, vbDirectory) <> "" Then
        enregistrer
     
    Else
     
        Msg = "Il faut créer un dossier 'Bordereau de visites' à la racine de c:\" & vbCrLf & vbCrLf & "Souhaitez-vous le créer ?" ' Imposer un repertoire
        Style = vbYesNo + vbInformation    ' Définit les boutons.
        Title = "Dossier de sauvegarde des bordereaux de visites"    ' Définit le titre.
     
        Response = MsgBox(Msg, Style, Title) ' Affiche le message.
     
        If Response = vbYes Then    ' L'utilisateur a choisi Oui.
     
            MkDir (Dossier)
            Msg = "Le dossier Bordereau de visites a été correctement créé à la racine de c:\" & vbCrLf & vbCrLf & "Souhaitez-vous faire l'enregistrement ?"
            Style = vbYesNo + vbInformation    ' Définit les boutons.
            Title = "Demande de validation"    ' Définit le titre.
     
            Response = MsgBox(Msg, Style, Title) ' Affiche le message.
     
            If Response = vbYes Then
              enregistrer
     
            Else
                MsgBox ("L'enregistrement du bordereau n'a pas eu lieu")
     
            End If
     
        Else
            MsgBox ("L'enregistrement du bordereau ne pourra pas se réaliser")
        End If
     
    End If
     
    Range("C5").Select
     
    End Sub
     
    Sub Fermeture()
     
     
        MsgBox ("Fermeture du fichier")
        ActiveWorkbook.Close
     
    End Sub
     
    Sub EnvoiMail()
      Dim nomfich As String
      Dim nomfich2 As String
      Dim i As Integer
        Dim cellule As String
        Dim onglet As Worksheet
        Dim Cancel As Boolean
        Dim myrep, adresse, sujet, texte, Msg, Style, Title, Response, MyString
     
     
        Msg = "Il faut enregistrer le fichier avant l'envoi" & vbCrLf & vbCrLf & "Confirmez-vous l'enregistrement ?"
        Style = vbYesNo + vbInformation    ' Définit les boutons.
        Title = "Enregistrement du bordereau de visites"    ' Définit le titre.
     
        Response = MsgBox(Msg, Style, Title) ' Affiche le message.
     
        If Response = vbYes Then    ' L'utilisateur a choisi Oui.
     
     
            If Dir(Dossier, vbDirectory) <> "" Then
                enregistrer3
     
                For Each onglet In Application.ActiveWorkbook.Worksheets
                 If onglet.Name <> "Fonctionnement" Then
                    onglet.Select
     
                       For i = 10 To 30
                       cellule = ("I" & i)
                            If IsEmpty(Range("I" & i)) Then
                                If IsEmpty(Range("A" & i)) Then
     
                                Else
                                    MsgBox ("Il faut absolument que l'observation d'une visite soit renseignée!" & vbCrLf & vbCrLf & "Il faut remplir la cellule " & cellule)
                                    Cancel = True
                                    verif = Range("I" & i).Value
                                    Exit Sub
                               End If
                             End If
                        Next i
                End If
     
                Next onglet
     
     
                If Not Onglets_2 Then Exit Sub
     
            Else
                Msg = "Il faut créer un dossier Bordereau de visites à la racine de c:\" & vbCrLf & vbCrLf & "Souhaitez-vous le créer ?"
                Style = vbYesNo + vbInformation    ' Définit les boutons.
                Title = "Dossier de sauvegarde des bordereaux de visites"    ' Définit le titre.
                Response = MsgBox(Msg, Style, Title) ' Affiche le message.
     
                If Response = vbYes Then    ' L'utilisateur a choisi Oui.
                    MkDir (Dossier)
                    Msg = "Le dossier Bordereau de visites a été correctement créé à la racine de c:\" & vbCrLf & vbCrLf & "Souhaitez-vous faire l'enregistrement ?"
                    Style = vbYesNo + vbInformation    ' Définit les boutons.
                    Title = "Demande de validation"    ' Définit le titre.
                    Response = MsgBox(Msg, Style, Title) ' Affiche le message.
     
                    If Response = vbYes Then
                        enregistrer2
     
                    Else
                        MsgBox ("L'enregistrement du bordereau n'a pas eu lieu")
                        Exit Sub
                    End If
     
                Else
                    MsgBox ("L'enregistrement du bordereau ne pourra pas se réaliser")
                    Exit Sub
                End If
            End If
     
        Range("C5").Select
     
        Msg = "Confirmez vous l'envoi d'un email pour le fichier" & vbCrLf & fichier
        Style = vbYesNo + vbQuestion
        Title = "Confirmation envoi email"
        Response = MsgBox(Msg, Style, Title) ' Affiche le message.
     
        myrep = Dossier
        nomfich = myrep & fichier & ".xls"
        nomfich2 = Dir(myrep & "*" & fichier & "*.xls")
     
     
            If Response = vbYes Then    ' L'utilisateur a choisi Oui.
                adresse = "toto@free.fr"
                sujet = "Bordereau de visites de la semaine " & N_Semaine & " (année " & Annee & ")"
                texte = "Bonjour," & vbCrLf & vbCrLf & "Veuillez trouver ci-joint le bordereau de visites de la semaine " & N_Semaine & " (année " & Annee & ")" & vbCrLf & vbCrLf & vbCrLf & "Bonne réception." & vbCrLf & "Bien cordialement." & vbCrLf & vbCrLf & Representant
     
                Shell "C:\Program Files\Outlook Express\msimn.exe " & "/mailurl:mailto:" & _
                adresse & "?subject=" & sujet & "&Body=" & texte & ""
                SendKeys "%I" & "p" & nomfich & "~"
                        'Signification des caractères après "SendKeys":
                        '* %I et P = Insertion de la pièce jointe dans Outlook Express. (%=Alt)
                        '* ~ = Validation. (~=Entrée)
                        '* %S = Envoyer.
            Else
                MsgBox ("L'envoi du bordereau n'a pas eu lieu")
                End
     
            End If
     
        Else
            MsgBox ("L'envoi du bordereau n'a pas eu lieu")
            End
     
        End If
     
        'Nouveau_Bordereau
     
    End Sub
     
     
    Sub enregistrer2()
     
     
    Sheets("Fonctionnement").Select
    If Range("B3") = "" Then
        MsgBox ("Il n'y a pas de date de visite renseignée !")
        End
    Else
        Rep = InputBox("Entrez le nom du représentant" & vbCrLf & "FP pour FP" & vbCrLf & "PDA pour PA" & vbCrLf & "PDU pour PU", "Sélection")
     
        On Error Resume Next
     
        On Error GoTo 0
        Range("L1").Select
        Range("L1").Value = Rep
        Maj
        Range("A1").Select
            If IsEmpty(Range("L1")) Then
                MsgBox ("Merci d'indiquer un représentant!")
            End
         End If
     
    End If
     
    verif_observation
     
    End Sub
     
    Sub enregistrer3()
     
    Sheets("Fonctionnement").Select
    If Range("B3") = "" Then
        MsgBox ("Il n'y a pas de date de visite renseignée !")
        End
    Else
        Rep = InputBox("Entrez le nom du représentant" & vbCrLf & "FP pour Franck P" & vbCrLf & "PDA pour Pascal DA" & vbCrLf & "PDU pour Pascal DU", "Sélection")
     
        On Error Resume Next
     
        On Error GoTo 0
        Range("L1").Select
        Range("L1").Value = Rep
        Maj
        Range("A1").Select
            If IsEmpty(Range("L1")) Then
                MsgBox ("Merci d'indiquer un représentant!")
            End
         End If
     
    End If
     
    End Sub
     
     
    Function Onglets_2()
     
    Dim nomEnregistrement As String
     
    'Initialisation
    Onglets_2 = True
        Sheets("Fonctionnement").Range("I2:I3").Copy
        Range("M1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
        Rep = Range("L1")
        N_Semaine = Range("M1").Value
        Annee = Range("M2").Value
        Semaine = ("S" & N_Semaine & "_" & Annee)
     
     
        fichier = ("Bordereau_" & Rep & "_" & Semaine)
     
        Sheets(Array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi")).Select
        Sheets("Vendredi").Activate
        Application.CutCopyMode = False
        Sheets(Array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi")).Copy
     
     
    nomEnregistrement = Dossier & fichier & ".xls"
       ' on vérifie que le fichier n'existe pas
        If Dir(nomEnregistrement) = "" Then 'cas où le fichier n'existe pas
            ActiveWorkbook.SaveAs Filename:=Dossier & fichier
            MsgBox ("Le fichier " & fichier & ".xls a bien été enregistré dans le répertoire" & vbCrLf & Dossier)
                ActiveWorkbook.Close False
                Sheets("Fonctionnement").Range("A1").Select
        Else
            Msg = ("Le fichier " & fichier & ".xls  existe déjà !" & vbCrLf & vbCrLf & "Voulez-vous le remplacer ?")
            Style = vbYesNo + vbInformation    ' Définit les boutons.
            Title = "Demande"    ' Définit le titre.
     
            Response = MsgBox(Msg, Style, Title) ' Affiche le message.
            If Response = vbYes Then
                Application.DisplayAlerts = False
                ActiveWorkbook.SaveAs Filename:=Dossier & fichier
                Application.DisplayAlerts = True
                MsgBox ("Le fichier " & fichier & ".xls a bien été enregistré dans le répertoire" & vbCrLf & Dossier)
                ActiveWorkbook.Close False
                Sheets("Fonctionnement").Range("A1").Select
            Else
                MsgBox ("Le fichier " & fichier & ".xls n'a pas été enregistré dans le répertoire" & vbCrLf & Dossier)
                ActiveWorkbook.Close False
                Sheets("Fonctionnement").Select
                Range("A1").Select
     
                Onglets_2 = False
            End If
     
        End If
     
     
     
    End Function


    Clairement, j'ai des programmes comme "Sub nettoyage" qui ont été fait car je voudrais que l'utilisateur parte par défaut d'un fichier vierge. Le truc c'est que je ne sais pas comment empêcher l'enregistrement du fichier de base

    J'aurai également souhaiter mettre un menu déroulant dans ma "rep =inputBox" afin que l'utilisateur n'est pas le choix sur la saisie car aujourd'hui s'il tape toto la macro fonctionne quand même.

    Suis-je clair ? vu mon code, je ne pense pas

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

Discussions similaires

  1. Suppression d'une macro VB par une macro : Problème " Mode Arrêt "
    Par CGANE dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/05/2008, 15h50
  2. [VBA-E] Problème de tableau dans macro VBA
    Par Chouls dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 12/06/2006, 15h20
  3. [VBA-E]Problème d'éxécution de macros à l'ouverture d'éxcel
    Par mulot03 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 26/04/2006, 18h02
  4. Réponses: 2
    Dernier message: 20/03/2006, 15h05
  5. [Debug]Problème d'arrêt
    Par le Daoud dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 02/06/2005, 20h18

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