[Risolto] Usare txt da cella tramite ButtonPressed

Creare una macro - Scrivere uno script - Usare le API
Rispondi
Avatar utente
Biagio91
Messaggi: 232
Iscritto il: mercoledì 3 febbraio 2021, 20:25

[Risolto] Usare txt da cella tramite ButtonPressed

Messaggio da Biagio91 »

Ciao,
In un foglio Calc in cui ho uno slot di un tot di celle che si ripete verticalmente, formata da 1 cella contente del testo e da 2 celle contenente ciascuna un pulsante, il tutto incolonnato verticalmente, sto provando a fare una macro unica per i 2 pulsanti incolonnati. Ripetendo lo slot infatti, si ripetono anche i pulsanti mantenendo il nome;
La macro dovrebbe restituirmi in un MsgBox il dato scritto nella cella di riferimento quindi ID1 oppure ID2 in base allo slot in cui il pulsante viene premuto.
Specifico che non posso usare un riferimento fisso per le coordinate del campo ID, in quanto dopo un tot di righe, lo Slot cambia ID e si ripete lo Slot intero ma con Id Cambiato.


Cella B1 in cui c'è scritto "ID1"
B2 = cmd1
B3 = cmd2
...

Cella B5 in cui è scritto "ID2"
B6 = cmd2
B7 = cmd3

...
ecc

Il codice che ho scritto per ora non funziona correttamente, l'ho estrapolato da vari post e adattato alla mia esigenza.
E' la prima volta che mi cimento in qualcosa del genere, penso di essere vicino alla soluzione.
 Editato: Allegato inserito 
Grazie mille
Ciao
Allegati
EsempioEstrapolaID.ods
(11.02 KiB) Scaricato 120 volte
Ultima modifica di Biagio91 il venerdì 14 maggio 2021, 15:57, modificato 1 volta in totale.
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Usare txt da cella tramite ButtonPressed

Messaggio da patel »

Non è necessario usare un ciclo per individare la cella in cui si trova il pulsante.
Prova questa macro, penso che ti possa aiutare

Codice: Seleziona tutto

sub pulsanteLegatoAcella(oEv)
	Rif=oev.Source.Model.Name
	oSh=ThisComponent.Currentcontroller.activeSheet
	oRif=osh.getcellrangebyname(Rif)
	colRif=oRif.CellAddress.Column
	rowRif=oRif.CellAddress.Row
print "cella " & Rif & "- riga " & rowRif & " - colonna " & colRif
 
end sub
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Usare txt da cella tramite ButtonPressed

Messaggio da Gaetanopr »

Come fai ad inserire i vari pulsanti? copia e incolla? ci sono solo pulsanti?
Ad ogni modo ho modificato la tua macro per renderla funzionante.

Codice: Seleziona tutto

Sub ProvaID (Evento)
Rem Rileva il nome del pulsante cliccato
Doc = ThisComponent
FoglioAttivo = Doc.CurrentController.ActiveSheet
NumeroPulsanti = FoglioAttivo.DrawPage.Count

For i = 0 To NumeroPulsanti - 1
  FoglioAttivo.DrawPage.GetByIndex(i).Control.Tag = i
Next i

TagCmd = Evento.Source.Model.Tag
NumeroColonnaID = 1 'Colonna B
NumeroRiga =  FoglioAttivo.DrawPage.GetByIndex(TagCmd).Anchor.CellAddress.Row
CellaID = FoglioAttivo.getCellByPosition(NumeroColonnaID,NumeroRiga)
ID = CellaID.String
Print ID  

End Sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Avatar utente
Biagio91
Messaggi: 232
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Usare txt da cella tramite ButtonPressed

Messaggio da Biagio91 »

Gaetanopr ha scritto:Come fai ad inserire i vari pulsanti? copia e incolla? ci sono solo pulsanti?
Esatto li inserisco copiando e incollando uno slot vuoto che uso come modello, può influire sul risultato? ho notato che il nome rimane uguale copiando e incollando, per questo avevo pensato a quella strategia.
Gaetanopr ha scritto:Ad ogni modo ho modificato la tua macro per renderla funzionante.
Grazie mille. Faccio un po' di test.

Ok Test fatti, ho capito che la funzione tag prende ciò che è inserito nel campo UlterioriInformazioni, quindi ho dato al campo Ulteriori informazioni delle cmd1 il valore 1 e alle cmd2 il valore 2. Copiando e incollando i pulsanti questo valore rimane invariato. Ipotizzo che questo sia più corretto di utilizzare lo stesso NomePulsante per più pulsanti, o per lo meno più appropriato.

Quindi ho il codice finale che è:

Codice: Seleziona tutto

Sub ProvaID (Evento)
Rem Rileva il nome del pulsante cliccato
Doc = ThisComponent
FoglioAttivo = Doc.CurrentController.ActiveSheet
NumeroPulsanti = FoglioAttivo.DrawPage.Count

For i = 0 To NumeroPulsanti - 1
  FoglioAttivo.DrawPage.GetByIndex(i).Control.Tag = i
Next i

TagCmd = Evento.Source.Model.Tag
NumeroColonnaID = 1 'Colonna B
NumeroRiga =  FoglioAttivo.DrawPage.GetByIndex(TagCmd).Anchor.CellAddress.Row
If TagCmd=1 then
NumeroRigaIdCmd1 = NumeroRiga-1
CellaID = FoglioAttivo.getCellByPosition(NumeroColonnaID,NumeroRigaIdCmd1)
ElseIf TagCmd=2 Then
NumeroRigaIdCmd2 = NumeroRiga-2
CellaID = FoglioAttivo.getCellByPosition(NumeroColonnaID,NumeroRigaIdCmd2)
Else 
'Se il cmd premuto non ha il nome predefinito allora allora uscire dal sub avvisando che c'è un errore nelle proprietà del pulsante
		MsgBox "Proprietà NomeCmdButton Errate"
Exit Sub
End If

ID = CellaID.String
Print ID 

End Sub
Ma c'è qualcosa che non va e mi va sempre in MsgBox di errore proprietà NomeCmdButtonErrate. Cosa mi sfugge?

Grazie mille per l'aiuto dato fino ad ora
Riallego il file con le modifiche effettuate
Ciao
Allegati
EsempioEstrapolaID.ods
(11.17 KiB) Scaricato 108 volte
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Usare txt da cella tramite ButtonPressed

Messaggio da Gaetanopr »

Non capisco perché inserire il numero di tag manualmente, questo viene compilato da macro quindi è inutile oltretutto viene sovrascritto dalla macro stessa.
Non capisco perchè di questo

Codice: Seleziona tutto

If TagCmd=1 then
NumeroRigaIdCmd1 = NumeroRiga-1
CellaID = FoglioAttivo.getCellByPosition(NumeroColonnaID,NumeroRigaIdCmd1)
ElseIf TagCmd=2 Then
NumeroRigaIdCmd2 = NumeroRiga-2
la macro individua la cella adiacente al pulsante premuto senza ricorrere alla verifica di tag 1 o 2 che oltretutto il campo tag accoglie l'indice dei pulsanti e non cmd1 o cmd2 .
La macro l'ho strutturata in modo tale che puoi copiare tutti i pulsanti che vuoi, ogni pulsante avrà un tag con il proprio l'indice (codice univoco che individua il pulsante e la cella a cui è ancorato, da questo dato si risale facilmente al valore della cella adiacente).L'importante è ancorare bene i pulsanti, alcune volte visivamente lo vedi su di una determinata cella ma l'ancoraggio risulta essere su quella di sopra o di sotto
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Avatar utente
Biagio91
Messaggi: 232
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Usare txt da cella tramite ButtonPressed

Messaggio da Biagio91 »

Gaetanopr ha scritto:Non capisco perché inserire il numero di tag manualmente, questo viene compilato da macro quindi è inutile oltretutto viene sovrascritto dalla macro stessa.
Non capisco perchè di questo
Dal mio file originale, utilizzando il codice che mi hai girato, alla pressione dei pulsanti il riscontro era il successivo:
alla pressione di cmd1 di ID1, Print restituiva ""
alla pressione di cmd2 di ID1, Print restituiva ""
alla pressione di cmd1 di ID2, Print restituiva "ID2"
alla pressione di cmd2 di ID2, Print restituiva "ID2"
Quindi ho pensato di andare a provare a correggerre questo riscontro anomalo andando a verificare l'opzione UlterioriInformazioni e avevo notato che i pulsanti avevano per l'appunto un numero differente, allora mi sono detto che poteva essere proprio quello l'errore, infatti cmd1 quando premuto deve sempre riscontrare il valore della cella sopra di una riga, mentre cmd2 quando premuto deve sempre riscontrare il valore della cella sopra di due righe, a prescindere da dove si trovino.
Non avevo proprio capito che si compilava automaticamente da macro il numero della tag conferendogli un identificativo univoco, pensavo invece che la Tag servisse per dare un valore a tutte le cmd1 e un altro valore a tutte le cmd2.
Gaetanopr ha scritto:che oltretutto il campo tag accoglie l'indice dei pulsanti e non cmd1 o cmd2...
?? non ho capito questa parte qui...potresti spiegarti meglio?
Gaetanopr ha scritto:La macro l'ho strutturata in modo tale che puoi copiare tutti i pulsanti che vuoi, ogni pulsante avrà un tag con il proprio l'indice (codice univoco che individua il pulsante e la cella a cui è ancorato, da questo dato si risale facilmente al valore della cella adiacente)
è proprio per questo scopo che avevo pensato di usare la If

Codice: Seleziona tutto

If TagCmd=1 then
NumeroRigaIdCmd1 = NumeroRiga-1
CellaID = FoglioAttivo.getCellByPosition(NumeroColonnaID,NumeroRigaIdCmd1)
ElseIf TagCmd=2 Then
NumeroRigaIdCmd2 = NumeroRiga-2
che "teoricamente" verificava per l'appunto se era stato premuto cmd1 o cmd2, e si ricalcolava il NumeroRiga in base a quale pulsante era stato premuto.
Gaetanopr ha scritto:L'importante è ancorare bene i pulsanti, alcune volte visivamente lo vedi su di una determinata cella ma l'ancoraggio risulta essere su quella di sopra o di sotto
Li ho incollati direttamente nella cella selezionandola appositamente per lo scopo. Sono ancorati correttamente.
Mi sta sfuggendo qualcosa, non ho capito come dovrei risolvere la questione....mi sono mezzo perso....

Forse avrei dovuto costruire la If facendo riferimento al Text contenuto nel cmd1 o cmd2 ?
Riposto il file esempio con solo il tuo codice inserito, così come dovrebbe essere.
Allegati
EsempioEstrapolaID.ods
(10.85 KiB) Scaricato 111 volte
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Usare txt da cella tramite ButtonPressed

Messaggio da Gaetanopr »

Adesso ho capito meglio, prima avevo inteso che doveva restituire il testo della cella adiacente e non di quella sopra, quindi o 1 o 2 righe sopra rispetto il pulsante.
Biagio91 ha scritto:........Li ho incollati direttamente nella cella selezionandola appositamente per lo scopo. Sono ancorati correttamente.
Tu dici?? ti avevo detto di non fidarti di quello che vedi, infatti il secondo slot è ancorato male.
Questa è la macro corretta

Codice: Seleziona tutto

Sub ProvaID (Evento)
Rem Rileva il nome del pulsante cliccato
Doc = ThisComponent
FoglioAttivo = Doc.CurrentController.ActiveSheet
NumeroPulsanti = FoglioAttivo.DrawPage.Count

For i = 0 To NumeroPulsanti - 1
  FoglioAttivo.DrawPage.GetByIndex(i).Control.Tag = i
Next i

TagCmd = Evento.Source.Model.Tag
NumeroColonnaID = 1 'Colonna B
NumeroRiga =  FoglioAttivo.DrawPage.GetByIndex(TagCmd).Anchor.CellAddress.Row
If Evento.Source.Model.Name = "cmd1" Then NumeroRiga = NumeroRiga - 1
If Evento.Source.Model.Name = "cmd2" Then NumeroRiga = NumeroRiga - 2
CellaID = FoglioAttivo.getCellByPosition(NumeroColonnaID,NumeroRiga)
ID = CellaID.String
Print ID 

End Sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Avatar utente
Biagio91
Messaggi: 232
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Usare txt da cella tramite ButtonPressed

Messaggio da Biagio91 »

Ciao Gaetano, grazie mille per il suggerimento, ho cercato tra le varie opzioni del cmdButton e non ho trovato una proprietà in cui dica la cella a cui è ancorato, ma solamente se è ancorato alla pagina piuttosto che alla cella; presupporrei quindi che il metodo migliore per inserire un cmdButton in una cella sia quello di selezionare la cella e incollare poi il cmdButton dentro alla cella selezionata...ne esiste uno più appropriato che non lasci la possibilità di errori?

C'è qualcosa che non torna comunque nella macro, a me non funziona mica sai...il risultato è il seguente:
cmd1 dell'ID1 restituisce correttamente ID1
cmd2 dell'ID1 restituisce errore index out of bound

cmd1 dell'ID2 restituisce ""
cmd2 dell'ID2 restituisce ""

Ho provato pure a ricreare il file da zero ma il risultato non cambia.

p.s. avrei una curiosità, come mai metti " IF...THEN...istruzione " tutto di seguito? è una determinata tecnica specifica ? perché ho cercato in rete qualcosa al riguardo ma non ne trovo riscontro.. ?? sono curioso tutto qui.

Grazie mille ancora per il supporto
Ciao
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Usare txt da cella tramite ButtonPressed

Messaggio da Gaetanopr »

Biagio91 ha scritto: C'è qualcosa che non torna comunque nella macro, l'hai testata? a me non funziona mica il risultato è il seguente:
cmd1 dell'ID1 restituisce correttamente ID1
cmd2 dell'ID1 restituisce errore index out of bound

cmd1 dell'ID2 restituisce ""
cmd2 dell'ID2 restituisce ""
Mi leggi ma non ascolti, gli errori che evidenzi ti escono fuori in quanto i pulsanti non sono ancorati bene, ti allego il file con i pulsanti ancorati nella cella in maniera corretta.
Per constatare la correttezza dell'ancoraggio ti basta andare a vedere se il simbolo dell'ancora rientra dentro la cella come da immagine, nel tuo file 3 sono fuori cella.
Biagio91 ha scritto: p.s. avrei una curiosità, come mai metti " IF...THEN...istruzione " tutto di seguito? è una determinata tecnica specifica ? perché ho cercato in rete qualcosa al riguardo ma non ne trovo riscontro.. ?? sono curioso tutto qui.
Si può fare in entrambi i modi, per istruzioni brevi solitamente faccio così, il codice è più compatto( è un mio parere) ma non cambia nulla.
Biagio91 ha scritto:Ciao Gaetano, grazie mille per il suggerimento, ho cercato tra le varie opzioni del cmdButton e non ho trovato una proprietà in cui dica la cella a cui è ancorato, ma solamente se è ancorato alla pagina piuttosto che alla cella; presupporrei quindi che il metodo migliore per inserire un cmdButton in una cella sia quello di selezionare la cella e incollare poi il cmdButton dentro alla cella selezionata...ne esiste uno più appropriato che non lasci la possibilità di errori?
Si farlo tramite una macro, veloce e sicuro...ma andiamo fuori discussione...sul forum troverai qualche esempio.

Saluti
Allegati
EsempioEstrapolaID.ods
(10.87 KiB) Scaricato 106 volte
ancoraggio_pulsante.JPG
ancoraggio_pulsante.JPG (11.51 KiB) Visto 2996 volte
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Avatar utente
Biagio91
Messaggi: 232
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Usare txt da cella tramite ButtonPressed

Messaggio da Biagio91 »

Maledetta distrazione......Grazie Gaetano, non ne avevo idea che dovevo guardare l'icona dell'ancora :facepalm: è effettivamente ingannevole.

Mi hai risolto dal primo post e io non avevo proprio capito a cosa ti riferivi!!!!
Funziona tutto

Grazie mille
Ciao
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Avatar utente
Biagio91
Messaggi: 232
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Usare txt da cella tramite ButtonPressed

Messaggio da Biagio91 »

patel ha scritto:Non è necessario usare un ciclo per individare la cella in cui si trova il pulsante.
Prova questa macro, penso che ti possa aiutare

end sub[/code]
Grazie mille anche a te patel, ho provato e salvato questa macro che sembra utilissima per avere i riferimenti delle celle a cui è ancorato il pulsante, solamente che c'è un piccolo problema, si incanta sul " oRif=oSh.getcellrangebyname(Rif) "
ho provato ad arrivarci da solo ma non capisco dove sia l'errore.

Se riuscissi a correggerla sarebbe il top così me la salvo correttamente.
Grazie mille
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
patel
Volontario attivo
Volontario attivo
Messaggi: 4019
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: [Risolto] Usare txt da cella tramite ButtonPressed

Messaggio da patel »

Su Libre funziona
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: [Risolto] Usare txt da cella tramite ButtonPressed

Messaggio da Gaetanopr »

La macro in questione funziona solo se sul nome del pulsante indichi manualmente il nome della cella su cui è ancorato, ecco perché ti restituisce errore, in quanto nei tuoi pulsanti il nome non corrisponde al nome valido di una cella.
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Avatar utente
Biagio91
Messaggi: 232
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: [Risolto] Usare txt da cella tramite ButtonPressed

Messaggio da Biagio91 »

Grazie mille...mi sembrava in effetti che prendere come range il nome del pulsante fosse quanto meno strano, invece un senso c'era, il nome era il range.

La tengo in archivio in ogni caso che magari può servire per un rapido controllo.

Grazie mille ancora
Ciao
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Rispondi