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 :

AJouter un IF{} par code ? [WD-2000]


Sujet :

VBA Word

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 353
    Points : 23 819
    Points
    23 819
    Par défaut AJouter un IF{} par code ?
    Bonjour à tous et merci de votre aide et de votre temps.

    J'ai 4 documents word de publi-postage qui contienne à eux tous environ 500 champs de fusion.

    Il faut que je les modifie pour ajouter un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {IF{Mergefield EstVariable} = "-1" {Ici le code existant} "Ici texte pour quand faux"}
    Quelqu'un a-t-il y moyen de faire cela par code ?.

    Note : Une explication détaillée serait appréciée car ma spécialité c'est Acces et que je débute en Word.

    A+

  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,

    C'est quoi Access ?

    Une piste, c'est peu^t-être pas la meilleure, mais c'est tout ce que j'ai pour l'instant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub AjouterChampDsChamp()
    Dim myFld As Field
    Set myFld = Selection.Fields.Add(Range:=Selection.Range, Type:=wdFieldEmpty, Text:="€")
    myFld.ShowCodes = True
     
    With Selection.Find
        .Text = "€"
        .Execute
    End With
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldDate
     
     
    End Sub
    Le principe est simple, on ajoute un champ avec un texte par exemple €.
    On demande l'affichage du code du champ.
    De cette manière, on peut faire une recherche sur notre texte contenu dans le champ avec la méthode Find de l'objet Selection.
    Si on trouve le caractère, on peut à nouveau ajouter un champ sur la Selection qui se trouve dans le premier champ.

    Essaie le code, il fonction seul et le résultat donne deux champs imbriqués.

    Reviens si ça te convient.

  3. #3
    Membre expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Points : 3 016
    Points
    3 016
    Par défaut
    Bonjour,

    est-ce qu'il y a quelque chose qui nous donne la fin de la partie code existant?
    Parce qu'il y a peut être moyen en jouant sur les InsertBefore et InsertAfter
    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
     
    Sub test()
    Dim a As Field
    Dim chaine As String
    For Each a In Fields
    chaine = "=" & Chr(34) & "-1" & Chr(34)
    a.ShowCodes = True
    a.Select
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
        PreserveFormatting:=False
        a.Select
    Selection.InsertBefore ("IF")
    Selection.InsertAfter (chaine)
    Next
    End Sub
    Ce bout de code insère avant le champ IF dans une zone de champ
    Il insère également après ="-1"

    Il reste à l'adapter en étendant la sélection au texte de départ (code existant)
    avant de faire l'insertion d'un nouveau code de champ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
        PreserveFormatting:=False
    Aller à la fin de cette sélection et insérer après le code si faux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    chaine 2= chr(34) & " " & chr(34) & "code si faux" & chr(34)
    Selection.InsertAfter (chaine2)
    Personnellement j'utiliserai le surlignage par exemple de ce texte (ou saut de paragraphe, un truc du genre qui puisse être recherché).
    Du genre chercher du code de champ et étendre jusqu'au premier caractère non surligné.

  4. #4
    Membre expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Points : 3 016
    Points
    3 016
    Par défaut
    Ceci étant pour ceux que tu veux faire, cela reste relativement simple tant que les champs ne sont pas imbriqués les uns dans les autres

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 353
    Points : 23 819
    Points
    23 819
    Par défaut
    Merci Heureux-oli avec ton code je n'obtiens pas 2 champs imbriqués mais 2 champs côte à côte.

    Ce que je souhaite faire c'est entourer le champ existant par une structure du type if then else.

    Voilà ce que j'obtient avec un de mes IF{} existant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    IF chr(19) MERGEFIELD "IS_TRANSFER" chr(21)="-1" chr(19) MERGEFIELD "P1_Amount" \# "#,##0.00"chr(21) 
     
    MERGEFIELD "IS_TRANSFER"
     
    MERGEFIELD "P1_Amount" \# "#,##0.00"
    Voici le code dont je me suis servi pour afficher cela. Il me semble que c'est toi qui me l'avais donné :-).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Test()
        Dim f As Field
        For Each f In ActiveDocument.Fields
            Debug.Print f.Code
            Debug.Print
        Next f
    End Sub
    Chr(19) et chr(21) sont là pour matérialiser des caractères spéciaux utilisés comme délimiteurs.

    Je pense que ton code est une bonne piste mais je ne vois pas comment l'exploiter.

    Faut-il créer un champ IF{} puis y ajouter le "then" et le "else".

    Si je sélectionne mon champ existant et que je fais [Ctrl}[F9] j'obtiens une inclusion du champ existant dans le nouveau champ.

    A+

    PS : Je pense que tu blaguais mais dans le doute Access c'est Microsoft Access une BD, petite cousine de MS-SQL Server.

    A++

  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,

    J'ai revu mon code et effectivement, il donne deux champs côte à côte si on utilise la première ligne.

    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
     
    Sub AjouterChampDsChamp()
    Dim myFld As Field
    Set myFld = Selection.Fields.Add(Range:=Selection.Range, Type:=wdFieldEmpty, Text:="€")
    myFld.ShowCodes = True
    Selection.HomeKey unit:=wdStory
     
    With Selection.Find
        .Text = "€"
        .Forward = True
        .Execute
    End With
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldDate
     
    End Sub
    Maintenant, on devrait pourvoir mettre la selection sur les champs les uns après les autres.
    Et éventuellement rechercher le code du champ si on le connaît.

  7. #7
    Membre expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Points : 3 016
    Points
    3 016
    Par défaut
    Bonjour,

    Pour imbriquer les deux champs, il faut d'abord sélectionner le premier puis
    faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set myFld = Selection.Fields.Add(Range:=Selection.Range, Type:=wdFieldEmpty, Text:="€")

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 353
    Points : 23 819
    Points
    23 819
    Par défaut
    Merci à vous, je teste cela demain et je vous reviens.

    A+

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 353
    Points : 23 819
    Points
    23 819
    Par défaut
    Bon avec l'inclusion d'un champ dans un champs je n'ai pas trouvé de solution mais voici comment j'ai procédé pour mettre un champ autours d'un champ existant.

    Ce n'est pas très "propre" et cela ne répond qu'à un cas bien particulier mais cela marche.

    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
    Public Sub AjouterTouteCondition()
        'Parcours l'ensemble des champs du Word
     
        Dim f As Field
        Dim defaultValue As String
        Dim estAChanger As String
     
        Selection.HomeKey unit:=wdStory
     
        For Each f In ActiveDocument.Fields
            f.Select
     
            If vbYes = MsgBox("À changer", vbQuestion + vbYesNo + vbDefaultButton2) Then
                defaultValue = InputBox("Valeur par defaut ?", , "___")
                Call AjouterCondition(defaultValue)
                DoEvents
            End If
     
        Next f
     
        Set f = Nothing
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub Test_AjouterCondition()
        Call AjouterCondition(CStr(Time))
    End Sub
    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
    Private Sub AjouterCondition(prmDefaultValue As String)
        'Ajoute un champ IF{ Condition {} ValeurSiFaux } autours du champ actuel
     
        Dim f As Field
     
        Dim defaultValue As String
     
        defaultValue = prmDefaultValue
     
        ActiveDocument.Activate
        SendKeys "^{F9}"
        DoEvents
        SendKeys "{left}{Left}"
        DoEvents
        SendKeys "{right}"
        DoEvents
        SendKeys " IF ChampCondition=""-1"""
        DoEvents
        SendKeys "{right}"
        DoEvents
        SendKeys "+{right}"
        DoEvents
        SendKeys "{right}"
        DoEvents
        SendKeys " """ & defaultValue & """"
        DoEvents
     
        Selection.HomeKey unit:=wdStory
        DoEvents
     
        With Selection.Find
            .Text = "ChampCondition"
            .Forward = True
            .Execute
        End With
        DoEvents
     
        Set f = Selection.Fields.Add(Range:=Selection.Range, Type:=wdFieldMergeField, Text:="""IS_VARIABLE""", preserveformatting:=False)
        f.ShowCodes = True
        DoEvents
     
        Set f = Nothing
    End Sub
    Note les DoEvents sont nécessaires pour forcer Word à exécuter les touches immédiatement sinon il les exécute quand il a le temps et cela fait n'importe quoi dans le document.

    Je vais essayer d'améliorer le traitement des champs pour détecter les champs composés et éviter d'avoir à répondre non pour chaque composant.

    A+

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 353
    Points : 23 819
    Points
    23 819
    Par défaut
    Bon voici la version améliorée qui ne traite pas les composants d'un champ composé.

    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
    Public Sub AjouterTouteCondition()
        Dim f As Field
        Dim defaultValue As String
        Dim estAChanger As String
        Dim cptComposant As Integer: cptComposant = 0
     
        Selection.HomeKey unit:=wdStory
     
        For Each f In ActiveDocument.Fields
     
            If cptComposant = 0 Then
                    'Ne traite que les champs atomiques _
                    ' ou les champs composés mais pas leur compsantes
                    f.Select
     
                    Debug.Print f.Code.Text
                    Debug.Print Selection.Fields.Count
     
                    cptComposant = Selection.Fields.Count - 1
     
                    If vbYes = MsgBox("À changer", vbQuestion + vbYesNo + vbDefaultButton2) Then
                        defaultValue = InputBox("Valeur par defaut ?", , "___")
                        Call AjouterCondition(defaultValue)
                        DoEvents
                    End If
                Else
                    'Ne traite pas les composants internes d'un champ
                    cptComposant = cptComposant - 1
            End If
     
        Next f
     
        Set f = Nothing
     
    End Sub
    A+

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

Discussions similaires

  1. Ajouter des TextBox par code sur un Form
    Par ClubberGuy dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 05/05/2011, 15h47
  2. ajouter une colonne par code SQL
    Par zalalus dans le forum Développement
    Réponses: 5
    Dernier message: 16/07/2010, 17h32
  3. Ajouter des éléments par Code c# sans être autorisé
    Par hassine dans le forum SharePoint
    Réponses: 17
    Dernier message: 12/08/2009, 13h03
  4. Ajouter une ressource par code
    Par SyLvErStOrM dans le forum C#
    Réponses: 8
    Dernier message: 13/03/2008, 10h48
  5. [VB 2005][DatagridView] Ajouter une ligne par code
    Par RaelRiaK dans le forum VB.NET
    Réponses: 3
    Dernier message: 23/01/2007, 22h54

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