VBA et police 128 sous WORD [Résolu]

nicus88 4 Messages postés mardi 3 janvier 2006Date d'inscription 8 avril 2009 Dernière intervention - 8 avril 2009 à 15:35 - Dernière réponse : nicus88 4 Messages postés mardi 3 janvier 2006Date d'inscription 8 avril 2009 Dernière intervention
- 8 avril 2009 à 20:40
Bonjour,
Je cherche a mettre en œuvre un code barre 128 sur mes documents Word.
Je dispose de la police 128 et d'une fonction.
Cette fonction prend en entrée une chaine de caractère, la transforme pour retourner une chaine ASCII.
C'est sur cette dernière que l'on peut appliquer la police pour obtenir le bon code barre correspondant a ma chaine de départ.
Comment automatiser tout cela dans Word?
Autrement dit, lorsque je fusionne ma chaine de caractère de départ dans le modèle, je voudrais automatiquement
que ma fonction soit exécutée (avec une macro VBA?) pour me remplacer cette chaine par la chaine ASCII et que la police 128 soit appliquée sur la chaine retournée.
Est-ce possible?
Je suis novice en matière de VBA.
Merci d'avance pour vos réponses.
Afficher la suite 

5 réponses

Répondre au sujet
nicus88 4 Messages postés mardi 3 janvier 2006Date d'inscription 8 avril 2009 Dernière intervention - 8 avril 2009 à 20:40
+3
Utile
Ok c'est bon je me suis mis au vba et j'y arrive.
Je récupère ma chaine de départ dans le doc a l'aide de signets, et je la remplace
par la chaine obtenue via la fonction, puis j'applique la police 128.
C'était pas très compliqué en fait...

Voilà,
merci encore pour ton aide Jack
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de nicus88
nicus88 4 Messages postés mardi 3 janvier 2006Date d'inscription 8 avril 2009 Dernière intervention - 8 avril 2009 à 16:08
0
Utile
Voici la fonction en question, où et comment l'utiliser sous Word?

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 digitsmini% 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
ElseIf 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
Commenter la réponse de nicus88
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 8 avril 2009 à 16:12
0
Utile
Salut
Donc, dans un coin du document (entête ou pied de page ?), tu as un code à barre et tu veux rafraichir ce code à l'ouverture d'un modèle.
Ce code barre n'est qu'un texte affiché avec une police spéciale.
Pense à inclure la police dans le document Word, sinon tes documents ne seront pas transportables (Voir options word)

Pour exécuter une action au lancement d'un document ou modèle, je pense qu'il suffit de mettre ton code dans une Sub nommée AutoOpen dans le document lui même.
Bien sûr, pour que le texte calculé puisse être affecté à la zone d'affichage, il faudra peut être définir un Signet pour que ton programme le modifie / l'identifie sans trop de peine

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
nicus88 4 Messages postés mardi 3 janvier 2006Date d'inscription 8 avril 2009 Dernière intervention - 8 avril 2009 à 16:26
0
Utile
Tout d'abord merci de ta réponse,
Mais comment passer la chaine de caractère en entrée de ma fonction,
et retourner à la place la chaine ASCII? Comment mon programme peut-il identifier la zone en question?
Si je place ma fonction dans une sub autoOpen, il faut que je passe ma chaine de caractère de départ en paramètre de cette sub mais comment?
Désolé mais je débute vraiment en VBA et la fonction qui me calcule la chaine ASCII a été glanée sur le net...
Commenter la réponse de nicus88
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 8 avril 2009 à 18:15
0
Utile
Re
Bah ta fonction est définie comme ça :
   Public Function Code128$(chaine$)
(Les commentaires en début de fonction sont pourtant clairs)
En réalité, si on suit les règles de base de la programmation claire et précise, elle devrait être
   Public Function Code128(ByRef chaine As String) As String
Les deux sont équivalentes, la première est moins intuitive :
   - les $ en fin de chaine définissent le type de la variable, y compris pour le nom d'une fonction
   - Le ByRef est optionel et par défaut
Donc, si tu lances
   maNouvelleChaine = Code128(maChaineInitiale)
cela devrait fonctionner

Maintenant, si tu ne connais pas le contenu de maChaineInitiale, je ne peux rien pour toi ...
D'où vient l'info ?
Moi, je n'en sais rien

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.