QR-factures pour la Suisse
Bonjour,
@ Steelson
Je ne sais pas trop quel résultat tu me demandes.
Sur le fichier que tu avais placé hier à 15:39 et que tu as enlevé entre temps, j’avais d’abord la page Internet qui s’ouvrait automatiquement sur laquelle je pouvais lire le texte qui aurait dû apparaitre dans le QR-Code, mais aucun QR-Code n’était formé et la page Internet restait bloquée là-dessus. Une fois de retour manuellement sur Excel, la fenêtre du débogueur s’était ouverte et je pouvais aller constater la ligne qui bloquait (mais je ne suis plus certain sur laquelle ça bloquait et je ne peux plus refaire l’essai vu ta suppression).
Si tu parlais du fichier ‘’ image64.xlsm‘’ que tu as placé hier à 10 heures 18, je n’avais pas remarqué jusqu’à aujourd’hui qu’il contenait un bouton permettant de créer un QR-Code. A l’instant j’ai fait cet essai et ai placé ce QR-Code sur les deux sites de contrôles SIX et PostFinance ; des deux côtés ça a été refusé.
@ Steelson et Bifrons
J’ai par hasard dû demander un (et pas deux) bulletin de versement pour mon compte privé à la Banque Raiffeisen (2 ou 3ème banque suisse ?) début aout 2020 - pour une seule personne qui devait me verser de l’argent - et cet institut financier a refusé avec insistance de m’envoyer un ancien bulletin, arguant que depuis le 1er juillet la Suisse était passée aux QR-Factures. C’est un signe quand même qu'on va donc gentiment y venir malgré tout.
Il est cependant vrai que le nombre de QR-Factures en circulation est encore très bas – je n’en ai encore jamais reçues en privé – et j’ai bien compris que la plupart de nos 700 membres n’en avaient jamais reçues avant la nôtre. Je reçois parfois des factures de prestataires qui ont leur compte à la Raiffeisen et qui envoient toujours d’anciens bulletins de versement. Je présume qu’ils vivent sur leur réserve ??
Oui, l’envoi des QR-Factures avec le fichier ‘’Version Python’’ couvre le 99 % des besoins (car probablement plus de la moitié des personnes utilisent les autres références aussi à disposition en plus du QR-Codes, que celles qui utilisent les QR-Code sont clientes d’autres institutions que PostFinance, que les clients de PostFinance n’ont pas tous des signes spéciaux dans leurs données et que tous les lecteurs de PostFinance ne fonctionnent pas identiquement), mais si l’on pouvait couvrir le 100 % des besoins ce serait quand même mieux, non ? Normalement Steelson est de mon avis
Cordialement
Yvouille,
oui je l'ai ôté car il ne me satisfaisait pas.
et oui je suis de ton avis ... car cela me permet de bien décrasser mes neurones et au passage relever de nouveaux challenges !
Voici une dernière version (je l'ai envoyée aussi en mp à Sébastien en lui demandant s'il avait d'autres pistes), mais cette version fonctionne très bien chez moi. J'espère ne pas avoir d'incompatibilité chez les uns et les autres. C'est encore une maquette.
Mieux vaut avoir un double écran ou mettre le navigateur en petit pour voir ce qui se passe ...
edit : suppression de cette version qui ne convient pas à PostFinance (m^me si ici les caractères sont bien codés)
Bon, j'ai encore une idée*, mais mieux s'arrêter là si cela fonctionne ! (Le mieux est l'ennemi du bien)
(*) éditer la facture avec une page local html et son script de production du QRCode
Si tu parlais du fichier ‘’ image64.xlsm‘’ que tu as placé hier à 10 heures 18, je n’avais pas remarqué jusqu’à aujourd’hui qu’il contenait un bouton permettant de créer un QR-Code. A l’instant j’ai fait cet essai et ai placé ce QR-Code sur les deux sites de contrôles SIX et PostFinance ; des deux côtés ça a été refusé.
![]()
il a pu être refusé à cause des lignes d'encadrement des cellules et l'absence du logo ... j'espère !
Wow
J'ai eu un peu peur car lors de mon premier essai, le QR-Code ci-dessous a été refusé des deux côtés.
Puis j'ai insisté et ça a finalement passé, avec plusieurs essais ! Par exemple :
La croix suisse, bien que faisant très, très joli, semble ne servir à rien. Le même code sans elle passe également la rampe.
D'ailleurs je vous conseille de mettre des croix françaises sur vos QR-Codes également
J'avais déjà constaté, mais j'ai à nouveau fait l'essai : les lecteurs de contrôle ne sont pas dérangés par le quadrillage Excel, je présume pour autant qu'il ne soit pas trop important, comme sur l'image ci-dessous qui a allègrement passé les tests :
Je suis soufflé par ton travail et attends la suite de ton développement (si je n'abuse !).
Bien à toi.
Quel est ton point de vue sur l'aspect ergonomique ? acceptable pour 700 factures ? parce que, on verra l'avis de Sébastien, mais ce qui me reste est de l'intégrer à ton fichier, sauf corrections de dimension pour qu'il soit carré à l'impression..
Le fait que tous les QR-Codes soient acceptés - et donc ne fassent pas d'histoires à plusieurs niveaux - est bien plus important.
Bonsoir,
J'utilise la procédure de Steelson (python) pour mes factures et je l'en remercie encore vivement. Je n'ai eu pour l'instant aucun refus (mais seulement une cinquantaine de factures émises).
J'ai aussi créé une facture avec nom et adresse fantaisiste comme Yvouille.
Je l'ai passé sans problème sur SIX et sur Postfinance. Même si chez Postfinance il mentionne une erreur sur le IBAN (normal, c'est un IBAN de banque)
Je mets le QR code lu chez Postfinance ainsi que les deux protocoles de SIX et Postfinance.
Comment je procède : je génère le code QR, je copie et colle l'image en en .png dans un document Word puis je l'enregistre en tant qu'image .png. C'est cette image que je passe dans les différentes plateforme de test.
Quant à mes QR factures, je n'ai ni problème de dimensions ni de centrage car j'imprime directement à partir du fichier Excel (chaque client à son fichier).
Bonne soirée à tous et merci encore.
Salut Sandra et merci pour ton info.
J'ai copié ton code et l'ai passé au contrôle PostFinance selon mes habitudes et j'ai des erreurs qui sont mentionnées.
Voici ma manière d'effectuer les contrôles :
Et toi, as-tu créé - ou as-tu déjà, si tu es également cliente de PostFinance - ce ''compte'' qui est proposé et qui permet d'effectuer d'autres essais que les miens. Mais bon, dans un autre sens, je ne comprendrais pas qu'un QR-Code serait lu différemment pour les clients et non-clients de PostFinance.
Je te pose cette question car avec la manière indiquée ci-dessus, je n'obtiens, à ma connaissance, pas de protocole d'erreur alors que tu nous en montre un.
Cordialement.
C'est très intéressant ta démo Sandra !! de quoi mettre cela sous le nez de PostFinance en réponse à la lettre envoyée à Yvouille ... ils auraient 2 décodeurs dont un à spectre limitée !
Je me posais aussi du coup la question de la différence de lecture qu'il pourrait y avoir chez eux entre
- un paiement à distance (e-banking, mobile banking)
- un paiement sur place (guichet ou automate)
- un envoi sous enveloppe
On aurait pu imaginer que quelqu'un paye une facture via e-banking et via guichet/enveloppe auprès de PostFinance, les deux étant identiques en terme de noms (avec accents) et produites en utilisant python. Ce n'est peut-être pas possible ...
@ Sandra¨
Merci pour ta réponse. Tu as écrit :
Comment je procède : je génère le code QR, je copie et colle l'image en en .png dans un document Word puis je l'enregistre en tant qu'image .png.
J'ai essayé de généré un code, de sélectionner l'image du QR-Code et celle de la croix ensemble, de les copier et de les coller dans Word. Mais comment fais-tu pour transformer ton doc Word en PNG. J'ai cherché sur Internet, mais il semble qu'il faudrait télécharger un convertisseur ? Ce document Word, c'est la base de ta facture ou - dans une situation normale - tu imprimes ta facture par Excel ? J'imprime moi mes factures par Excel.
Jusqu'à maintenant, je n'ai jamais fais mes essais sur SIX et sur PostFinance qu'à l'aide de copies d'écran au format PNG et certaines passent d'autres pas. Ce serait quand même fort de café qu'il y ait une différence entre ta méthode et la mienne. Pour autant qu'il ne soit pas de qualité très basse, un QR-Code est un QR-Code, non ?
- Messages
- 3'678
- Excel
- 365, 2019
- Inscrit
- 11/04/2020
- Emploi
- Formateur bureautique, dvpt de fichiers
Bonjour à tous,
@ Yvouilles,
Sur Word, si tu fais un clic droit sur une image, tu as "enregistrer en tant qu'image". Et hop ! (normalement)
@Yvouille
Oui, je fais exactement comme l'a écrit JoyeuxNoël.
Non, j'ai utilisé cette technique uniquement pour faire valider mes qr code sur les différentes plate-formes. Sinon j'utilise excel et j'imprime directement la feuille Excel pour le récépissé de mes factures.
Oui un qr code est un qr code; mais assurément il se passe quelque chose au niveau de la plate-forme Post finance quand le fichier png est enregistré en tant qu'image depuis Word et une capture d'écran... mais quoi ? Mystère... Reste encore l'hypothèse de l'aléatoire... mais que je n'ai pas testé.
Dernière précision encore : le qr code qui est bien lu par posrfinance quand c'est un fichier .png (depuis word) et qui est mal lu quand c'est une capture d'écran en .png est très bien lu, avec les bons accents avec un lecteur qr depuis mon téléphone... donc
@ JoyeuxNoel
Effectivement que ça fonctionne ainsi. Je peux également enregistré deux images juxtaposées après les avoir groupées. Merci bien pour ton info.
@ Sandra
Merci également pour ton retour. Tu as placé sur Word et dans ton document PNG à la suite le QR-Code avec la croix ; l'as-tu fait comme je l'indique ci-dessus, par groupement d'images ?
Il y a quand même des QR-Codes générés avec une capture d'écran qui passent la rampe
- Messages
- 3'678
- Excel
- 365, 2019
- Inscrit
- 11/04/2020
- Emploi
- Formateur bureautique, dvpt de fichiers
Oui, les puristes crieront au scandale, mais en connaissant bien Word, on peut faire du photomontage assez facilement et le rendu est plutôt sympa quand même.
(non, ce n'est pas du vectoriel, non, ça ne vaut pas photoshop, mais c'est divertissant ^^)
Une piste éventuelle ... Le centrage du QR dans l'image ?
En faisant un copier/coller depuis word, on obtient chaque fois une image avec les mêmes marges autour du QR ce qui n'est pas le cas avec une capture d'écran qui est très aléatoire à ce niveau (marges et taille), l'image est normalement parfaitement carrée avec un copier/coller mais pas avec une capture
Leurs procédures de validation tient peut-être compte de ça ? Raison potentielle de la non validation d'une capture d'écran mais qui passe avec un copier/coller depuis word, faudrait tester les 2 solutions avec 2-3 QR différents et contenant des caractères spéciaux.
Bonjour,
Pour répondre aux exigences de PostFinance, avec l'aide de Yvouille, j'ai développé une nouvelle version utilisant le code javascript "Project Nayuki". Le code a été retouché pour pouvoir capter l'image produite en xml svg.
Cette version est basée sur un code javascript et donc monopolisera votre navigateur pour le faire fonctionner. L'image du QRCode est au format svg (image vectorielle) => XL2016 minimum
Conditions requises :
- mettre dans un même dossier le fichier excel, les 2 fichiers .js et le fichier .css
- un onglet htm
- une zone QRValeur
- une zone iciQRCode
- la croix suisse dénommée "croix"
' mike steelson
' https://forum.excel-pratique.com/excel/qr-factures-pour-la-suisse-105696
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#Else
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If
Sub ProduireQRCode()
Dim nav As Long, MyData As DataObject, fichier As String, i%, compteur%, txt As String, imagesvg As String, xq%, yq%, wq%, hq%, cptr%, test As Boolean
Set MyData = New DataObject
On Error Resume Next
' effacement de l'image le cas échéant
ActiveSheet.Shapes.Range(Array("myQRCode")).Delete
On Error GoTo 0
' écriture fichier html
Close #1
fichier = ThisWorkbook.Path & "\" & "myQRCode" & ".htm"
Open fichier For Output As #1
With Sheets("html")
For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
Print #1, .Cells(i, 1)
Next
End With
Close #1
' vidage presse-papier
MyData.SetText "vide"
MyData.PutInClipboard
' lancement
ShellExecute 0, "open", fichier, vbNullString, Environ("TEMP") & "\", 1 'SW_SHOWNORMAL
On Error GoTo messageErreur
' traitement du presse-papier renseigné par le code javascript du fichier html
cptr = 0
Do
MyData.GetFromClipboard
txt = MyData.GetText(1)
Delay 500
cptr = cptr + 1
test = (txt Like "*DOCTYPE svg PUBLIC*")
Loop Until test Or cptr > 20
Debug.Print cptr * 500 / 1000 & " secondes", test
If Not test Then
MsgBox "QRCode non intercepté en 10 secondes - refaites un essai !"
Exit Sub
End If
' écriture du fichier image vectorielle
imagesvg = ThisWorkbook.Path & "\" & "myQRCode" & ".svg"
Open imagesvg For Output As #1
Print #1, txt
Close #1
' fermeture du navigateur
SendKeys "%{F4}", True
' 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(imagesvg)
.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 imagesvg
Kill fichier
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
Function Delay(ms)
Delay = Timer + ms / 1000
While Timer < Delay: DoEvents: Wend
End Function
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 SubFonctionnement automatique de la macro :
- la macro crée un fichier html temporaire et le lance
- recueille le code image vectorielle et crée un fichier temporaire .svg
- télécharge l'image et repositionne la croix au centre
- supprime les fichiers temporaires
code de la page html générée (clone simplifié de la page de Nayuki) :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta charset="UTF-8"/>
<title>QR Code generator library</title>
<meta http-equiv="Content-Style-Type" content="text/css"/>
<meta http-equiv="Content-Script-Type" content="application/javascript"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>
<link rel="stylesheet" href="style.css" type="text/css"/>
<style type="text/css">
article input[type=radio] + label, article input[type=checkbox] + label {
margin-right: 0.8em;
padding-left: 0.2em;
}
article canvas, article svg {
padding: 1.0em;
background-color: #E8E8E8;
}
article form table td:first-child {
white-space: pre;
}
</style>
</head>
<body>
<div class="vert-main">
<div class="horz-main">
<article>
<form onsubmit="event.preventDefault();">
<div id="loading"></div>
<div id="loaded"></div>
<table class="noborder" style="width:100%">
<tbody>
<tr>
<td><label for="text-input"><strong>Text string:</strong></label></td>
="<td style=""width:100%""><textarea placeholder=""Data ici"" id=""text-input"" style=""width:100%; max-width:30em; height:5em; font-family:inherit"">"&Encode_UTF8(QRValeur)&"</textarea></td>"
</tr>
<tr>
<td><strong>QR Code:</strong></td>
<td>
<canvas id="qrcode-canvas" style="display:none"></canvas>
<svg xmlns="http://www.w3.org/2000/svg" id="qrcode-svg" style="width:30em; height:30em; display:none" stroke="none">
<rect width="100%" height="100%" fill="#FFFFFF"/>
<path d="" fill="#000000"/>
</svg>
</td>
</tr>
<tr>
<td><strong>Error correction:</strong></td>
<td>
<input type="radio" name="errcorlvl" id="errcorlvl-low" /><label for="errcorlvl-low">Low</label>
<input type="radio" name="errcorlvl" id="errcorlvl-medium"checked="checked" /><label for="errcorlvl-medium">Medium</label>
<input type="radio" name="errcorlvl" id="errcorlvl-quartile" /><label for="errcorlvl-quartile">Quartile</label>
<input type="radio" name="errcorlvl" id="errcorlvl-high" /><label for="errcorlvl-high">High</label>
</td>
</tr>
<tr>
<td>Output format:</td>
<td>
<input type="radio" name="output-format" id="output-format-bitmap" /><label for="output-format-bitmap">Bitmap</label>
<input type="radio" name="output-format" id="output-format-vector" checked="checked" /><label for="output-format-vector">Vector</label>
</td>
</tr>
<tr>
<td><label for="border-input">Border:</label></td>
<td><input type="number" min="0" max="100" step="1" value="4" id="border-input" style="width:4em"/> modules</td>
</tr>
<tr id="scale-row">
<td><label for="scale-input">Scale:</label></td>
<td><input type="number" min="1" max="30" step="1" value="8" id="scale-input" style="width:4em"/> pixels per module</td>
</tr>
<tr>
<td>Version range:</td>
<td>
Minimum = <input type="number" min="1" max="40" step="1" value="1" id="version-min-input" style="width:4em" oninput="app.handleVersionMinMax('min');"/>,
maximum = <input type="number" min="1" max="40" step="1" value="40" id="version-max-input" style="width:4em" oninput="app.handleVersionMinMax('max');"/>
</td>
</tr>
<tr>
<td><label for="mask-input">Mask pattern:</label></td>
<td><input type="number" min="-1" max="7" step="1" value="-1" id="mask-input" style="width:4em"/> (−1 for automatic, 0 to 7 for manual)</td>
</tr>
<tr>
<td>Boost ECC:</td>
<td><input type="checkbox" checked="checked" id="boost-ecc-input"/><label for="boost-ecc-input">Increase <abbr title="error-correcting code">ECC</abbr> level within same version</label></td>
</tr>
<tr>
<td>Statistics:</td>
<td id="statistics-output" style="white-space:pre"></td>
</tr>
<tr id="svg-xml-row" style="display:none">
<td>SVG XML code:</td>
<td>
<textarea id="svg-xml-output" readonly="readonly" style="width:100%; height:15em; font-family:'Courier 10 Pitch BT',monospace; font-size:80%"></textarea>
</td>
</tr>
</tbody>
</table>
</form>
</article>
</div>
</div>
<script src="qrcodegen.js"></script>
<script src="qrcodegen-input-demo.js"></script>
</body>
</html>


