QR-factures pour la Suisse

Et, après validation par Yvouille auprès de SIX et PostFinance, voici une version python utilisant le code Nayuki.

Image vectorielle => XL2016 mini. Avantage par rapport à la version javascript : ne nécessite pas d'ouvrir un navigateur.

Pour les utilisateurs de la version python précédente, on oublie le dossier PyQRCode-1.2.1

Conditions requises :

  • installer python https://www.python.org/downloads/
  • noter dans la macro le dossier dans lequel se trouve pythonw.exe (pythonw.exe et non python.exe)
  • mettre dans un même dossier le fichier excel et le fichier qrcodegen.py
  • un onglet py
  • une zone QRValeur
  • une zone iciQRCode
  • la croix suisse dénommée "croix"

ne pas oublier de mettre à jour en début de macro le chemin vers pythonw.exe, souvent sous cette forme

Const pythonPath = """C:\Users\XXXXXX\AppData\Local\Programs\Python\Python38-32\pythonw.exe"""

Fonctionnement automatique de la macro :

  • la macro crée un fichier python temporaire et le lance
  • le script python crée un fichier temporaire image vectorielle .svg
  • la macro télécharge l'image et repositionne la croix au centre
  • elle supprime enfin les fichiers temporaires

code py :

from qrcodegen import *
="qr = QrCode.encode_text('''" & Encode_UTF8(QRValeur) & "''', QrCode.Ecc.MEDIUM)"
txt = (qr.to_svg_str(4))
f = open('myQRCode.svg', 'w')
f.write(txt)
f.closed

code VBA :

' mike steelson
' https://forum.excel-pratique.com/excel/qr-factures-pour-la-suisse-105696

Option Explicit
Const pythonPath = """C:\Users\Michel\AppData\Local\Programs\Python\Python38-32\pythonw.exe"""

Sub ProduireQRCode()
Dim i%, xq%, yq%, wq%, hq%, ff%

    ChDir ThisWorkbook.Path

    On Error Resume Next
        ' effacement de l'image et des fichiers le cas échéant
        ActiveSheet.Shapes.Range(Array("myQRCode")).Delete
        Kill "myQRCode.py"
        Kill "myQRCode.svg"
    On Error GoTo 0

    ' écriture fichier python
    Close #1
    ff = FreeFile
    Open "myQRCode.py" For Output As #ff
    With Sheets("py")
        For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
            Print #ff, .Cells(i, 1).Value
        Next
    End With
    Close #ff

    Shell (pythonPath & " myQRCode.py")

On Error GoTo messageErreur

    ' lieu de mise en place du QRCode
    With ActiveSheet.Range("iciQRCode")
        yq = .Top - 9: xq = .Left - 9
    End With
    wq = 146: hq = 146

    ' importation de la nouvelle image QRCode
    With ActiveSheet.Pictures.Insert("myQRCode.svg")
        .Width = wq: .Height = hq
        .Left = xq: .Top = yq
        .Name = "myQRCode"
    End With

    ' mise en place de la croix
    With ActiveSheet.Shapes.Range("croix")
        .Left = xq: .Top = yq
        .IncrementLeft (wq - .Width) / 2
        .IncrementTop (hq - .Height) / 2
        .ZOrder msoBringToFront
    End With

    Kill "myQRCode.py"
    Kill "myQRCode.svg"

    Exit Sub

messageErreur:
    'indique le numéro et la description de l'erreur survenue
    MsgBox "Erreur survenue ... " & "#" & vbCrLf & Err.Number & vbLf & Err.Description
    Exit Sub

End Sub

Public Function Encode_UTF8(astr)
    Dim c
    Dim n
    Dim utftext

    utftext = ""
    n = 1
    Do While n <= Len(astr)
        c = AscW(Mid(astr, n, 1))
        If c < 128 Then
            utftext = utftext + Chr(c)
        ElseIf ((c >= 128) And (c < 2048)) Then
            utftext = utftext + Chr(((c \ 64) Or 192))
            utftext = utftext + Chr(((c And 63) Or 128))
        ElseIf ((c >= 2048) And (c < 65536)) Then
            utftext = utftext + Chr(((c \ 4096) Or 224))
            utftext = utftext + Chr((((c \ 64) And 63) Or 128))
            utftext = utftext + Chr(((c And 63) Or 128))
        Else ' c >= 65536
            utftext = utftext + Chr(((c \ 262144) Or 240))
            utftext = utftext + Chr(((((c \ 4096) And 63)) Or 128))
            utftext = utftext + Chr((((c \ 64) And 63) Or 128))
            utftext = utftext + Chr(((c And 63) Or 128))
        End If
        n = n + 1
    Loop
    Encode_UTF8 = utftext
End Function

Sub dimensionnerCroix()
    With ActiveSheet.Shapes.Range("croix")
        .Width = 19
        .LockAspectRatio = msoFalse
        .Height = 19
        Debug.Print .Width, .Height
    End With
End Sub

Bonjour les experts Suisses,

pourriez vous me dire comment vous auriez résolu le fait de ne pas dupliquer qrcodegen.py dans chaque dossier de chacun des fichiers excel ?

voir demande ici https://forum.excel-pratique.com/excel/swiss-qr-facture-qrcodegen-py-dans-dossier-different-du-fichi...

Bonjour à tous,

En premier lieu, merci beaucoup d’avoir développé ce code, il va me rendre bien service à moi aussi.

Je dois créer des qr codes suisses pour facture et je voudrais utiliser un des deux fichiers Excel, le dernier ou le V2 (?), avec Excel 2016. Malheureusement, chez moi aussi, l’erreur 1004 apparaît.

Mes connaissances à peine plus qu’élémentaires ne me permettent pas de comprendre l’origine du problème. Problème de code peu probable puisque ça fonctionne chez beaucoup. Problème de version de Excel ?

Les chemins dans la macro sont mis à jour :

Const PythonExe = """C:\Users\ACEG\AppData\Local\Programs\Python\Python38-32\pythonw.exe"""

Const repertoirePyQRCode = "D:\Swiss_QR_Code_V2\Travail\PyQRCode-1.2.1"

J’ai testé avec de nombreuses versions de Python, de 3.8 à 3.10, en 32 et 64 bits.

Le chemin d'installation de Python est le chemin par défaut.

Le fichier Excel est sauf erreur au bon endroit.

L’erreur 1004 apparaît avec les deux dernières versions des fichiers Excel utilisées.

Le fichier myQRCode.py n’est jamais créé. En fait, je bloque un peu avec ce fichier, je fais peut-être une erreur sur ce point. Et naturellement, aucun fichier image du qr code.

Est-ce que quelqu’un pourrait me donner un petit coup de main ? Ca serait super !

Copie d’écran après apparition de l’erreur 1004.

dossier de travail

Salut,

Je ne sais pas si ça va t'aider, mais la seule chose que je puisse faire pour toi est de te montrer la constellation de ma machine.

image

Je ne sais plus si ce dossier ''_pycache_'' est nécessaire ou non. Et dans ta constellation, je ne vois pas le dossier ''qrcodegen'' qui me semble indispensable.

Sinon j'ouvre mon fichier ''Facturation QR-Code 2021'' créé à l'aide de Steelson et je lance la macro sans autre forme de procès.

Amicalement.

Bonjour,
Pour information, Steelson nous a quitté le 17 août 2022. 😢
Cdlt.

lien : Salon VIP

Tout fonctionne !

Oui Yvouille, ça m'a aidé. Qrcodegen n'était pas présent car j'utilisais l'avant-dernière version du fichier de Steelson. Avec la dernière version, on a ce qui suit.

Le dossier __pycache__ est créé lors de la première exécution de la macro.

Donc avant la première exécution, on doit avoir dans le dossier :

avant premiere execution

Et après la première exécution (après le premier qr code créé) :

apres premiere execution

J'ai aussi promené le dossier qui contient qrcodegen.py et qrcode-pyth.........svg.xlsm un peu partout sur les disques. Le seul endroit ou cela a fonctionné est dans la racine du disque d'installation de Windows !

Les versions Python 3.8 et 3.10 fonctionnent pour ce que j'ai essayé.

Il est aussi apparu qu'une des mises à jour de Office 2016 empêche la gestion des .svg. J'ai installé office 2021 et tout fonctionne depuis.

Naturellement merci à Steelson sans qui je serais encore dans l'ornière. Honnêtement, pour remplacer les BVR qui échoient au 30 septembre, je m'y suis vraiment pris trop tard.

Rechercher des sujets similaires à "factures suisse"