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 :

boucle pour des tests de répétition [WD-2003]


Sujet :

VBA Word

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 57
    Points : 27
    Points
    27
    Par défaut boucle pour des tests de répétition
    Bonjour à tous!

    Je construis un doc word grâce à une macro :
    - en cliquant sur un bouton, l'utilisateur rajoute sur le doc un certain nombre d'éléments pré-formatés ;
    - a chaque fois que cette manip est réalisée, la macro envoie une inputbox permettant de saisir un titre, qui sera utilisé pour alimenter les éléments pré-formatés.

    Mon problème : je souhaite que l'utilisateur ne puisse pas saisir 2 fois le même titre, donc je demande à la macro de vérifier les titres existants. Si la saisie correspond à un titre qui existe déjà, un message d'erreur apparaît et une inputbox permet de saisir à nouveau un titre => c'est ce nouveau titre que j'aimerais vérifier. Pour ça, je voulais faire une boucle permettant de reprendre la procédure de vérification.
    Je comprend pas comment marchent les boucles sous word : soit je me retrouve avec des boucles infinies, soit ma boucle ne tourne pas.

    Ca fait un moment que je sèche là dessus. Y aurait-il une bonne âme pour m'aider?
    Voici mon 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
    Sub AjoutActivite()
    
    'Déclaration des variables:
    Dim NbTableaux As Integer 'nombre de tableaux
    Dim NomActivite As String 'nom de l'activité
    Dim NumActivite As String 'numero de l'activité
    Dim NumTableau As Integer 'numero de tableau
    Dim Redondance As Boolean
    
    'Compte le nb de tableaux
    NbTableaux = ActiveDocument.Tables.Count 
       
    'Ajout du tableau de présentation de l'activité
    ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=1, NumColumns:=1, DefaultTableBehavior:=wdWord9TableBehavior
    'Actualisation du nb de tableaux
    NbTableaux = ActiveDocument.Tables.Count
     
    'Mise en forme du tableau
        Selection.Columns.SetWidth ColumnWidth:=InchesToPoints(3), RulerStyle:=wdAdjustProportional
        [...]   
     'Empêcher fractionnement du tableau
        ActiveDocument.Tables(NbTableaux).AllowPageBreaks = False
         
        
        'Saisie du titre
        NomActivite = InputBox("Saisissez le nom de l'activité", "")
         
        ' début de la boucle sur le nom de l'activité
        Do While Not Redondance '=> c'est là que ça coince
    
        ' Vérifier les redondances de nom d'activité
        For NumTableau = 2 To NumActivite + 1
        ActiveDocument.Tables(NumTableau).Select
        With Selection.Find
            .Text = NomActivite
            Chercher = .Execute
            'Fin = .Found = False
            If Selection = NomActivite Then
            MsgBox ("ATTENTION!" + Chr(13) + "Vous avez déjà utilisé ce nom pour nommer une activité.")
            NomActivite = InputBox("Veuillez saisir un autre nom d'activité", "Nom de l'activité")
            Redondance = True '=> je veux que si on a trouvé une répétition et saisi un autre titre, on retourne au début du processus de vérification des résultats
            End If
        Redondance = False '=> Si pas de répétition, on continue la suite du processus
    
        End With
        Next
        
     Loop 'fin de la boucle sur le nom de l'activité
    
    [suite de min programme]
    
    [...] end sub

  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,

    tu fais ta recherche tableau après tableau ?

    Pourquoi ne pas faire une recherche globale ?
    Tu éviterais une boucle sur les tableaux.
    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 membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    Effectivement, j'aurais pu sélectionner l'ensemble de mes tableaux et faire la recherche sur cette sélection, mais je ne sais pas sélectionner plusieurs tableaux en même temps. En plus, cette boucle là, elle marche bien.

    Ce qui ne va pas, c'est la boucle pour vérifier que l'utilisateur n'a pas resaisi un titre qui existait déjà. (je me dis que s'il l'a fait 1 fois, il peut très bien recommencer...). Je ne comprend pas comment marche les contraintes sous word, du coup, je n'arrive pas à sortir de la boucle.

  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,

    Pas besoin de boucle du tout.

    la fonction Find permet de faire une recherche sur le contenu de la Main Story du document. Si elle contient des tableaux, ils sont inclus dans la recherche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        Selection.Find.ClearFormatting
        With Selection.Find
            .Text = "nu"
            .Forward = True
            .Wrap = wdFindContinue
            Debug.Print .execute
        End With
    Le .Execute renvoie Vrai si le texte est trouvé, faux dans le cas contraire.

    Le fait de faire une boucle sur les tableaux n'est pas grave en soi, mais il va prendre beaucoup de ressources et de temps.
    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 membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    OK je vais essayer ça, mais j'ai 3 questions :
    - ça veut dire quoi "main story" ?

    - Ok pour le .execute, mais à quoi sert le Debug.Print ?

    - Comment j'exploite mon .execute ? ce qui m'intéresse, c'est de rentrer un autre titre s'il renvoie "vrai", et de laisser courir s'il renvoie "faux"

  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,

    Main Story est le contenu du document, mais le corps du document.
    ce qui est contenu dans l'en-tête et le pied de page ne fonctionne pas, ni ce qui se trouve dans des TextBoxes.

    Debug.Print
    Si tu utilises la combinaison de touche Alt + G dans le VBE tu fais apparaître une fenêtre exécution.
    debug.Print provoque l'affichage d'une valeur dans cette fenêtre.
    En l'occurence, la méthode .Execute renvoie la valeur Vrai si la recherche a été fructueuse.

    Pour la troisième interrogation, tu dois exploiter le .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 !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    Bonjour à tous !

    Merci pour les infos. J'ai modifié mon code grâce à vos conseils, mais je sèche toujours sur la boucle qui m'avait amenée vers vous. J'arrive bien à trouver si la saisie utilisateur est déjà dans mon doc, et dans ce cas à proposer une nouvelle saisie.
    Je n'arrive toujours pas à vérifier cette seconde saisie en bouclant sur ma vérification.

    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
    Dim NomActivite As String 'nom de l'activité
    
    [...]
    
       NomActivite = InputBox("Saisissez le nom de l'activité", "")
       
      Début boucle
       
       Selection.Find.ClearFormatting
        With Selection.Find
            .Text = NomActivite
            .Forward = True
            .Wrap = wdFindContinue
            Debug.Print .Execute
        End With
        
        If Selection.Find.Found Then
            NomActivite = InputBox("ATTENTION!" + Chr(13) + "Vous avez déjà utilisé ce nom pour nommer une activité." + Chr(13) + Chr(13) + "Veuillez saisir un autre nom d'activité:", "Nom de l'activité")
        End If
        
          Fin boucle
    
    [...]

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    Bon, finalement, j'ai fini par tomber sur un bout de code que j'ai pu adapter au mien et ça a l'air de marcher.
    Merci pour votre aide
    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
     
    Sub Toto
     
    [...]
    Dim Redondance As Find
     
    'Saisie du nom de l'activité
    NomActivite = InputBox("Saisissez le nom de l'activité", "")
    If NomActivite = "" Then Exit Sub 'gestion du bouton annuler
     
    Set Redondance = Selection.Find 'définition de la fonction rechercher
        With Redondance
            .ClearFormatting 'Annuler les formats
            .Forward = True 'Chercher vers le début du doc
     
            While Redondance.Execute(findtext:=NomActivite) 'début de la boucle de recherche
            'Msg d'erreur + Nouvelle saisie du nom d'activité
            NomActivite = InputBox("ATTENTION!" + Chr(13) + "Vous avez déjà utilisé ce nom pour nommer une activité." + Chr(13) + Chr(13) + "Veuillez saisir un autre nom d'activité:", "Nom de l'activité")
            If NomActivite = "" Then Exit Sub 'gestion du bouton annuler
            Selection.HomeKey unit:=wdStory 'se remettre au début du doc
            Wend 'fin de la boucle
     
       End With
     
    [...]
    End sub

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    Fausse joie...
    Ca boucle pas si bien que ça...

    Edit : il semblerait que l'action de rechercher modifie la sélection. Il faut rajouter une ligne à la fin de la boucle pour se remettre au début du document. J'ai modifié mon bout de code dans le message précédent

  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,

    Je ne comprend pas la raison de la boucle ?
    Le dernier code que je t'ai donnée effectue la recherche sur tout le document, il n'est donc plus nécessaire de faire une boucle !


    Si tu trouves une valeur True à .Execute, c'est que le titre existe déjà.


    Donc,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Dim booTrouve As Boolean
     
    Selection.Find.ClearFormatting
        With Selection.Find
            .Text = "nu"
            .Forward = True
            .Wrap = wdFindContinue
            booTrouve =  .execute
        End With
    If booTrouve Then 
       MsgBox "Ce titre Existe déjà !"
    End If
    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 !

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 57
    Points : 27
    Points
    27
    Par défaut
    En fait, je dois boucler pour vérifier que l'utilisateur ne saisit pas à nouveau un nom qui apparaît dans le document.
    Par exemple : 1 ere saisie => l'utilisateur tape "x"
    le code vérifie que "x" n'est pas déjà utilisé. Si "x" est déjà utilisé, alors l'utilisateur doit à nouveau saisir un nom (2eme saisie).
    Sans la boucle, si l'utilisateur retape "x", ou tape "y" et que "y" existe déjà lui aussi, la macro continue son boulot sans voir la répétition. Au final, je risque de me retrouver avec 2 fois le même titre, et ça me posera problème lors de l'exploitation du fichier.

  12. #12
    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,

    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
     
    Dim booTrouve As Boolean
    Dim stNouvTitre As String
     
    Do 
    stNouvTitre = Inputbox "Entrez un titre"
     
    Selection.Find.ClearFormatting
        With Selection.Find
            .Text = "nu"
            .Forward = True
            .Wrap = wdFindContinue
            booTrouve =  .execute
        End With
    Loop While booTrouve
    Si tu veux en apprendre plus sur les boucles ?
    http://heureuxoli.developpez.com/off...age=page12#L12
    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 !

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

Discussions similaires

  1. outil supportant les dialectes Xml pour des tests
    Par saw-next dans le forum XQUERY/SGBD
    Réponses: 1
    Dernier message: 28/06/2010, 17h12
  2. Réponses: 0
    Dernier message: 28/04/2010, 18h21
  3. [PHP 5.0] Faire une boucle pour des noms de variable
    Par lonyc dans le forum Langage
    Réponses: 2
    Dernier message: 09/12/2009, 17h19
  4. [Outils] Quelle stratégie pour des tests unitaires BDD
    Par hecatonchire dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 21/04/2006, 10h20

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