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.
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.
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 :
Et après la première exécution (après le premier qr code créé) :
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.