Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Word > VBA Word
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/12/2010, 18h23   #1
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 450
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 450
Points : 7 522
Points : 7 522
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 :
{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+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 19h21   #2
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 315
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

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

Informations forums :
Inscription : février 2006
Messages : 17 315
Points : 29 213
Points : 29 213
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 :
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.
__________________
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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 22h14   #3
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 983
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

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

Informations forums :
Inscription : février 2010
Messages : 983
Points : 1 590
Points : 1 590
Envoyer un message via MSN à carden752
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 :
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 :
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 :
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é.
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 22h17   #4
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 983
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

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

Informations forums :
Inscription : février 2010
Messages : 983
Points : 1 590
Points : 1 590
Envoyer un message via MSN à carden752
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
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 22h21   #5
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 450
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 450
Points : 7 522
Points : 7 522
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 :
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 :
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++
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 22h35   #6
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 315
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

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

Informations forums :
Inscription : février 2006
Messages : 17 315
Points : 29 213
Points : 29 213
Salut,

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

Code :
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.
__________________
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 !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 22h57   #7
Modérateur
 
Homme Christophe CHAPAT
Spécialiste progiciel
Inscription : février 2010
Messages : 983
Détails du profil
Informations personnelles :
Nom : Homme Christophe CHAPAT
Âge : 25
Localisation : France, Haute Loire (Auvergne)

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

Informations forums :
Inscription : février 2010
Messages : 983
Points : 1 590
Points : 1 590
Envoyer un message via MSN à carden752
Bonjour,

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

Code :
Set myFld = Selection.Fields.Add(Range:=Selection.Range, Type:=wdFieldEmpty, Text:="€")
__________________
Cordialement,
Christophe

Merci de ne pas oublier de mettre résolu quand le sujet l'est. Cela aide tous les DVPnautes dans leur recherche
carden752 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 23h07   #8
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 450
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 450
Points : 7 522
Points : 7 522
Merci à vous, je teste cela demain et je vous reviens.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 20h47   #9
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 450
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 450
Points : 7 522
Points : 7 522
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 :
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 :
1
2
3
Public Sub Test_AjouterCondition()
    Call AjouterCondition(CStr(Time))
End Sub
Code :
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+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 21h31   #10
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 450
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 450
Points : 7 522
Points : 7 522
Bon voici la version améliorée qui ne traite pas les composants d'un champ composé.

Code :
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+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h22.


 
 
 
 
Partenaires

Hébergement Web