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 24/01/2011, 19h45   #1
Invité de passage
 
Inscription : novembre 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 15
Points : 1
Points : 1
Par défaut Exécution fonction VB depuis Word

Bonjour à tous,

Je dispose d'un document Word dans lequel se trouvent des champs de fusion et je souhaiterais transformer le contenu d'un de ces champs en code128 afin de pouvoir le mettre sous forme de code-barres. J'ai pour se faire une fonction vb intitulée "Public Function Code128$ (chaine$)" qui renvoie le code128 du texte fourni en paramètre. Cependant je ne sais pas comment faire pour utiliser cette fonction depuis Word en automatique, c'est à dire que Word affiche automatiquement le code128 du champs de fusion en question.
Pouvez-vous m'aider ?

Merci d'avance
stephane160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 21h15   #2
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
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 321
Points : 29 219
Points : 29 219
Salut,

Si j'ai bien compris, tu souhaites qu'une partie du texte qui est issue d'un champ de publipostage devienne un code barre ?
__________________
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 24/01/2011, 22h09   #3
Invité de passage
 
Inscription : novembre 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 15
Points : 1
Points : 1
Oui c'est à peu prêt ça. En fait, c'est un champ de fusion (qui correspond à un identifiant de personne dans mon cas) que je dois transformer en code-barre. Et pour se faire, la fonction code128() me converti cette donnée numérique en donnée de type code-barre 128. Il ne reste plus ensuite qu'à mettre la police de type code-barres 128 associée.
Le problème c'est que je ne sais pas comment faire appel à cette fonction ?
stephane160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 23h03   #4
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
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 321
Points : 29 219
Points : 29 219
Salut,

Pourquoi n'utilises tu pas une simple police de caractère Code barre juste pour cette zone du document ?
__________________
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 25/01/2011, 10h48   #5
Invité de passage
 
Inscription : novembre 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 15
Points : 1
Points : 1
Salut,

En fait je suis obligé d'utilisé la police code 128 (à cause de certaines réglementations) et pour celle-ci il ne suffit pas d'appliquer la police code-barres sur mon champ de fusion. Je m'explique, pour que ma douchette récupère le texte "123456", il que que je mette le texte "Ò,BXLÓ" en police code-barres. La fonction vb code128() permet donc de transformer "123456" en "Ò,BXLÓ". Sauf que je ne sais pas comment faire appel à cette fonction.
Pour information on peut retrouver cette fonction sur le site internet http://grandzebu.net/index.php dans la rubrique informatique, code-barres, puis code 128.

Merci d'avance
stephane160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 11h27   #6
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
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 321
Points : 29 219
Points : 29 219
Salut,

Pour la fonction, elle est complète, il suffit de la coller.

Par contre, le problème est qu'un document issu d'une fusion ne possède plus de champs ni de signets.
On se retrouve avec un document ne contenant que du texte.
Il faudra donc déterminer où se trouve le texte à convertir dans le document.

Un exemple sur un texte sélectionné dans un document :

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
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
Sub TransformSelection()
Selection.Range.Text = Code128$(Selection.Range.Text)
 
End Sub
 
Public Function Code128$(chaine$)
  'V 2.0.0
  'Paramètres : une chaine
  'Parameters : a string
  'Retour : * une chaine qui, affichée avec la police CODE128.TTF, donne le code barre
  '         * une chaine vide si paramètre fourni incorrect
  'Return : * a string which give the bar code when it is dispayed with CODE128.TTF font
  '         * an empty string if the supplied parameter is no good
  Dim i%, checksum&, mini%, dummy%, tableB As Boolean
  Code128$ = ""
  If Len(chaine$) > 0 Then
  'Vérifier si caractères valides
  'Check for valid characters
    For i% = 1 To Len(chaine$)
      Select Case Asc(Mid$(chaine$, i%, 1))
      Case 32 To 126, 203
      Case Else
        i% = 0
        Exit For
      End Select
    Next
    'Calculer la chaine de code en optimisant l'usage des tables B et C
    'Calculation of the code string with optimized use of tables B and C
    Code128$ = ""
    tableB = True
    If i% > 0 Then
      i% = 1 'i% devient l'index sur la chaine / i% become the string index
      Do While i% <= Len(chaine$)
        If tableB Then
          'Voir si intéressant de passer en table C / See if interesting to switch to table C
          'Oui pour 4 chiffres au début ou à la fin, sinon pour 6 chiffres / yes for 4 digits at start or end, else if 6 digits
          mini% = IIf(i% = 1 Or i% + 3 = Len(chaine$), 4, 6)
          GoSub testnum
          If mini% < 0 Then 'Choix table C / Choice of table C
            If i% = 1 Then 'Débuter sur table C / Starting with table C
              Code128$ = Chr$(210)
            Else 'Commuter sur table C / Switch to table C
              Code128$ = Code128$ & Chr$(204)
            End If
            tableB = False
          Else
            If i% = 1 Then Code128$ = Chr$(209) 'Débuter sur table B / Starting with table B
          End If
        End If
        If Not tableB Then
          'On est sur la table C, essayer de traiter 2 chiffres / We are on table C, try to process 2 digits
          mini% = 2
          GoSub testnum
          If mini% < 0 Then 'OK pour 2 chiffres, les traiter / OK for 2 digits, process it
            dummy% = Val(Mid$(chaine$, i%, 2))
            dummy% = IIf(dummy% < 95, dummy% + 32, dummy% + 105)
            Code128$ = Code128$ & Chr$(dummy%)
            i% = i% + 2
          Else 'On n'a pas 2 chiffres, repasser en table B / We haven't 2 digits, switch to table B
            Code128$ = Code128$ & Chr$(205)
            tableB = True
          End If
        End If
        If tableB Then
          'Traiter 1 caractère en table B / Process 1 digit with table B
          Code128$ = Code128$ & Mid$(chaine$, i%, 1)
          i% = i% + 1
        End If
      Loop
      'Calcul de la clé de contrôle / Calculation of the checksum
      For i% = 1 To Len(Code128$)
        dummy% = Asc(Mid$(Code128$, i%, 1))
        dummy% = IIf(dummy% < 127, dummy% - 32, dummy% - 105)
        If i% = 1 Then checksum& = dummy%
        checksum& = (checksum& + (i% - 1) * dummy%) Mod 103
      Next
      'Calcul du code ASCII de la clé / Calculation of the checksum ASCII code
      checksum& = IIf(checksum& < 95, checksum& + 32, checksum& + 105)
      'Ajout de la clé et du STOP / Add the checksum and the STOP
      Code128$ = Code128$ & Chr$(checksum&) & Chr$(211)
    End If
  End If
  Exit Function
testnum:
  'si les mini% caractères à partir de i% sont numériques, alors mini%=0
  'if the mini% characters from i% are numeric, then mini%=0
  mini% = mini% - 1
  If i% + mini% <= Len(chaine$) Then
    Do While mini% >= 0
      If Asc(Mid$(chaine$, i% + mini%, 1)) < 48 Or Asc(Mid$(chaine$, i% + mini%, 1)) > 57 Then Exit Do
      mini% = mini% - 1
    Loop
  End If
Return
End Function
__________________
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 25/01/2011, 12h46   #7
Invité de passage
 
Inscription : novembre 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 15
Points : 1
Points : 1
Merci pour ton aide. Par contre j'ai oublié de préciser que je ne m'y connais pas en VB Word. Donc ce serait sympa si tu pouvais m'expliquer quoi faire exactement.

Pour information j'ai déjà copié la fonction code128() dans Word. Par contre je ne comprends pas ce que fait la tienne.

Disons que dans mon exemple, j'ai un champ de fusion qui s'appelle "identifiant". Que dois-je faire pour que lorsque j'ouvre le document, la valeur récupérée par le champ de fusion "identifiant" soit remplacée par celle que retourne la fonction code128() ?

Encore une fois, merci et désolé d'être un newbie dans ce domaine.
stephane160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 14h12   #8
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
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 321
Points : 29 219
Points : 29 219
Salut,

J'ai copié intégralement la fonction donnée par ton lien.
Dans la partie :
Code :
1
2
3
4
Sub TransformSelection()
Selection.Range.Text = Code128$(Selection.Range.Text)
 
End Sub
Je récupère le texte sélectionné dans le document pour le traiter avec la fonction et changer cette sélection.

On peut agir sur le contenu d'un champ de fusion mais juste avant la fusion, il faut utiliser un évènement Application_BeforeMailMerge.
On récupère la donnée avant injection et on la modifie.

Comment utiliser la fonction ?
http://heureuxoli.developpez.com/off...page=page8#8-B
__________________
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 25/01/2011, 17h07   #9
Invité de passage
 
Inscription : novembre 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 15
Points : 1
Points : 1
Salut,

Je viens de tester ta fonction mais il y a un petit problème.

Je m'explique, si je tape :

Code :
1
2
3
4
Sub TransformSelection()
Selection.Range.Text = Code128$(Selection.Range.Text)
 
End Sub
Lorsque j'exécute la macro, il m'efface la ligne sélectionnée (dans mon exemple "123456") mais ne m'affiche rien à la place.

Par contre, si te tape :

Code :
1
2
3
4
Sub TransformSelection()
Selection.Range.Text = Code128$("123456")
 
End Sub
Lorsque j'exécute la macro, il m'efface la ligne sélectionnée et m'affiche le bon code à la place.

J'ai donc testé que ma ligne sélectionnée était bien récupérée en utilisant la fonction suivante et cela fonctionne.

Code :
1
2
3
4
5
6
7
Sub TransformSelection()
 
Dim test As String
test = Selection.Range.Text
MsgBox test
 
End Sub
Le problème vient donc du paramètre que l'on donne à la fonction code128 mais je ne sais pas pourquoi. Une idée ?
stephane160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 17h24   #10
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
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 321
Points : 29 219
Points : 29 219
Salut,

Probablement que tu as pris un retour à la ligne qui n'est pas autorisé.
__________________
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 25/01/2011, 20h24   #11
Invité de passage
 
Inscription : novembre 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 15
Points : 1
Points : 1
Effectivement je me demande si je ne récupère pas un caractère en trop car lorsque j'utilise la fonction Len() pour voir la taille de ce que j'ai sélectionné, la valeur obtenue est toujours supérieure de 1 par rapport au nombre de caractères sélectionnés.
Sauf que je ne vois vraiment pas comment ça se fait.

Est-il possible que je mette en pièce-jointe sur ce topic le petit fichier Word que j'utilise pour faire mes tests afin que tu puisses y jeter un petit coup d'oeil ?

En te remerciant par avance
stephane160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 21h35   #12
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
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 321
Points : 29 219
Points : 29 219
Salut,

Tu peux mettre ton fichier sur le forum.

Certains caractères masqués peuvent être affichés en cliquant sur un bouton qui ressemble à ça : ¶
__________________
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 25/01/2011, 22h34   #13
Invité de passage
 
Inscription : novembre 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 15
Points : 1
Points : 1
Ok merci.

Je vais d'abord commencer par expliquer ce que j'ai voulu faire dans mon document Word et je mettrai le fichier en pièce-jointe demain matin car j'ai oublié ma clé USB au bureau.

En fait dans mon document test, je n'ai pas mis de champs de fusion mais uniquement du texte (je testerai plus tard avec le publipostage). Voici les informations présentes : Nom, Prénom, Service, Matricule, Code-barres.
J'ai ensuite créé deux signets : le premier intitulé "Signet1" qui encapsule le matricule, et le second intitulé "Signet2" qui encapsule le code-barres.
Le but de ma macro est donc de récupérer le contenu du signet1, de le convertir à l'aide de la fonction code128() et de mettre le résultat dans le signet2. Il ne me restera plus alors qu'à appliquer la police code-barres correspondante sur le signet2.

Voilà j'espère avoir bien expliqué mon problème.

Bonne soirée
stephane160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 22h42   #14
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
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 321
Points : 29 219
Points : 29 219
Salut,

tout de suite, le fait d'utiliser des signets une bonne méthode, mais elle n'est pas utilisable avec du publipostage.
__________________
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 26/01/2011, 11h04   #15
Invité de passage
 
Inscription : novembre 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 15
Points : 1
Points : 1
Salut,

Je viens de vérifier dans mon document et il y avait effectivement le retour à la ligne qui était incorporé dans les signets. Une fois retiré ça fonctionne correctement.
Par contre si tu me dis que ça ne fonctionnera pas avec les champs de fusion, je ne sais pas comment faire autrement.

Pourrez-tu m'expliquer quoi faire ?

Je te transmets en pièce-jointe mon fichier Word.

Merci d'avance
Fichiers attachés
Type de fichier : doc Test Macro.doc (33,5 Ko, 17 affichages)
stephane160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 16h03   #16
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 321
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 321
Points : 29 219
Points : 29 219
Salut,

On peut récupérer la valeur d'un contrôle avant que la donnée ne soit insérée dans le document de cette manière.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Option Explicit
 
'Gestion des évènements
Public WithEvents appWord As Word.Application
'-------------------------------------------
Sub DemarApp()
'Doit être lancé pour activer la gestion des évènements
Set appWord = Word.Application
End Sub
'-------------------------------------------
 
Private Sub appWord_MailMergeBeforeRecordMerge(ByVal Doc As Document, Cancel As Boolean)
 
MsgBox Doc.MailMerge.DataSource.DataFields(1).Value
 
End Sub
L'étape suivante sera l'utilisation de la fonction avant d'envoyer la donnée.
__________________
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 28/01/2011, 21h09   #17
Invité de passage
 
Inscription : novembre 2003
Messages : 15
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 15
Points : 1
Points : 1
Bonsoir,

Finalement je n'ai pas su récupérer le contenu de mon champ de fusion avec la méthode que tu m'as indiquée.

En effet, mon document Word est généré par une application à partir du modèle dans lequel j'ai incorporé mes macros. Et je me suis aperçu après recherches que cette application génère pour chaque document un fichier texte dans lequel sont stockées toutes les informations et remplace lui même les champs de fusion par ces informations à l'aide d'un programme qui s'appelle "fusion.exe".

J'ai donc contourné le problème en lisant le contenu de ce fichier texte et en récupérant l'information voulue. Maintenant il me reste encore quelques tests à effectuer afin de m'assurer que tout fonctionne correctement.

En tout cas un grand merci à ce forum et tout particulièrement à Heureux-oli pour toute l'aide qu'il m'a apportée.
stephane160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h21.


 
 
 
 
Partenaires

Hébergement Web