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 :

Afficher un userform tant qu'une condition n'est pas realisée


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut Afficher un userform tant qu'une condition n'est pas realisée
    Chères amies, chers amis du forum

    Je souhaitent creer une boucle qui afficherais un message d'erreur avec un bouton pour continuer tant qu une condition n'est pas réalisé.

    En gros l'algo fais ceci:

    -Test la condition
    -Si condition n'est pas réalisé alors affichage d'un message, freeze de la macro tant qu'il n y'a pas de nouvelle proposition
    -si correction OK fin sinon on repart pour une itération.

    Auriez vous une idées SVP?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Bonjour,

    Si ça se passe dans un UserForm, tu pourrais utiliser QueryClose pour empêcher de sortir par la croix
    Un exemple simple qui garde le Userform visible tant que le 1 n'est pas entré.
    À toi de gérer ta validation

    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
    Private OK As Boolean
     
    Private Sub cmdOK_Click()
        If Valider Then
            OK = True
            Unload Me
        End If
    End Sub
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        If OK = False Then Cancel = True
    End Sub
     
    Function Valider() As Boolean
        Dim Rep
     
        Rep = InputBox("Entrer un chiffre" & vbCrLf & "1 pour fermer", "Validation")
        If Rep = "1" Then
            OK = True
            Valider = True
        End If
    End Function
    MPi²

  3. #3
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Merci beaucoup pour la piste

  4. #4
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonsoir le fil, bonsoir le forum,

    Si le but du jeu est d'obliger l'utilisateur à renseigner tous (ou certains) champs d'une UserForm, alors un petit exemple commenté en pièce jointe. Voir la propriété [Tag] d'un contrôle pour renvoyer sa valeur dans la bonne colonne et le nom les labels pour les messages : "L" plus le nom du contrôle associé (LTextBox1, LCombobox1, etc.)
    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
    Option Explicit 'oblige à déclarer toutes les variables
    Private B As Object 'déclare la variable B (onglet Base)
    Private L As Object 'déclare la variable L (onglet Liste)
     
     
    Private Sub UserForm_Initialize()
    Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
    Dim PL As Range 'déclare la variable PL (Plage)
     
    Set B = Sheets("Base") 'définit l'onglet B
    Set L = Sheets("Listes") 'définit l'onglet L
    DL = L.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 1 (=A) de l'onglet L
    Set PL = L.Range("A2: A" & DL) 'définit la plage PL
    Me.ComboBox1.List = PL.Value 'alimente la ComboBox1
    End Sub
     
     
    Private Sub CommandButton1_Click() 'bouton "OK"
    Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)
    Dim LI As Integer 'déclare la variable LI (LIgne)
     
    '***************************************************************
    'code pour obliger l'utilisateur à renseigner toutes les données
    '***************************************************************
    For Each CTRL In Me.Controls 'boucle sur tous les contrôles de l'UserForm
        'condition 1 : si le contrôle est une textbox ou une combobox
        If TypeOf CTRL Is MSForms.TextBox Or TypeOf CTRL Is MSForms.ComboBox Then
            If CTRL.Value = "" Then 'condition 2 : si le contrôle est vide
                'message reprenant la caption de la label associée au contrôle (voir propriété [Name] de la label)
                MsgBox "Vous devez renseigner le champ : " & Me.Controls("L" & CTRL.Name).Caption & " !"
                CTRL.SetFocus 'place le curseur dans le contrôle vide
                Exit Sub ' sort de la procédure
            End If 'fin de la condition 2
        End If 'fin de la condition 1
    Next CTRL 'nouveau contrôle de la boucle
     
    '*********************************************
    'code pour envoyer les données dans le tableau
    '*********************************************
    'définit la dernière ligne édité LI de la colonne 2 (=B) de l'onglet B
    LI = B.Cells(Application.Rows.Count, 2).End(xlUp).Row + 1
    For Each CTRL In Me.Controls 'boucle sur tous les contrôles de l'UserForm
        'condition : si le contrôle est une textbox ou une combobox
        If TypeOf CTRL Is MSForms.TextBox Or TypeOf CTRL Is MSForms.ComboBox Then
                'renvoie la valeur du contrôle dans la cellule ligne : Li, colonne : voir propriété [Tag] du contrôle de l'onglet B
                B.Cells(LI, CInt(CTRL.Tag)).Value = CTRL.Value
        End If 'fin de la condition
    Next CTRL 'prochain contrôle de la boucle
     
    Unload Me 'vide et ferme l'UserForm
    End Sub
     
     
    Private Sub CommandButton2_Click() 'bouton "Annuler"
    Unload Me 'vide et ferme l'UserForm
    End Sub
    Le fichier :
    Fichiers attachés Fichiers attachés
    À plus,

    Thauthème

    Je suis Charlie

Discussions similaires

  1. Réponses: 8
    Dernier message: 04/08/2010, 11h29
  2. Réponses: 4
    Dernier message: 06/03/2010, 11h29
  3. Réponses: 2
    Dernier message: 17/06/2009, 23h42
  4. Blocage tant qu'une fenêtre n'est pas fermé
    Par lodan dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/09/2006, 07h40

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