Page 1 sur 1

[Writer] Importer une fonction depuis Calc

Publié : 31 août 2010 08:17
par lopti
Bonjour à tous,

Étant débutant sous OpenOffice, je galère sur un problème qui doit être assez simple (je suppose).

Ayant une formule sous Calc sous forme de Macro qui permet de généré un code barre a partir des chiffres qui lui sont passés en paramètres, je souhaiterais importer cette dernière sous Writer.
Étapes faites jusque ici :
1. J'ai recopier la Macro dans le document Writer actif.
2. J'ai trouvé comment créer une variable permettant d'exécuter les formules de Calcs (Insertion - Champs - Autres... - Onglet "Variables" - Insérer une formule)
3. Et ... malheureusement c'est ici que ca bloque puisque l'appelle à la Marco ne fonctionne manifestement pas (me retourne la valeur qui lui est passer en paramètre)... Pour info elle est appelée de la façon suivante : EAN13('123456789012)

Si une âme charitable pouvait me donner une piste ...

Le code, issue du site Grand Zebu (OpenBarcodes), est :
h**p://grandzebu.net/informatique/codbar/code128.htm
Le modérateur a écrit : :alerte: URL neutralisée : attention ce site se permet de mettre votre navigateur en plein écran.

Code : Tout sélectionner

Public Function ean13$(chaine$)
  'V 1.0
  'Paramètres : une chaine de 12 chiffres
  'Retour : * une chaine qui, affichée avec la police EAN13.TTF, donne le code barre
  '         * une chaine vide si paramètre fourni incorrect
  Dim i%, checksum%, first%, CodeBarre$, tableA As Boolean
  ean13$ = ""
  'Vérifier qu'il y a 12 caractères
  If Len(chaine$) = 12 Then
    'Et que ce sont bien des chiffres
    For i% = 1 To 12
      If Asc(Mid$(chaine$, i%, 1)) < 48 Or Asc(Mid$(chaine$, i%, 1)) > 57 Then
        i% = 0
        Exit For
      End If
    Next
    If i% = 13 Then
      'Calcul de la clé de contrôle
      For i% = 2 To 12 Step 2
        checksum% = checksum% + Val(Mid$(chaine$, i%, 1))
      Next
      checksum% = checksum% * 3
      For i% = 1 To 11 Step 2
        checksum% = checksum% + Val(Mid$(chaine$, i%, 1))
      Next
      chaine$ = chaine$ & (10 - checksum% Mod 10) Mod 10
      'Le premier chiffre est pris tel quel, le deuxième vient de la table A
      CodeBarre$ = Left$(chaine$, 1) & Chr$(65 + Val(Mid$(chaine$, 2, 1)))
      first% = Val(Left$(chaine$, 1))
      For i% = 3 To 7
        tableA = False
         Select Case i%
         Case 3
           Select Case first%
           Case 0 To 3
             tableA = True
           End Select
         Case 4
           Select Case first%
           Case 0, 4, 7, 8
             tableA = True
           End Select
         Case 5
           Select Case first%
           Case 0, 1, 4, 5, 9
             tableA = True
           End Select
         Case 6
           Select Case first%
           Case 0, 2, 5, 6, 7
             tableA = True
           End Select
         Case 7
           Select Case first%
           Case 0, 3, 6, 8, 9
             tableA = True
           End Select
         End Select
       If tableA Then
         CodeBarre$ = CodeBarre$ & Chr$(65 + Val(Mid$(chaine$, i%, 1)))
       Else
         CodeBarre$ = CodeBarre$ & Chr$(75 + Val(Mid$(chaine$, i%, 1)))
       End If
     Next
      CodeBarre$ = CodeBarre$ & "*"   'Ajout séparateur central
      For i% = 8 To 13
        CodeBarre$ = CodeBarre$ & Chr$(97 + Val(Mid$(chaine$, i%, 1)))
      Next
      CodeBarre$ = CodeBarre$ & "+"   'Ajout de la marque de fin
      ean13$ = CodeBarre$
    End If
  End If
End Function
PS: Un problème identique à été soulever dans ce fil

Re: [Writer] Importer une fonction depuis Calc

Publié : 31 août 2010 09:54
par Dude
Salut,

Tu as une extension sous Draw qui génère des codes à barres : http://user.services.openoffice.org/fr/ ... 14332.html

Une bonne source de départ pour voir comment tout cela fonctionne.

:idea:

Re: [Writer] Importer une fonction depuis Calc

Publié : 31 août 2010 12:24
par bm92
Bonjour,
lopti a écrit :J'ai trouvé comment créer une variable permettant d'exécuter les formules de Calcs (Insertion - Champs - Autres... - Onglet "Variables" - Insérer une formule)
3. Et ... malheureusement c'est ici que ca bloque puisque l'appelle à la Marco ne fonctionne manifestement pas (me retourne la valeur qui lui est passer en paramètre)
L'insertion de formule ne permet pas d'appeler une macro.

Tu décris une solution, mais quel est ton problème ?
Je suppose que tu veux insérer dans un texte une séquence de caractères correspondant à l'encodage "code barre" d'une série de 12 chiffres.
Il faut donc :
- taper une série de chiffres
- effectuer le transcodage
- insérer la séquence transcodée dans le texte Writer.
Cela peut se faire avec une deuxième macro appelant la macro ean13:

Code : Tout sélectionner

Sub insererCodeBarre
ThisComponent.CurrentSelection(0).String = ean13(InputBox("", "Entrez un nombre à 12 chiffres"))
End Sub
Positionne ton curseur dans le texte, puis lance la macro. Soit par le menu, soit par un bouton sur une barre d'outils, soit par un raccourci (si les macros sont dans "Mes macros").

Re: [Writer] Importer une fonction depuis Calc

Publié : 31 août 2010 14:01
par lopti
Merci de m'avoir répondu,

@Dude
J'avais déjà repéré cette extension qui fonctionne plutôt bien. Mais, malheureusement, l'adaptée pour qu'elle fonctionne nativement depuis Writer me parait trop complexe (je n'ai pas encore de notion de Python).

@bm92
Effectivement, je n'est pas été très claire dans mes explications.
L'aspect qui m'intéresse plus particulièrement au niveau de la fonction ean13 est qu'elle agit de manière automatique sans demander l'intervention d'un utilisateur (donc pas de fenêtre). C'est ce comportement que je souhaiterais reproduire sous Writer.
Maintenant que j'ai mieux compris le fonctionnement des macros, je peux décomposer mon problème en 2 sous-parties :
  • 1. Définir où la Macro devra récupérer la série de chiffre dans le document (je pense utiliser une variable utilisateur).
    2. Trouver un déclencheur pour exécuter automatiquement la Macros (là ca serait a chaque modification du contenu de la variable).
Je vais voir si je peux adapter l'exemple que tu a écrit.