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

VBA Word Discussion :

[Signets et remplissage par UserForm] Les signets ne sont pas remplis


Sujet :

VBA Word

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Secrétaire d'une association
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Secrétaire d'une association
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut [Signets et remplissage par UserForm] Les signets ne sont pas remplis
    Bonjour à toutes et tous,

    je suis nouveau sur le forum, mais je vous lis depuis un certain temps.

    Je suis confronté à un problème qui me dépasse. Malgré avoir lu pratiquement tout ce que je trouve sur Internet au sujet des signets et des UserForm, je suis sans solution à ce jour.

    Mon problème se situe dans un fichier modèle Word. Je désire que lorsqu'il est fait appel à ce modèle, le nouveau document créé sur cette base s'ouvre (ça marche, toujours) et qu'il affiche immédiatement un masque (UserForm; ça marche aussi) que l'utilisateur remplira avec les informations de base telles que Auteur (1 et/ou 2), Qualité de celui/ceux-ci, Objet, Date, Annexe(s) (s'il y en a) et Copie(s) à (s'il y en a), notamment. Le but est qu'au final l'utilisateur n'ait plus qu'à rédiger son message et entrer l'adresse (ou faire un publipostage). Ce modèle Word doit être distribué aux membres du comité directeur d'une association qui devrait ainsi tous utilisé le même format/mise en page de document.

    Seulement voilà, tout marche sauf que les signets ne sont pas mis à jour (rempli avec les données du UserForm) et que le fichier n'est pas effectivement sauvegarder (une fois presser sur le bouton ad hoc du UserForm).

    Saurez-vous m'aider ?

    Voici le code rattaché au bouton en question :

    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
     
    Private Sub Button_Intro_Click()
     
     Application.ScreenUpdating = False
     
     'Coloration des Labels en noir / non gras
        LAuteur1.ForeColor = RGB(0, 0, 0)
        LAuteur1.Font.Bold = False
        LAuteur2.ForeColor = RGB(0, 0, 0)
        LAuteur2.Font.Bold = False
        LLieu.ForeColor = RGB(0, 0, 0)
        LLieu.Font.Bold = False
        LQualite1.ForeColor = RGB(0, 0, 0)
        LQualite1.Font.Bold = False
        LQualite2.ForeColor = RGB(0, 0, 0)
        LQualite2.Font.Bold = False
        LObjet.ForeColor = RGB(0, 0, 0)
        LObjet.Font.Bold = False
        LRef.ForeColor = RGB(0, 0, 0)
        LRef.Font.Bold = False
        F_Annexes.ForeColor = RGB(0, 0, 0)
        F_Annexes.Font.Bold = False
        F_Copies.ForeColor = RGB(0, 0, 0)
        F_Copies.Font.Bold = False
     
     
        'Contrôles de contenu
        If TB_Auteur2.Value <> "" Then 'contrôle de l'indication d'un 2e auteur et de sa qualité
            LQualite2.ForeColor = RGB(255, 0, 0)
            LQualite2.Font.Bold = True
            MsgBox "S'il y a un 2e auteur, alors sa qualité doit être mentionnée"
     
        ElseIf TB_Auteur1.Value = "" Then 'Nom et prénom de l'auteur 1 --> Si vide, alors
            LAuteur1.ForeColor = RGB(255, 0, 0) 'label en rouge
            LAuteur1.Font.Bold = True 'et gras
            LRem.ForeColor = RGB(255, 0, 0) 'Colore aussi la remarque en bas en rouge
            LRem.Font.Bold = True ' et gras
     
        ElseIf TB_Qualite1.Value = "" Then 'Qualité de l'auteur 1
            LQualite1.ForeColor = RGB(255, 0, 0)
            LQualite1.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf TB_Lieu.Value = "" Then 'Lieu
            LLieu.ForeColor = RGB(255, 0, 0)
            LLieu.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf TB_Objet.Value = "" Then 'Objet
            LObjet.ForeColor = RGB(255, 0, 0)
            LObjet.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf TB_Ref.Value = "" Then 'No de référence
            LRef.ForeColor = RGB(255, 0, 0)
            LRef.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf OB_Annexes_oui.Value Or OB_Annexes_non.Value = 0 Then 'Choix Annexes
            F_Annexes.ForeColor = RGB(255, 0, 0)
            F_Annexes.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf OB_Annexes_oui.Value = 1 And TB_Annexes.Value = "" Then
            MsgBox "S'il y a une ou des annexes, prière de la/les mentionner"
     
        ElseIf OB_Copies_oui.Value Or OB_Copies_non.Value = 0 Then 'Choix Copies
            F_Copies.ForeColor = RGB(255, 0, 0)
            F_Copies.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf OB_Copies_oui.Value = 1 And TB_Copies.Value = "" Then
            MsgBox "S'il y a une ou des copies à adresser, prière d'indiquer les destinataires"
     
        Else
        With ActiveDocument
        .Bookmarks("Lieu").Range.Text = UserForm1.TB_Lieu.Value
        .Bookmarks("Date").Range.Text = UserForm1.DTPicker1.Value
        .Bookmarks("Objet").Range.Text = UserForm1.TB_Objet.Value
        .Bookmarks("ref_AFS").Range.Text = UserForm1.TB_Ref.Value
        .Bookmarks("Auteur1").Range.Text = UserForm1.TB_Auteur1.Value
        .Bookmarks("Auteur2").Range.Text = UserForm1.TB_Auteur2.Value
        .Bookmarks("Qualite1").Range.Text = UserForm1.TB_Qualite1.Value
        .Bookmarks("Qualite2").Range.Text = UserForm1.TB_Qualite2.Value
        .Bookmarks("Annexes").Range.Text = UserForm1.TB_Annexes.Value
        .Bookmarks("copies_a").Range.Text = UserForm1.TB_Copies.Value
     
        End With
     
        End If
     
    Application.ScreenUpdating = True
     
    Unload Me 'ferme le masque
     
    With Application.FileDialog(msoFileDialogSaveAs)
        .Title = "Sauvegarde du document AFS créé"
        .InitialFileName = Format(Date) & " - " & TB_Objet.Value & ".docx"
        .Show
    End With
     
    End Sub
    Les contrôles quant au contenu des TextBox du UserForm ne sont pas tous au poil non plus, mais je peux vivre avec ... Quoique je suis preneur d'un bout de code qui me contrôle que si mes RadioButton sont sur "Oui" alors il faut que le TextBox qui est à côté soit non vide. J'ai essayé de le faire mais ça ne marche pas comme je veux (pas toute la logique n'est transposée en code).

    Merci de votre aide

    Gaël

  2. #2
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Je pense que c'est ta structure If qui n'est pas bonne.

    Tu devrais sortir le remplissage du document de cette structure décisionnelle.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Secrétaire d'une association
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Secrétaire d'une association
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci Heureux-oli,

    Je sais que cette structure est longue, mais nécessaire pour le contrôle du contenu des cellules. Je ne peux pas vraiment y renoncer.

    Entre temps, j'ai modifié mon code :

    De ceci,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     ...
    Unload Me 'ferme le masque
     
    With Application.FileDialog(msoFileDialogSaveAs)
        .Title = "Sauvegarde du document AFS créé"
        .InitialFileName = Format(Date) & " - " & TB_Objet.Value & ".docx"
        .Show
    End With
     
    End Sub
    je suis passé à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     ... 
    With Application.FileDialog(msoFileDialogSaveAs)
        .Title = "Sauvegarde du document AFS créé"
        .InitialFileName = Format(Date) & " - " & TB_Objet.Value & ".docx"
        .Show
    End With
     
    Unload Me 'ferme le masque
     
    End Sub
    Avec pour conséquence que les données du formulaire sont maintenant bien reprise dans le fichier.

    Toutefois, malgré l'appel de la "boîte de dialogue de sauvegarder sous" et la reprise du champ "Objet" du formulaire dans le nom du fichier, il apparaît que le fichier n'est pas sauvegardé, même après avoir choisi un emplacement et pressé sur "enregistrer".

    Quid ?

    J'ai toujours besoin de votre aide.

    Merci

    Gaël

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    essaie après ton show de faire un execute.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Secrétaire d'une association
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Secrétaire d'une association
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci Heureux-oli,

    La sauvegarde marche, mais maintenant les données du formulaires ne sont plus introduite dans le document.

    Rhhaaa ... c'est à s'arracher les cheveux.

    Mon but est lorsqu'un utilisateur utilise le modèle, à l'ouverture le masque de saisie d'affiche, il le remplisse aussi intégralement et logiquement que possible puis lorsqu'il a terminé clique sur un bouton qui va mettre les données du formulaire dans le document et lui proposer immédiatement après ça de sauvegarder le document sous un nom prédéfini (aaaa.mm.jj - [objet de la lettre].docx).

    Quid du code actuel ?
    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
     
    Private Sub Button_Intro_Click()
     
     Application.ScreenUpdating = False
     
     'Coloration des Labels en noir / non gras
        LAuteur1.ForeColor = RGB(0, 0, 0)
        LAuteur1.Font.Bold = False
        LAuteur2.ForeColor = RGB(0, 0, 0)
        LAuteur2.Font.Bold = False
        LLieu.ForeColor = RGB(0, 0, 0)
        LLieu.Font.Bold = False
        LQualite1.ForeColor = RGB(0, 0, 0)
        LQualite1.Font.Bold = False
        LQualite2.ForeColor = RGB(0, 0, 0)
        LQualite2.Font.Bold = False
        LObjet.ForeColor = RGB(0, 0, 0)
        LObjet.Font.Bold = False
        LRef.ForeColor = RGB(0, 0, 0)
        LRef.Font.Bold = False
        F_Annexes.ForeColor = RGB(0, 0, 0)
        F_Annexes.Font.Bold = False
        F_Copies.ForeColor = RGB(0, 0, 0)
        F_Copies.Font.Bold = False
     
     
        'Contrôles de contenu
        If TB_Auteur2.Value <> "" Then 'contrôle de l'indication d'un 2e auteur et de sa qualité
            LQualite2.ForeColor = RGB(255, 0, 0)
            LQualite2.Font.Bold = True
            MsgBox "S'il y a un 2e auteur, alors sa qualité doit être mentionnée"
     
        ElseIf TB_Auteur1.Value = "" Then 'Nom et prénom de l'auteur 1 --> Si vide, alors
            LAuteur1.ForeColor = RGB(255, 0, 0) 'label en rouge
            LAuteur1.Font.Bold = True 'et gras
            LRem.ForeColor = RGB(255, 0, 0) 'Colore aussi la remarque en bas en rouge
            LRem.Font.Bold = True ' et gras
     
        ElseIf TB_Qualite1.Value = "" Then 'Qualité de l'auteur 1
            LQualite1.ForeColor = RGB(255, 0, 0)
            LQualite1.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf TB_Lieu.Value = "" Then 'Lieu
            LLieu.ForeColor = RGB(255, 0, 0)
            LLieu.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf TB_Objet.Value = "" Then 'Objet
            LObjet.ForeColor = RGB(255, 0, 0)
            LObjet.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf TB_Ref.Value = "" Then 'No de référence
            LRef.ForeColor = RGB(255, 0, 0)
            LRef.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf OB_Annexes_oui.Value Or OB_Annexes_non.Value = 0 Then 'Choix Annexes
            F_Annexes.ForeColor = RGB(255, 0, 0)
            F_Annexes.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf OB_Annexes_oui.Value = 1 And TB_Annexes.Value = "" Then
            MsgBox "S'il y a une ou des annexes, prière de la/les mentionner"
     
        ElseIf OB_Copies_oui.Value Or OB_Copies_non.Value = 0 Then 'Choix Copies
            F_Copies.ForeColor = RGB(255, 0, 0)
            F_Copies.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf OB_Copies_oui.Value = 1 And TB_Copies.Value = "" Then
            MsgBox "S'il y a une ou des copies à adresser, prière d'indiquer les destinataires"
     
        Else
        With ActiveDocument
        .Bookmarks("Lieu").Range.Text = UserForm1.TB_Lieu.Value
        .Bookmarks("Date").Range.Text = UserForm1.DTPicker1.Value
        .Bookmarks("Objet").Range.Text = UserForm1.TB_Objet.Value
        .Bookmarks("ref_AFS").Range.Text = UserForm1.TB_Ref.Value
        .Bookmarks("Auteur1").Range.Text = UserForm1.TB_Auteur1.Value
        .Bookmarks("Auteur2").Range.Text = UserForm1.TB_Auteur2.Value
        .Bookmarks("Qualite1").Range.Text = UserForm1.TB_Qualite1.Value
        .Bookmarks("Qualite2").Range.Text = UserForm1.TB_Qualite2.Value
        .Bookmarks("Annexes").Range.Text = UserForm1.TB_Annexes.Value
        .Bookmarks("copies_a").Range.Text = UserForm1.TB_Copies.Value
     
        End With
     
        End If
     
    Application.ScreenUpdating = True
     
    With Application.FileDialog(msoFileDialogSaveAs)
        .Title = "Sauvegarde du document AFS créé"
        .InitialFileName = Format(Date) & " - " & TB_Objet.Value & ".docx"
        .Show
        .Execute
    End With
     
    Unload Me 'ferme le masque
     
    End Sub
    Merci de votre aide.

    Gaël

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Je pense que tes données ne sont plus introduites à cause de ta structure IF.
    La méthode que j'utilise dans ce cas est un test pour chaque TextBox et si le test est False, je fais un SetFocus sur le TextBox, un message et une sortie de procédure.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Secrétaire d'une association
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Secrétaire d'une association
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Re Heureux-oli,

    Merci de cette remarque.

    Je vois bien la lourdeur de ces contrôles qui utilisent la fonction "If" et l'intérêt d'un contrôle par test avec "True"/"False". Mais je ne vois pas comment construire le contrôle de cette manière.

    A la base, mon idée était de contrôle tous les champs et de signaler tous les champs qui ne sont pas "en ordre" (c'est à dire rempli correctement). En construisant le contrôle en "If", je trouve que c'est long et qu'en plus il y a le défaut que le processus ne signale qu'une erreur après l'autre dans l'ordre du code.

    Y aurait-il un moyen ce construire le contrôle des champs avec un "For", "Each". Du genre, "SetFocus" sur tous les champs non remplis ?

    J'avoue que je sèche et que je suis tellement parti sur la piste des "If" que je ne sais plus quoi faire.

    Le code des contrôles à changer serait le suivant (j'ai rajouté des commentaires pour expliquer mes buts) :
    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
     
    ...
        'Contrôles de contenu
    rem comme dans mon masque il y a deux auteurs possible (personnes qui signeront le document), alors je veux que si le rédacteur du courrier met un nom pour un deuxième auteur, alors il faut obligatoirement indiqué en quelle qualité le deuxième auteur signe. J'ai rajouté ce contrôle à la fin de mon processus de réflexion. Ce contrôle est un peu à part dans la logique. Je précise encore que la MsgBox ne fonctionne pas.
        If TB_Auteur2.Value <> "" Then 'contrôle de l'indication d'un 2e auteur et de sa qualité 
            LQualite2.ForeColor = RGB(255, 0, 0)
            LQualite2.Font.Bold = True
            MsgBox "S'il y a un 2e auteur, alors sa qualité doit être mentionnée"
     
    rem contrôle sur les champs pour vérifier un à un qu'ils sont remplis, si vide alors modification du label en rouge et gras
        ElseIf TB_Auteur1.Value = "" Then 'Nom et prénom de l'auteur 1 --> Si vide, alors
            LAuteur1.ForeColor = RGB(255, 0, 0) 'label en rouge
            LAuteur1.Font.Bold = True 'et gras
            LRem.ForeColor = RGB(255, 0, 0) 'Colore aussi la remarque en bas en rouge
            LRem.Font.Bold = True ' et gras
     
        ElseIf TB_Qualite1.Value = "" Then 'Qualité de l'auteur 1
            LQualite1.ForeColor = RGB(255, 0, 0)
            LQualite1.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf TB_Lieu.Value = "" Then 'Lieu
            LLieu.ForeColor = RGB(255, 0, 0)
            LLieu.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf TB_Objet.Value = "" Then 'Objet
            LObjet.ForeColor = RGB(255, 0, 0)
            LObjet.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
        ElseIf TB_Ref.Value = "" Then 'No de référence
            LRef.ForeColor = RGB(255, 0, 0)
            LRef.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
    Rem ici il s'agit de OptionButton dans un Frame, soit NON, soit OUI, je veux obliger à répondre à cette option        
        ElseIf OB_Annexes_oui.Value Or OB_Annexes_non.Value = 0 Then 'Choix Annexes
            F_Annexes.ForeColor = RGB(255, 0, 0)
            F_Annexes.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
     Rem Ici je cherche à imposer de remplir un champ ("TB_Annexes") si le "OptionButton" est sur OUI. Ça ne marche pas.      
        ElseIf OB_Annexes_oui.Value = 1 And TB_Annexes.Value = "" Then
            MsgBox "S'il y a une ou des annexes, prière de la/les mentionner"
     
    Rem idem que si dessus, mais pour un autre OptionButton       
        ElseIf OB_Copies_oui.Value Or OB_Copies_non.Value = 0 Then 'Choix Copies
            F_Copies.ForeColor = RGB(255, 0, 0)
            F_Copies.Font.Bold = True
            LRem.ForeColor = RGB(255, 0, 0)
            LRem.Font.Bold = True
     
    Rem idem que ci dessus mais pour un autre OptionButton       
        ElseIf OB_Copies_oui.Value = 1 And TB_Copies.Value = "" Then
            MsgBox "S'il y a une ou des copies à adresser, prière d'indiquer les destinataires"
    ...
    J'en suis au point de me demander si qqn aurait pas un début de code que je puisse terminer.

    Merci de votre aide.

  8. #8
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Ça reste des If, mais un seul If par contrôle.

    Pour le débogage, c'est plus facile à maintenir.

    Le For Each Next pourrait le faire aussi.

    PS : au lieu de mettre des Rem, utilise une '
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Secrétaire d'une association
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Suisse

    Informations professionnelles :
    Activité : Secrétaire d'une association
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci Heureux-oli,

    Vos conseils ont eu un l'effet d'une cure d'amaigrissment de mon
    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
     
    Private Sub Button_Intro_Click()
     
     Application.ScreenUpdating = False
     
     Dim Ctrl As Control
     
        For Each Ctrl In UserForm1.Controls
     
                If TypeOf Ctrl Is MSForms.TextBox And Left(Ctrl.Name, 2) = "TB" Then
                Ctrl.BackColor = RGB(255, 255, 255)
                End If
     
                If TypeOf Ctrl Is MSForms.TextBox And Left(Ctrl.Name, 3) = "TB_" Then
                   If Ctrl.Text = "" Then
                   With Ctrl
                   .BackColor = RGB(200, 220, 255)
                   End With
                   Exit Sub
                   End If
                End If
     
        Next Ctrl
     
     
     
        With ActiveDocument
        .Bookmarks("Lieu").Range.Text = UserForm1.TB_Lieu.Value
        .Bookmarks("Date").Range.Text = UserForm1.DTPicker1.Value
        .Bookmarks("Objet").Range.Text = UserForm1.TB_Objet.Value
        .Bookmarks("ref_AFS").Range.Text = UserForm1.TB_Ref.Value
        .Bookmarks("Auteur1").Range.Text = UserForm1.TB_Auteur1.Value
        .Bookmarks("Auteur2").Range.Text = UserForm1.TBO_Auteur2.Value
        .Bookmarks("Qualite1").Range.Text = UserForm1.TB_Qualite1.Value
        .Bookmarks("Qualite2").Range.Text = UserForm1.TBO_Qualite2.Value
        .Bookmarks("Annexes").Range.Text = UserForm1.TBO_Annexes.Value
        .Bookmarks("copies_a").Range.Text = UserForm1.TBO_Copies.Value
     
        End With
     
    Application.ScreenUpdating = True
     
    With Application.FileDialog(msoFileDialogSaveAs)
        .Title = "Sauvegarde du document AFS créé"
        .InitialFileName = Format(Date) & " - " & TB_Objet.Value & ".docx"
        .Show
        .Execute
    End With
     
    Unload Me 'ferme le masque
     
    End Sub
    Ça marche beaucoup mieux. Mais j'arrive pas à implémenter deux contrôles (j'y arrivais déjà pas dans la version précédente du code) :

    1. Contrôler que si une réponse n'a pas été choisie dans les deux "OptionButton" il faut en choisir une (comment mettre le focus sur le Frame qui entoure les deux OptionButtons "oui et "non")
    2. Contrôler que pour chaque OptionButton qui est sur "oui" alors le champ correspondant "TBO_..." est bien renseigné
    3. en option, je voudrais encore induire que si un champ est renseigné ("Auteur2") alors il faut aussi remplir le champ à côté ("Qualité2)


    Des idées ?

    je suis encore novice ...

    merci de votre aide.

    Gaël

  10. #10
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    On peut y accéder avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Frame1.Controls(1).Value
    Pour le focus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Frame1.Controls(0).SetFocus
    Pour le reste, c'est à nouveau un jeu de conditions.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

Discussions similaires

  1. Réponses: 14
    Dernier message: 23/06/2014, 08h55
  2. cacher un bouton tant que les input ne sont pas remplis
    Par carl_stage_b dans le forum jQuery
    Réponses: 14
    Dernier message: 14/02/2012, 11h28
  3. Réponses: 1
    Dernier message: 04/12/2005, 18h02
  4. Les Langages ne sont pas tous les mêmes ......
    Par Max Payne dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 28/08/2003, 13h51

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