Ricavare una colonna di codici QR da una colonna di dati

Buongiorno, (è la prima volta che creo un topic)

Ho bisogno di capire come fare per incorporare il generatore di codici QR in una funzione di Calc, perché avrei necessità di generare una serie di codici QR a partire da una colonna di celle di testo e non posso richiamare manualmente il generatore di codici QR qualche centinaio di volte.
Se questo fosse possibile, ovviamente sarà necessario che il singolo codice QR sia ancorato alla cella contenente la formula relativa, per referenziare il codice QR con il testo da cui viene generato.

Qualcuno può aiutarmi?

Non ho mai lavorato con libreoffice e i QR code, magari ci sarà un sistema migliore che non conosco, io ho semplicemente riprodotto con codice tramite Shell.SendKeys i vari passaggi manuali.
La macro crea 5 codici con i dati inseriti nella colonna A, impostata altezza riga a 4cm, ai codici viene assegnato il nome corrispondente.
NUOVO CODICE E FILE


Sub QR_CODE

dim document   as object
dim dispatcher as object
Dim shell As Object 
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"

Set shell = CreateObject("WScript.Shell")
sh = thiscomponent.sheets(0)

   REM Elimino tutti i precedenti QR
   For x = sh.drawPage.Count - 1 To 0 Step - 1
           objX = sh.drawPage(x)
           sh.drawPage.remove(objX)   
    next x
 
REM CREO UN CICLO DALLA PRIMA CELLA COLONNA A FINO A RIGA 5
REM IL NOME è INSERITO NELLA COLONNA A

for i = 1 to 6
   cella = "$B$"+i
   args1(0).Value = cella
   stringa = sh.getcellrangebyname("A"+ i).string
   if stringa <>"" Then
	   dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
		Shell.SendKeys stringa, True             ' Scrivo il QR 
		Shell.SendKeys "+{TAB}", True          ' shift + tab (Da Ok mi posiziono su annulla, altrimenti il pulsante OK NON FUNZIONA)
		Shell.SendKeys "+{TAB}", True          ' shift + tab (mi riposiziono su ok)
		Shell.SendKeys "{ENTER}", True        ' INVIO OK
		dispatcher.executeDispatch(document, ".uno:InsertQrCode", "", 0, Array())
		
		REM QUESTO CICLO MI PERMETTE DI DARE UN NOME AL QR CODE GENERATO SFRUTTANDO LA SUA POSIZIONE
		For x = 0 To sh.drawPage.Count - 1
	           objX = sh.drawPage(x)
	           if  objX.position.y = sh.getcellrangebyname("A"+ i).position.y Then
	               objX.Name = stringa
	            end if
	    next x
   end if
next i

End Sub

QR.ods (21.1 KB)

Grazie Gaetano,
immagino che questa sia una soluzione da quello che vedo.
Ma io sono solo un “utente abbastanza disinvolto” di Calc: so usare le formule con una buona padronanza, ma le macro non so nemmeno dove stiano di casa.
La mia assoluta ignoranza in tema di macro mi rende, credo, impossibile usare la tua soluzione, perché non riesco a capire il senso e la portata delle istruzioni, né i meccanismi con i quali le istruzioni interagiscono con il foglio di calcolo e non saprei gestirla per risolvere il mio problema.
Davvero speravo che fosse prevista, su Calc, una funzione richiamabile da una formula, perché con le formule mi sentirei di avere sotto controllo il lavoro da fare, così no.
Se questo è l’unico modo possibile, temo che dovrò rinunciare o trovare altre soluzioni.
ma grazie comunque.

Senza codice credo sia impossibile, anche a volere creare una funzione personalizzata occorre scrivere codice, se vuoi usare formule l’unica alternativa credo sia usare i Google Fogli, se fai una ricerca del tipo formula qr code fogli google trovi qualcosa.
Comunque è abbastanza semplice usare la macro che ti ho allegato, se cambi idea ti spiego come fare.
Nel frattempo attendiamo altri interventi, magari mi smentiscono.
Saluti

Hello @gaetanopr, suggestion, convert the Macro to Function, I’ll practice using it.

Example: In B1 would have the Function =QR_CODE(A1)

Hello @schiavinatto, ho seguito il tuo consiglio, ho convertito la Macro in Function, però necessita sia della cella di origine che di destinazione tra i parametri.
I parametri vanno indicati come stringhe in quanto LibreOffice, se scrivo =QR_CODE(A1;F1) valuta il contenuto delle celle A1 e F1 e non A1 come oggetto cella.
La funzione può essere inserita in 2 modi:
=QR_CODE(CELLA(“ADDRESS”;A1);CELLA(“ADDRESS”))
=QR_CODE(“A1”;“F1”)

Pro della 1^ soluzione rispetto la seconda :

1) La formula può essere copiata e trascinata nelle altre celle, con il secondo sistema deve essere ricopiata manualmente 
2) La funzione si aggiorna anche variando o cancellando il contenuto nella colonna A, in quanto con la modifica la funzione si ricalcola, secondo sistema NO.
3) Può essere inserita su qualsiasi cella senza indicarne l'indirizzo di destinazione in quanto la funzione CELLA("ADDRESS") restituisce la cella dove la formula è inserita

La Function di contro rispetto la MACRO può risultare fastidiosa all’apertura del file, dove a seguito del ricalcolo di tutte le celle si assiste all’eliminazione e all’inserimento dei QR.

Function QR_CODE(cellaOr As String, CellDest As String)
dim document   as object
dim dispatcher as object
Dim shell As Object 
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Doc = ThisComponent
Set shell = CreateObject("WScript.Shell")
sh = Doc.getcurrentcontroller.activesheet
For x = 0 To sh.drawPage.Count - 1
   objX = sh.drawPage(x)
   if  objX.position.y = sh.getcellrangebyname(cellDest).position.y Then
       If objX.position.x = sh.getcellrangebyname(cellDest).position.x Then
           sh.drawPage.remove(objX)
           exit for
       End if
   end if
next x

stringa = sh.getcellrangebyname(cellaOr).string
If stringa <>"" Then
  dim args1(0) as new com.sun.star.beans.PropertyValue
  args1(0).Name = "ToPoint"
  args1(0).Value = CellDest
  dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
  Shell.SendKeys stringa, True
  Shell.SendKeys "+{TAB}", True          ' shift + tab (Da Ok mi posiziono su annulla, altrimenti il pulsante OK NON FUNZIONA)
  Shell.SendKeys "+{TAB}", True          ' shift + tab (mi riposiziono su ok)
  Shell.SendKeys "{ENTER}", True        ' INVIO OK
  dispatcher.executeDispatch(document, ".uno:InsertQrCode", "", 0, Array())
		
		REM QUESTO CICLO MI PERMETTE DI DARE UN NOME AL QR CODE GENERATO SFRUTTANDO LA SUA POSIZIONE
  For x = 0 To sh.drawPage.Count - 1
	  objX = sh.drawPage(x)
	  if  objX.position.y = sh.getcellrangebyname(cellDest).position.y Then
	      objX.Name = stringa
	  end if
  next x
end if

End Function

QR.ods (89.1 KB)