Calc: QR-Code automatisch per Formel aus Zellwert erzeugen lassen

Gerhard Weydt:

Gerhard Weydt:

...

Allerdings benötigst du dann noch einige weitere functions aus diesem
Dokument, nämlich getPattern, getSheet und utf16to8, die du zusätzlich
kopieren musst; du kannst sie z. B. einfach nach der function QRCode
einfügen. Oder du kopierst gleich alles, da müsstest du nur
nachlesen/ausprobieren, wie du Module anlegst, oder mit Exportieren und
Importieren rumspielen; dann hast du halt bloß ein bisschen mehr Code in
deiner Datei.

Hier weiß ich noch nicht, warum Du denkst, dass ich die Datei barcode.ods
nicht einfach kopieren kann, damit die Formel verfügbar ist.

Du kannst natürlich die Datei barcode.ods kopieren und sie dann massiv
umgestalten, dass sie deinen Wünschen entspricht; dann ist tatsächlich
alles drin, was du für den Barcode brauchst.
Ich hatte mir eher vorgestellt, dass du eine Datei hast, bei der
vielleicht auch so manches schon drinsteckt, und die du nun um die
Erzeugung des QR-Codes ergänzen willst.
Da hättest du nun das genannte Problem, wenn du nur diese eine function
QRCode in dein vorhandenes Dokument kopiert hättest, das würdest du
merken, sobald du versuchtest, das auszuführen: du erhieltest eine
ziemlich unspezifische Meldung in der Art "Formel unbekannt" oder so
ähnlich - ich habe keine Lust, das erneut zu provozieren, du wirst das,
wenn du das so ausprobieren willst, schon selber sehen - , was daran
liegt, dass der Autor dieser übrigens beeindruckenden Anwendung gewisse
Teile der Logik in Prozeduren, also separate subs oder functions,
ausgelagert hat, was grundsätzlich ein gutes Vorgehen ist, vielleicht
auch, weil er die auch für andere Codes als QR benötigt, welche aber
dann natürlich fehlen würden. Rauszufinden, was da fehlt, ist ziemlich
mühsam, entweder sehr skrupulöse Prüfung des Codes oder Setzen ein paar
Nachrichten im Code, um zu sehen wie weit man kommt, bevor der Fehler
auftritt, was aber ein bisschen Makro-Erfahrung voraussetzt, daher
dachte ich, ich teile dir mit, was du brauchst, nachdem ich das selbst
herausgefunden hatte.

Danke für Deine Erklärung lieber Gerhard.

Da der nicht benötigte Makro-Code nicht besonders umfangreich ist und die anderen
2D-Codes eventuell später mal nützlich sein können, werde ich wohl alle Makromodule
kopieren.

Ich hätte sonst Sorge, dass ich beim Extraktion von Teilen doch Fehler mache, deren
Folgen ich dann nicht beherrschen kann.
Aber vielen Dank, dass Du die notwendigen Teile genannt hast.

Erstaunt hat mich, dass die Anleitung
  https://help.libreoffice.org/Calc/User-Defined_Functions
das Anlegen einer Funktion mit einem schlichten
  VOL(a; b; c)
beschreibt.

In der Datei barcode.ods finde ich die Zeile 12 in Modul "QRCode":

"Public Function QRCode(sheet As Variant, row As Long, col As Long, text As String,
Optional level As Integer, Optional version As Integer) As String"

Was Anderes:

Die Struktur/Organisation von Makros in LO empfand ich bisher immer
verwirrend/unübersichtlich. Aber das kann natürlich auch damit zu tun haben, dass ich
selbst keine Makros schreibe und daher nicht vertraut mit der Verwaltungsoberfläche bin.
https://www.dropbox.com/s/1xkmfmg9u9frxv8/Screenshot%202019-01-15%2009.20.52.png

Verwirrend finde ich zum Beispiel, dass in "Meine Makros" mehrere Ordner stehen, die
ich jedoch nicht selber angelegt habe.

Ist es richtig, dass mit "Basic-IDE" das Modul
  Meine Makros > Standard > _ Module1
gemeint ist?

Andreas

Hallo Andreas,

...

Erstaunt hat mich, dass die Anleitung
  https://help.libreoffice.org/Calc/User-Defined_Functions
das Anlegen einer Funktion mit einem schlichten
  VOL(a; b; c)
beschreibt.

Sind es die Semikola? In Calc verwendet man sie, in Basic ist es das Komma, wie du in der nächsten Zeile siehst. In Calc steht dann natürlich nicht =VOL(a; b; c) , sondern z. B. =VOL(D7;E7;F7).

In der Datei barcode.ods finde ich die Zeile 12 in Modul "QRCode":

"Public Function QRCode(sheet As Variant, row As Long, col As Long, text As String,
Optional level As Integer, Optional version As Integer) As String"

Es ist empfehlenswert, hinter den Parametern jeweils deren Typ anzugeben, und hinter der schließenden Klammer mit den Parametern den Typ des Rückgabewertes der Funktion. Das ist auf jeden Fall schon mal eine Dokumentation, was erwartet bzw. zurückgeliefert wird. Ohne diese Angaben wird der Typ aus der Situation bestimmt, was bequem sein mag, aber auch zu Fehlern führen kann. Ich habe da keinen Überblick, weil ich immer mit angegebenen Typen arbeite, aber ich habe z. B. mal a als Gleitkommazahl deklariert (in Basic): mit angegebenen Typen (Ganzzahl, nicht besonders logisch für die Formel, aber es soll ja auch nur illustrieren) für die Parameter wird der korrekte Wert berechnet, ohne kommt eine Fehlermeldung. Was da genau dahintersteckt, weiß ich nicht.
Die ausführliche Schreibweise ist sicher zu empfehlen.
Die Definition enthält noch das Schlüsselwort OPTIONAL für Parameter, die nicht angegeben werden müssen; das muss das Programm alerdings abfragen und behandeln, aber das kann für den Aufruf eine Erleichterung sein, wenn unter gewissen Umständen manche Parameter gar nicht existieren. Eine eher triviale Abwandlung von VOL: wenn Parameter 2 und/oder 3 nicht angegeben sind, verwende nochmals Parameter 1; damit kann man das Volumen Würfel oder Säulen mit quadratischer Grundfäche etwas knapper berechnen. Ob das in diesem Fall eine Verbesserung ist, weiß ich nicht.
Im vorliegenden Fall wird z. B. für "level", wenn er nicht angegeben ist, im Code der Wert "L" gesetzt, der niedrigste für die Fehlerkorrektur. ("Es existieren vier Fehlerkorrektur-Levels, die eine Rekonstruktion von 7 % (Level L) bis zu 30 % (Level H) beschädigter Daten zulassen." laut Wikipedia-Artikel über QR-Code). Das ist eine wirkliche Erleichterung, man muss sich nur um den Level kümmern, wenn man was Besonderes will.

Was Anderes:

Die Struktur/Organisation von Makros in LO empfand ich bisher immer
verwirrend/unübersichtlich. Aber das kann natürlich auch damit zu tun haben, dass ich
selbst keine Makros schreibe und daher nicht vertraut mit der Verwaltungsoberfläche bin.
https://www.dropbox.com/s/1xkmfmg9u9frxv8/Screenshot%202019-01-15%2009.20.52.png

Verwirrend finde ich zum Beispiel, dass in "Meine Makros" mehrere Ordner stehen, die
ich jedoch nicht selber angelegt habe.

Der Screenshot verwirrt mich auch, denn alle Bibliotheken außer "Standard", die bei dir in "Meine Makros und Dialoge" stehen, sind bei mir unter "LibreOffice Makros und Dialoge" (was bei dir leer zu sein scheint) abgelegt, und da gehören sie logisch auch hin, sie werden mit der Installation geliefert. Ich weiß nicht, ob das an deinem Betriebssystem (Apple?) oder sonstwas liegt.

Ist es richtig, dass mit "Basic-IDE" das Modul
  Meine Makros > Standard > _ Module1
gemeint ist?

Basic-IDE (Integrated Development Environment, zu IDE gibt es sogar einen Wikipedia-Artikel) ist die Oberfläche, mit der man Makros verwaltet, also das Fenster, das über Extras -> Makros verwalten -> LibreOffice Basic... -> Bearbeiten geöffnet wird.
Was in diesem "_ Module1" steckt, ob der von dir stammt oder vom System, weiß ich nicht. Unter Windows taucht der jedenfalls nicht auf.
Die Bibliothek "Standard" hat die Besonderheit, dass sie beim Start automatisch geladen wird (andere, sofern sie nicht in einem Dokument abgelegt sind, muss man selbst laden, so wird dafür gesorgt, dass nicht zuviel nicht benötigter Code geladen wird). Da steckt man nur das Allernotwendigste rein; ich habe da drin, dass die Bibliothek von Xray geladen wird, damit ich jederzeit ohne Vorbereitung das Makro zum Aufruf des Xray-Menüs per Tastenkombination starten kann.

Andreas

Gruß

Gerhard

Hallo,
kann man das eigentlich auch auf die anderen Module übertragen, bspw. auf Writer? Ich fände nämlich ganz schick, in meine Briefvorlage zu übernehmen, dass beim Speichern automatisch ein QR-Code eingefügt wird mit dem aktuellen Dateinamen. Ginge so etwas auch?

Anm.: Meine Makro-Fertigkeiten und -Kenntnisse beschränken sich auf Copy&Paste nach Anleitung...

Hallo Boris,

das Platzieren der QR-Grafik an einer Stelle im Writer-Dokument sollte kein Problem sein, auch nicht das Löschen vor dem erneuten Erzeugen bei jedem Speichern (bei "Speichern unter" sowieso, aber auch bei "Speichern", die Datei könnte im Filesystem umbenannt worden sein), wenn die Grafik einen eindeutigen Namen bekommen hat, kann man sie finden und löschen.
Es müsste wohl nach dem Speichern ausgelöst werden, weil vorher der Name noch nicht feststeht, und dann einfach nochmals speichern. Das geht in meinen Tests (zunächst mit einem einfachen Text) auch gut bei "Speichern" und "Speichern unter". Nur bei "Kopie speichern unter..." weiß ich im Moment nicht, wie ich an den Namen kommen sollte, das angezeigteDokument behält ja seinen Namen.

Gruß

Gerhard