QR-Codes für Lehrer

Ich habe letzte Woche auf Twitter wieder einige Tweets von Lehrerinnen und Lehrern gelesen, die nach einer Möglichkeit suchten, mehr als einen QR-Code auf einmal zu erstellen. Diese Dinger sind ja auch praktisch, aber viele Websites, die sich kostenlos nutzen lassen, erlauben nur die Eingabe von jeweils einer Zeichenkette für den Code. Das macht dann auch keinen Spaß, vier Dutzend Mal klicken und warten und die erstellen Grafiken runterladen und einfügen, nur damit frau zwei QR-Codes für die Arbeitsblätter hat…

There must be another way Es muss doch einen anderen Weg geben …

Zusätzlich schreibe ich gerade an einem großen Tutorial, wie sich QR-Codes “zu Fuß” ohne Computer lesen lassen, da werden auch einige Codes als Material benötigt. Der Blogpost dazu kommt in den nächsten Tagen!

Da trifft es sich gut, dass ich jedes Monatsende in die geistige Muckibude gehe und Dinge wieder auffrische. Also brauchte ich eine kleine Aufgabe, die sich in ein paar AbendenNächten lösen lässt. Damit sind wir wieder beim Thema. Es kann doch nicht so schwer sein, eine Lösung zu finden, mit der LuL auf die Schnelle und ohne Verrenkungen mehrere QR-Codes erzeugen können. Nach einem Abend Recherche und Evaluierung möglicher Lösungen (und weil der Großteil der pädagogischen Zunft halt MS Office nutzt), habe ich eine meiner Meinung nach brauchbare Idee gefunden.
Ja, ich bin einer dieser Leute, die im normalen Leben ohne Windows auskommen, aber ich erzeuge mir meine QR-Codes zu Dutzenden in einem Rutsch auf der Kommandozeile, aber das ist ein anderer Blogpost) Und ab und an kommt man an Word, Excel & Co. nicht vorbei, da halten solche Übungen fit. 😄

Die Idee

Wir werden die QR-Codes in Word erstellen. Damit der geneigten Leserin nicht vor lauter Codes der Kopf schwirrt, tragen wir die schön in eine Tabelle ein, aus der auch die “Nutzlast” des Codes (meistens eine URL) gelesen wird. Damit sind die Codes auch gleich in Word mit Inhalt dokumentiert der Rest ist Copy&Paste. 👍 Da sieht dann so aus: Sie erstellen eine Tabelle in tragen in die erste Spalte für jeden benötigten QR-Code ein, was in den Code rein soll (ja, die Tabelle hat mehrere Spalten, dazu komme ich gleich).

Dokument vorher

Nun rufen wir ein Makro auf und dieses Makros läuft durch jede Zeile der Tabelle, erzeugt einen QR-Code und trägt den in die zweite Spalten ein – voilá!

Dokument nachher

Die dritte Spalte dient zur Demonstration, dass nur die zweite Spalte verändert wird, Sie also weitere Informationen zum Code (Schülername, Klasse, whatever) jederzeit in die Tabelle schreiben können, sofern das nicht in der zweiten Spalte steht.

Nett, nicht? Wie viele Codes Sie erstellen können? So viele, wie Sie brauchen (realistischerweise liegt das Limit bei ca. 1000 Codes pro Tag, bedingt durch den Server, den ich nutze. Dazu später mehr). Eine Tabelle mit 50 oder 100 Codes ist also überhaupt kein Problem.

Die erzeugten QR-Codes sind übrigens im SVG-Format und damit mehr oder weniger beliebig skalierbare Vektorgrafiken, die jederzeit vergrößert werden können. Ein Beispiel hier:

Fertiger Code

OK, ich will das haben! Wie geht das?

Eine Voraussetzung, die erfüllt sein muss, ist eine Internet-Verbindung. Wir nutzen einen externen Service zur Erzeugung der QR-Codes, dazu muss Ihr Rechner mit dem Web verbunden sein.

TL;DR (ich kenn’ mich aus und will nur die Schnell-Version)

Öffnen Sie den VBA-Editor von Word und kopieren Sie den Code aus dem Codeblock unten in den Editor. Setzen Sie eine Referenz auf das “Microsoft Script Control”. Erstellen Sie eine Tabelle mit mindestens zwei Spalte, tragen Sie in der ersten Spalte die Daten ein und starten Sie das Makro “Codify”.

Die ausführliche Version

Um diese Funktion zu erhalten, müssen Sie in einer Word-Datei nur ein Makro anlegen. Das müssen Sie nicht einmal tippen, der Code steht weiter unten. Dann legen Sie die Tabelle an, tragen die Daten für die Codes ein und rufen das Makro auf und können Word arbeiten lassen.

Ein Hinweis: ich biete hier absichtlich keine Word-Datei mit dem Makro zu Download an. Dies geschieht aus Sicherheitsgründen. Ich kann nicht auf der einen Seite vor dem blinden herunterladen von unsicherem Inhalt warnen und dann hier fröhlich pfeifend Makros in Word-Dateien zum Download bereit stellen. Aus diesem Grund müssen Sie den Code unten selbst in die Zwischenablage kopieren und im Makro-Editor von Word einfügen.

Bitte denken Sie auch daran, dass Word sich dann weigert (ebenfalls aus Sicherheitsgründen), die Datei mit der Erweiterung .docx zu speichern, sondern auf .docm (für Word mit Makros) besteht.

Legen Sie eine neue Word-Datei an und erstellen Sie eine Tabelle (wie gesagt, mindestens zwei Spalten). Nun müssen wir den Makro-Editor starten. Die nachfolgenden Schritte beziehen sich auf Word 2013, sind aber für die letzten Versionen von Word ziemlich gleich. Notfalls schnappen Sie sich den lokalen Word-Experten. Wenn Sie selbst die lokale Word-Expertin sind, have fun! 😄)

Makro-Editor starten

  1. Klicken Sie auf der Registerkarte Entwicklertools in der Gruppe Code auf Makros.
  2. Geben Sie im Feld Makroname einen Namen für das Makro ein (ich habe Codify verwendet). Da wir den Code gleich komplett ersetzen, ist der Name hier eigentlich irrelevant.
  3. Klicken Sie in der Liste Makros in auf die Vorlage oder das Dokument, in der bzw. dem Sie das Makro speichern möchten. Das sollte das gerade von Ihnen angelegte Dokument sein. (Wollen Sie das Makro in allen Word-Dokumenten verfügbar machen, wählen Sie Auswahl “normal.dotm” aus).
  4. Klicken Sie nun auf [Erstellen], um den Visual Basic-Editor zu öffnen.

Nun sehen Sie ein ziemlich leeres Editorfenster, dass in etwa folgenden Inhalt hat:

Ziemlich wenig Code…

Jetzt kopieren Sie den Text aus dem nachfolgenden Codeblock in die Zwischenablage (stören Sie sich nicht an der seltsamen Farbgebung, die besagt nur, dass ich das Code-Highlighting meines Blogs korrigieren muss 😏)

Der Makro-Code

Public Sub Codify()
    ' sind wir ueberhaupt in einer tabelle?
    Selection.Collapse Direction:=wdCollapseStart
     If Not Selection.Information(wdWithInTable) Then
        MsgBox "Makro funktioniert nur innerhalb einer Tabelle"
        Exit Sub
    End If
    
    ' referenz auf tabelle für später aufheben
    Dim tbl As Table
    Set tbl = Selection.Tables(1)
    
    ' haben wir platz für die codes?
    If tbl.Columns.Count < 2 Then
        MsgBox "Die Tabelle benötigt mindestens zwei Spalten"
        Exit Sub
    End If
     
    ' basis-url für die code-erzeugung
    ' details siehe http://goqr.me/api/doc/create-qr-code/
    Dim parms As Variant
    parms = Array("size=200x200", "qzone=2", "color=000099")
    BaseURL = "http://api.qrserver.com/v1/create-qr-code/?" & Join(parms, "&")
    
    ' Process every row in the current table. '
    Dim row As Integer
    For row = 1 To tbl.Rows.Count
        ' text aus spalte 1 wird die nutzlast des codes
        CellValue = tbl.Rows(row).Cells(1).Range.Text
        ' komplette url zusammenbauen
        TheUrl = BaseURL & "&" & "data=" & UrlEncode(CellValue)
        ' code wird in der spalte 2 abgelegt (hoehe 36pt = 1,27cm)
        InsertCode tbl.Rows(row).Cells(2), TheUrl, 36
    Next
    
    MsgBox "Codes wurden erzeugt"
End Sub
	
' setzt eine grafik aus einer url in einer tabellenzelle ein
' TheCell = referenz auf eine tabellenzelle
' TheUrl = string mit einer url zu einer grafik
' TheHeight = größe in punkten (72 pt = 1 in = 2,54 cm)
Public Sub InsertCode(TheCell As Cell, ByVal TheUrl As String, TheHeight As Integer)
    TheCell.Select
    Set dlg = Dialogs(wdDialogInsertPicture)
    dlg.Name = TheUrl
    dlg.Execute
    TheCell.Range.InlineShapes(1).Height = TheHeight
End Sub
	
' kodiert einen string in ein url-taugliches format
' benötigt im vba eine referenz auf das Microsoft Script Control
' TheString = zu kodierender string
' Ergebnis = string in urlencoded (s. RFC 3986)
Public Function UrlEncode(ByVal TheString As String)
    Dim ScriptEngine As ScriptControl
    Set ScriptEngine = New ScriptControl
    ScriptEngine.Language = "JScript"
    ScriptEngine.AddCode "function encode(str) {return encodeURIComponent(str);}"
    Dim encoded As String
    encoded = ScriptEngine.Run("encode", TheString)
    UrlEncode = encoded
End Function

Hinweis: auch der Code ist CC0, siehe Lizenz ganz unten auf der Seite – also viel Spaß beim Basteln! 😄

Entfernen Sie nun die Codevorgabe im Editor-Fenster (das Sub...End Sub) und fügen Sie dort den Code aus der Zwischenablage ein. Im Menü “Extras” wählen Sie nun noch den Punkt “Verweise…” aus dem Menü. Dann öffnet sich eine Dialogbox:

Verweise auf Bibliotheken

Suchen Sie die Zeile mit Microsoft Script Control x.y (die Einträge sind alphabetisch sortiert) und aktivieren Sie die Checkbox daneben. Das war’s dann auch schon.

Schließen Sie nun das VBA-Fenster und speichern die Datei sicherheitshalber.

Ein Hinweis für Leute, die VBA kennen: ich schreibe gleich noch weiter was zur Anpassung einiger Parameter.

Testlauf

Jetzt tragen Sie in der Tabelle in den Zellen der ersten Spalte die Zeichenketten ein, die im QR-Code enthalten sein sollen. Für den Test reichen zwei bis drei Zeilen.

Eine Tabelle

Achten Sie darauf, dass sich der Cursor in der Tabelle befindet. Passieren kann nichts, denn das Makros prüft vorher, ob das auch der Fall ist oder die Tabelle mindestens zwei Spalten besitzt. Falls nicht, erhalten Sie eine entsprechende Meldung.

Nun klicken Sie in der Registerkarte [Ansicht] auf das kleine Dreieck der Schaltfläche [Makros] und wählen da die Option [Makros anzeigen].

Makro-Dialog

Falls das Makro “Codify” nicht das einzige angezeigte Makro ist, wählen Sie dieses aus und klicken dann auf die Schaltfläche [Ausführen]. Als Ergebnis sollten Sie nach einigen Sekunden eine Reihe von QR-Codes in der zweiten Spalte erhalten.

So soll das aussehen

Damit können Sie nun problemlos Dutzende von QR-Code “in einem Rutsch” erstellen und Sie haben gesehen, wie wertvoll die Beschäftigung mit dem Thema Automatisierung und Makros bei Office sein kann.

Wie funktioniert die Erzeugung der QR-Codes?

Wir nutzen einen externen Service im Web, die API eines Angebots, das Sie vielleicht kennen: http://goqr.me/de/

Die Betreiber der Seite bieten eine REST-API (eine Schnittstelle für Programmierer) an, mit der sich die Erzeugung von QR-Codes automatisieren lässt. Details dazu finden Sie hier: http://goqr.me/de/api/

Der Service ist kostenlos, allerdings nicht beliebig belastbar, d.h. Aufrufe können jederzeit fehlschlagen, wenn Sie das Angebot exzessiv nutzen. Laut der Dokumentation sollten Tausend Aufrufe pro Tag aber jederzeit problemlos möglich sein (wenn Sie mehr als 1000 Codes pro Tag erzeugen, sollten Sie für so einen Service auch ein paar Euros übrig haben).

Diesen Service können Sie übrigens auch ganz ohne Makro von der Kommandozeile aus nutzen. Wenn Sie einen Mac oder Linux benutzen, dann können Sie mit dem Tool curl jederzeit ebenfalls viele Codes auf einmal erzeugen. Wenn Sie dazu Fragen haben: ich bin im Fediverse @Linkshaender@bildung.social und meine DMs sind offen…

Details zum Makro-Code

Diese abschließenden Ausführungen sind nur für Leserinnen und Leser interessant, die bereits Erfahrungen mit VBA-Makros gemacht haben.

In der Sub Codify finden Sie nach dem Kommentar

    ' basis-url für die code-erzeugung
    ' details siehe http://goqr.me/api/doc/create-qr-code/

einige Standardeinstellungen wie Größe, Ruhezone um den Code und Farbe, die Sie an dieser Stelle zentral anpassen können.

Die Referenz auf das Microsoft Script Control benötigen Sie wegen der Funktion UrlEncode, damit die Daten für den Aufruf der URL sauber kodiert werden. Falls Sie eine Funktion zum URL-encoden haben, die ohne diese Referenz auskommt, können Sie diese hier einsetzen und sich die Referenz sparen (die Funktion benötigt einen String als Parameter und liefert eine String zurück).

In der vierten Zeile von unter der Sub Codify wird übrigens auch die Größe des QR-Codes in der Zelle definiert. Diese wird in Point angegeben, siehe dazu auch den Kommentar im Code.

Danke, alle Ihr Entwickler!

An diese Stelle möchte ich mich bei all den Entwicklern und Office-Gurus bedanken, die Ihr Wissen so freigiebig im Web teilen. Die Liste hier wäre wahrscheinlich länger als der Blogpost, ich habe in den paar Nächten ca. 100 verschiedene Seiten, Artikel, Fragen bei Stackoverflow.com und andere Blogs besucht und verschiedene Ansätze erprobt, verworfen und umgebaut. Das Makro in seiner jetzigen Form ist ein dreckiger Hack und wenn etwas nicht funktioniert, sind das meine Bugs. Ein “special thanks” geht an dieser Stelle an Stackoverflow.com – wenn Sie Frage zur Programmierung von irgendwas haben, ist die dort höchstwahrscheinlich schon beantwortet worden!


#### Ein Kommentar am 2018-10-29 von e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855:

Super, vielen Dank. Ich habe noch nie mit Makros gearbeitet und dank dieser (idiotensicheren) Anleitung habe selbst ich es geschafft. Damit werde ich bei den Kollegen Eindruck schinden können ;-) Werde dann gerne bei meiner SchiLf auf diese Webseite verweisen!

Ein Kommentar am 2019-06-01 von ecde45ef288bb386484514eac6002485ad147e78534965db27297c25aac5d0b9:

Hallo, habe ich da etwas nicht richtig verstanden? Wäre es nicht etwas einfacher, im Dokument Felder einzufügen, denen man mittels DISPLAYBARCODE den jeweils geünschten Codetext unterschiebt?

Ja, wäre es, wenn es denn auch mit Office für den Mac funktionieren würde. Die Funktion DISPLAYBARCODE existiert erstens nur für Windows und zum zweiten ist die Funktion bei weitem nicht so flexibel steuerbar wie die im Artikel besprochene API. Da ich die Mac-Benutzer nicht aussperren wollte, blieb nur diese Lösung (ich finde es ziemlich seltsam von MS, diese Funktion nur unter Windows bereit zu stellen, wenn sogar OpenSource-Programm Barcodes und QR-Codes unter macOS und Linux hinbekommen).

Share Kommentieren
X

Ich habe einen Kommentar zum Artikel

Sie können die Kommentarfunktion ohne die Speicherung personenbezogener Daten nutzen. Schreiben Sie Ihren Kommentar und klicken Sie auf "Abschicken", der Versand erfolgt per Mail von meinem Auftritt aus an mich zur Prüfung. Dieser Versand und die Übertragung Ihres Kommentars ist zur Erfüllung der von Ihnen mit dem Klick auf "Abschicken" ersichtlichen Absicht technisch notwendig und bedarf keiner weiteren Einwilligung.

Wichtiger Hinweis: Sie haben keinen Anspruch auf die Veröffentlichung Ihres Kommentars. Jeder hier eingegebene Kommentar wird zuerst geprüft. Ich behalte mir die Entscheidung vor, welche Kommentare ich als Ergänzung an den Artikel anfüge.