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 :

Fonctionnement d'une box d'avertissement [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien méthode
    Inscrit en
    Janvier 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien méthode

    Informations forums :
    Inscription : Janvier 2018
    Messages : 9
    Points : 10
    Points
    10
    Par défaut Fonctionnement d'une box d'avertissement
    Bonjour,

    Je reviens vers vous pour un 2nd problème (1er problème avec contexte).

    J'ai terminé mon fichier, qui fonctionne presque parfaitement. Le presque concerne des boites d'alertes
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FinProgA:
        '*** MESAGE BOX ERREUR DE SAISIE IND ***********************
        MsgBox "Renseigner l'indice de la référence suivant ce format (XX) avec X = une lettre .", vbCritical, "BOITE D'AVERTISSEMENT"
        GoTo FinProgter
    L'objectif de ces boites d'alertes est de prévenir qu'il manque une donnée ou qu'elle est mal renseignée (et au passage interdire de passer à l'étape suivante). Cela fonctionne parfaitement.
    Mon fichier se déroule normalement jusqu'au bouton de fin. Mon fichier s'enregistre automatiquement avec son nom.
    Après cela, j'ai une boite d'alerte qui s'ouvre et demande à être fermée par "userform" qui ont été utilisés.

    Ex :

    Je lance mon fichier, j'ai utilisé 5 "userform", chacun avec ses alertes, je termine, tout est bien rempli, le fichier s'enregistre et ...5 boites d'alertes consécutives à clore.

    J'ai essayé plusieurs solutions :
    - Déplacer l'emplacement du code de ces boites d'alertes.
    - Essayer de dissocier les références appelées par ces boites (c'est toujours le même nom de référence pour chaque alerte dans chaque userform)
    - Avec ou sans enregistrement auto
    - ....

    Mon code sur le bouton de validation qui active ces boites d'alertes :
    Nom : presentation.jpg
Affichages : 201
Taille : 225,4 Ko
    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
     
    '********************************************************************************
    '****************** VALIDATION ASSEMBLAGE****************************************
    '********************************************************************************
    Private Sub SUITE_ASSEMBLAGE_Click()
    On Error Resume Next
     
    '*** TESTER CONDITION ***********************
        If TestCondIND(Len(BOX_REFERENCE2.Value)) = False Then GoTo FinProgA
        If TestCondSTEP(Len(BOX_PRODUCTION.Value)) = False Then GoTo FinProgB
        If TestCondOF(Len(BOX_OF.Value)) = False Then GoTo FinProgC
        If TestCondSN(Len(BOX_SN.Value)) = False Then GoTo FinProgD
        If TestCondNOM(Len(BOX_NOM.Value)) = False Then GoTo FinProgE
     
    Dim VarA As String, VarCpt As Integer
    '****************** Incrémentation ETAPE DE PRODUCTION ***************************
        Dim maVariable0 As String
        maVariable0 = BOX_PRODUCTION
    '****************** Incrémentation Date ******************************************
       Date = Now()
        Dim maVariable1 As String, MyStr
        maVariable1 = Date
        MyStr = Format(Date, ("MM/DD/YYYY"))
    '****************** Incrémentation OF ********************************************
        Dim maVariable2 As String
        maVariable2 = BOX_OF
    '****************** Incrémentation SN ********************************************
        Dim maVariable3 As String
        maVariable3 = BOX_SN
    '****************** Incrémentation TYPOLOGIE *************************************
        Dim maVariable4 As String
        maVariable4 = BOX_TYPOLOGIE
        If Range("i2") = "" Then Range("I2").Value = maVariable4
        If Range("i2") <> "" Then Range("I2") = Range(I2).Value
     
    '****************** Incrémentation ENSEMBLE **************************************
        Dim maVariable5 As String
        maVariable5 = BOX_ENSEMBLE
        If Range("i3") = "" Then Range("I3").Value = maVariable5
        If Range("i3") <> "" Then Range("I3") = Range(I3).Value
     
    '****************** Incrémentation REFERENCE **************************************
        Dim maVariable6 As String
        maVariable6 = BOX_REFERENCE
        If Range("A2") = "" Then Range("A2").Value = maVariable6
        If Range("A2") <> "" Then Range("A2") = Range(A2).Value
     
    '****************** Incrémentation Indice ENSEMBLE *******************************
        Dim maVariable7 As String
        maVariable7 = BOX_REFERENCE2
    '****************** Nom de l'utilsateur ******************************************
        Dim maVariable8 As String
        maVariable8 = Application.UserName
        Range("I5").Value = maVariable8
     
     
    '****************** COMPTEUR *****************************************************
    Range("A1").Select
       VarCpt = Range("A1").Value + 4
     
            ActiveCell(VarCpt, 1).Select
            ActiveCell.Offset(0, 0).Value = maVariable0
            ActiveCell.Offset(0, 1).Value = maVariable1
            ActiveCell.Offset(0, 2).Value = maVariable2
            ActiveCell.Offset(0, 3).Value = maVariable3
            ActiveCell.Offset(0, 4).Value = maVariable7
     
    'userform suivant ********************************
            Unload Me
            VARIABLE_ASSEMBLAGE.Show
    FinProgA:
        '*** MESAGE BOX ERREUR DE SAISIE IND ***********************
        MsgBox "Renseigner l'indice de la référence suivant ce format (XX) avec X = une lettre .", vbCritical, "BOITE D'AVERTISSEMENT"
        GoTo FinProgter
    FinProgB:
        '*** MESAGE BOX ERREUR DE SAISIE STEP ***********************
        MsgBox "Renseigner le domaine d'application (drapage, usinage ou assemblage) .", vbCritical, "BOITE D'AVERTISSEMENT"
        GoTo FinProgter
    FinProgC:
        '*** MESAGE BOX ERREUR DE SAISIE OF ***********************
        MsgBox "Renseigner le numéro d'OF suivant le format XXXXXX .", vbCritical, "BOITE D'AVERTISSEMENT"
        GoTo FinProgter
    FinProgD:
        '*** MESAGE BOX ERREUR DE SAISIE SN ***********************
        MsgBox "Renseigner le numéro d'OF suivant le format XXXXXX (1 à 6 chiffres possible) .", vbCritical, "BOITE D'AVERTISSEMENT"
        GoTo FinProgter
    FinProgE:
        '*** MESAGE BOX ERREUR DE SAISIE SN ***********************
        MsgBox "Renseigner votre nom. .", vbCritical, "BOITE D'AVERTISSEMENT"
        GoTo FinProgter
    FinProgter:
    End Sub

    Le code de test de la condition dans un module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function TestCondIND(CptNbrCar As String) As Boolean
        Select Case CptNbrCar
            Case Is = 2
            TestCondIND = True
            Case Is = ""
            TestCondIND = False
        End Select
    End Function
    Au final, cela ne gêne pas le fonctionnement, c'est simplement désagréable.

    --------------------------------------------
    J'ai une autre question, à laquelle je n'ai pas trouvé de discussion
    Pour éviter de récréer une discussion, savez vous si c'est possible, lors d'un enregistrement automatique, de forcer le choix de l'extension du fichier enregistré(classeur avec macro dans mon cas) ?
    Actuellement mon code ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'ENREGISTREMENT AUTOMATIQUE AVEC NOM
    Dim nom As String
    nom = Range("a2")
    ActiveWorkbook.SaveAs "\\SRVBEDUQ\Industrialisation\Méthodes Composites\ZODIAC\zodiak UK\ASTERIX - Monitoring Méthode" & "\" & nom
    rep = MsgBox("Votre base de données est sauvegardée sous le nom : " & nom, vbYes + vbInformation, "Copie sauvegarde classeur")
    Merci pour votre temps.

    Ps : Si vous souhaitez le fichier, n'hésitez pas.

  2. #2
    Membre actif
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 144
    Points : 223
    Points
    223
    Par défaut
    Bonjour,

    Je vais essayer de ne pas être trop violent de bon matin...

    Ton message me laisse un peu perplexe, sur certains points :
    - sur le codage :
    L'abus de Goto nuit gravement à la santé... Goto, c'est le mal absolu !
    - sur l'utilisation de VBA :
    Si tu avais mis simplement un point d'arrêt sur ta fonction TestCondIND et que tu avais évalué tes variables, tu te serais rendu compte qu'il y a un cactus... En effet, tu passes en argument un entier (Len(BOX_REFERENCE2.Value)) à une fonction qui attend une chaine ((CptNbrCar As String)). De plus, la bienséance veut que dans un Select Case, on prévoie un Case Else. Quoi qu'il en soit, ton retour étant un booléen (donc par défaut à False), il y a de grandes chances que ta fonction retourne faux dans la plupart des cas... même quand tu voudrais qu'il en soit autrement...
    - Sur la méthode :
    Est-il vraiment nécessaire de créer 5 fonctions spécifiques, juste pour renvoyer vrai ou faux en 4 lignes de code ?
    Pourquoi pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub SUITE_ASSEMBLAGE_Click()
    On Error Resume Next
    '*** TESTER CONDITION ***********************
        If TestCondIND(Len(BOX_REFERENCE2.Value)) <> 2 Then 
             MsgBox "Renseigner l'indice de la référence suivant ce format (XX) avec X = une lettre .", vbCritical, "BOITE D'AVERTISSEMENT"
             Exit Sub
        Endif
    etc...
    - Sur la démarche :
    Je préfère largement n'autoriser l'utilisateur à passer à la suite que lorsqu'il a rempli correctement ses zones de saisie, donc à ne valider (rendre actif) le bouton "suite" que lorsque cette condition est remplie, donc à le rendre inactif dès le départ, puis à le "dégriser" que si tout est valide. Un autre solution très employée est, lors du clic sur le bouton "suite" (ou "valider") est de mettre un fond de couleur qui interpelle (.BackColor = vbRed) pour attirer l'attention de l'utilisateur sur un champ mal rempli.

    Bon courage pour ton débugage !
    "Rien ne sert de dire ce qu'on fait, si on ne fait pas ce qu'on dit" (Moi)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien méthode
    Inscrit en
    Janvier 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien méthode

    Informations forums :
    Inscription : Janvier 2018
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Je vais essayer de ne pas être trop violent de bon matin...
    Pas d'inquiétude, je suis très matinale

    - sur le codage :
    L'abus de Goto nuit gravement à la santé... Goto, c'est le mal absolu !
    Après recherche, je comprend pourquoi, et effectivement je me demandais parfois à quoi je faisais référence

    Sur la méthode :
    Sur le moment, cela fonctionnait et cela m'a permis d'avancer sur mon application. Avec le recul, et ma progression dans le vba, je comprend qu'il faut faire plus condensé pour éviter les sources d'erreurs (et surtout éviter de chercher dans tous les coins à quoi on fait référence!)

    Sur la démarche :
    Effectivement, ta démarche est plus douce et plus rapide à l'utilisation. Je vais y regarder, après avoir solutionné mon code actuel (histoire de progresser )


    Code :
    Merci, je vais étudier ta proposition !

    Edit : Ta méthode est plus propre dans le code, je l'ai adopté
    J'ai également trouvé ma solution pour nommer le fichier en .xlsm !
    Merci

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

Discussions similaires

  1. Problèmes sur Get Set d'une variable.
    Par Mattk dans le forum Windows Forms
    Réponses: 5
    Dernier message: 07/04/2007, 01h43
  2. [VB.Net] Problème sur (re)dessin d'une feuille
    Par tomnie dans le forum Windows Forms
    Réponses: 21
    Dernier message: 11/09/2006, 16h52
  3. Encore un problème sur le format d'une date!
    Par bygui dans le forum Langage
    Réponses: 1
    Dernier message: 26/06/2006, 08h41
  4. problème sur l'enregistrement d'une instance
    Par Génie dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 12/05/2006, 10h48
  5. Problème sur la réalisation d'une requête
    Par soso78 dans le forum Access
    Réponses: 1
    Dernier message: 06/10/2005, 13h17

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