[Risolto] Definire coordinate tabella con celle unite

Creare una macro - Scrivere uno script - Usare le API
Rispondi
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

[Risolto] Definire coordinate tabella con celle unite

Messaggio da geovign »

Un saluto al forum.
Dovrei determinare con macro le coordinate di una tabella, che contiene quasi tutte celle unite, nella forma "PrimaColonna,PrimaRiga,UltimaColonna,UltimaRiga".
La mia difficoltà sta proprio nella presenza delle celle unite; ho provato a guardare in giro, ma non riesco a risolvere da solo.
Dal file allegato, prendo in esame la prima tabella con lo sfondo blu.
La procedura che pensavo di utilizzare era questa:
- determino la riga della cella che contiene "APP" ed aggiungo 2 per ottenere la riga con i titoli della tabella
- con

Codice: Seleziona tutto

PrimaColonna = Foglio.getRows.getByIndex(MyCounter+2).queryContentCells(4).RangeAddresses(0).StartColumn
UltimaColonna = Foglio.getRows.getByIndex(MyCounter+2).queryContentCells(4).RangeAddresses(0).EndColumn
determino l'indice della prima e dell'ultima colonna "piena".
Con la seconda istruzione, avendo delle celle unite, l'indice restituito è "3" ed ovviamente non è corretto (dovrei ottenere invece 17).
Esiste una soluzione che mi tenga conto della presenza delle celle unite?
Saluti
Geo
Allegati
QdC2022_DefinireCorrdinateTabella.ods
(19.4 KiB) Scaricato 76 volte
Ultima modifica di geovign il giovedì 10 febbraio 2022, 20:34, modificato 1 volta in totale.
LibO 7 su LinuxMint 21
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Definire coordinate tabella con celle unite

Messaggio da patel »

prova questa

Codice: Seleziona tutto

sub CelleUnite
Doc=ThisComponent
oSheet = Doc.Sheets(0)
oRange=Doc.Sheets(0).getcellrangebyname("B4:R10")
oCursor = oSheet.CreateCursorByRange(oRange)
oCursor.CollapseToMergedArea()

With oCursor
  With .RangeAddress
        oMergedRange = oSheet.GetCellRangeByPosition(.StartColumn,.StartRow,.EndColumn,.EndRow)
  End With
  msgbox "Totale Righe " & (.Rows.Count)
  msgbox "Totale Colonne " & (.Columns.Count)
     
End With
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
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2997
Iscritto il: martedì 18 maggio 2010, 17:01

Re: Definire coordinate tabella con celle unite

Messaggio da lucky63 »

.
... nella riga che contiene “APP” … potresti popolare preventivamente con uno spazio le restanti celle singole vuote per l'intera larghezza della tabella così da sfruttare quella per il riscontro ... (oppure similmente la riga direttamente sopra l'intestazione di tabella) ...

... potresti anche utilizzare “Gestione Nomi” per definire a priori con un nome mnemonco l'intestazione delle singole tabelle così che poi da macro diventa possibile selezionarle individualmente e ricavarne le rispettive coordinate ...
..
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: Definire coordinate tabella con celle unite

Messaggio da geovign »

Ciao,
@patel
la macro funziona, ma parte dal presupposto che si conosca il range di celle che costituiscono la tabella; io, invece, devo determinare il range di celle che costituiscono la tabella. Forse l'utilizzo del termine " ...coordinate..." è stato fuorviante. I'm sorry.
@lucky63
Per quanto riguarda le Aree con Nome, già le utilizzo per determinare le aree di stampa delle varie tabelle, ma avevo avuto dei problemi applicandole alle tabelle (non si aggiornavano con il modificarsi delle tabelle - dovevo ridefinirle ad ogni modifica), quindi le avevo messe nel cassetto.
Cosa, invece, a cui mai avrei pensato, è quella di riempire le celle vuote con degli spazi.
Quindi ho pensato, e funziona, di operare in questo modo, agendo sulla riga dei titoli della tabella:
- cella C4 : "CULTIVAR"
- celle da D4 a H4 : uno spazio oppure un qualsiasi altro carattere per cella
- unisco da C4 a H4 ; mi viene mostrato un avviso e scelgo di mantenere il contenuto delle celle nascoste
e così per la restante parte della riga dei titoli; in questo modo non ho celle "nascoste" vuote.
A questo punto se lancio la macro per definire il range di celle che costituiscono la tabella, funziona correttamente anche con celle unite.
Grazie.
Geo
LibO 7 su LinuxMint 21
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2997
Iscritto il: martedì 18 maggio 2010, 17:01

Re: [Risolto] Definire coordinate tabella con celle unite

Messaggio da lucky63 »

geovign ha scritto:Per quanto riguarda le Aree con Nome ... avevo avuto dei problemi applicandole alle tabelle (non si aggiornavano con il modificarsi delle tabelle - dovevo ridefinirle ad ogni modifica), quindi le avevo messe nel cassetto.
Strano perché a me non è mai successo.

Ho riprovato in giornata sia manualmente che da macro con OpenOffice 4.1.9 e LibreOffice7.2.5.
Inserimento/rimozione righe/colonne da tabella cui area sia stata definita da casella del nome (Gestione nome … CTRL+F3 ... che personalmente preferisco) ma anche da “Definisci area” (sebbene poi non risultino nel riepilogo della casella del nome) e in tutte le prove fatte le relative aree di riferimento si sono sempre ricalcolate automaticamente.
In ambito macro utilizzare un range corrispondente al nome preventivamente definito come sopra indicato ha proprio il vantaggio che non dovrai reimpostarne le coordinate in quanto in caso di modifica sono ridefinite automaticamente dal programma stesso ad ogni sua variazione.

Quanto hai segnalato non dovrebbe accadere.
Prova a resettare il profilo utente e fare altre prove.


Un'alternativa per bypassare l'eventuale persistenza del problema che segnali con la definizione nomi potrebbe essere quella di definire con nome non l'intera area della tabella ma la sola area relativa alla riga d'intestazione (si presume rimanga tale).
Quando da macro effettuerai un “select” di tale nome d'area potrai poi recuperarti le sue coordinate (ColonnaInizio, RigaInizio,ColonnaFine,RigaFine) ove riga inizio e fine saranno uguali ma impostando un loop “Do While” di controllo dati presenti in una colonna ricavarti anche la coordinata “RigaFine” corrispondente a quella tabella ... ... ...
.
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: [Risolto] Definire coordinate tabella con celle unite

Messaggio da geovign »

Quanto imposto in "Gestione Aree" le aree di stampa, che normalmente comprendono la tabella più due righe sopra ed una riga vuota sotto, non ho mai riscontrato problemi.
Quando invece imposto l'area della sola tabella, mi sono accorto, solo ora che ti ho letto e fatto veramente delle prove, che non si aggiorna in automatico se aggiungo una riga all'ultima. Comportamento logico e non errore.
Concordo con te che l'utilizzo delle aree con nome ha dei vantaggi soprattutto quando ho più tabelle in un unico foglio, ma quando ho riscontrato il problema, l'ho aggirato e continuato con il mio lavoro senza preoccuparmi di altro e senza approfondire.
Proverò comunque ad assegnare un nome alla sola area dei titoli, poi proverò.
Intanto ho risolto il problema e posso continuare ad usare il codice che avevo scritto, poi vedremo.
Scusa ma, che differenza c'è tra "ambito:Documento globale" ed, ad esempio, "ambito:Foglio1"? Non riesco proprio a capirlo.
Saluti
Geo
LibO 7 su LinuxMint 21
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2997
Iscritto il: martedì 18 maggio 2010, 17:01

Re: [Risolto] Definire coordinate tabella con celle unite

Messaggio da lucky63 »

geovign ha scritto:non si aggiorna in automatico se aggiungo una riga all'ultima. Comportamento logico e non errore.
Si è corretto.
Ma tale operazione non è un "inserimento nel range definito come nome" ma un accodamento al suo esterno.
geovign ha scritto:che differenza c'è tra "ambito:Documento globale" ed, ad esempio, "ambito:Foglio1"? Non riesco proprio a capirlo.
Sembra essere indifferente anche se la definizione data nell'help lascia intendere diversamente.
Ambito.png
Purtroppo ho scoperto una presunta incompatibilità della gestione di tali aree durante la scelta manuale dalla "casella dei nomi" qualora il file venga aperto con programma diverso da quello con cui è stato creato ... ma la cosa sembra non riperquotersi in ambito macro ...
.
geovign
Messaggi: 217
Iscritto il: domenica 13 gennaio 2019, 11:19
Località: Modena

Re: [Risolto] Definire coordinate tabella con celle unite

Messaggio da geovign »

Grazie per i chiarimenti.
Termino la discussione con un codice per la definizione della tabella, nel quale si prevede l'utilizzo di un cursore per la determinazione dei limiti della tabella, sulla falsa riga di quanto inizialmente postato da @patel, che ringrazio comunque per l'intervento.
Il codice è stato preso da "Imparare LibreOffice Basic" in spagnolo (parzialmente tradotto da @charlie) ed in parte da me adattato.
Per una esecuzione corretta, tutte le celle della riga dei titoli devono essere piene anche se unite (vedi post precedenti).

Codice: Seleziona tutto

Sub Tabella
rem creo oggetto oFoglio (foglio attivo)
	dim oController as object
	dim oFoglio as object
	oController = ThisComponent.getcurrentController
	oFoglio = oController.getActiveSheet()
rem attribuisco il codice della tabella da definire ed il numero del corpo aziendale
	dim CodiceTabella as string
	dim CorpoAziendale as integer
'	CodiceTabella = "App"
	CodiceTabella = "Fer"
	CorpoAziendale = 1
rem cerco nella colonna "A" il codice della tabella e ne determino la posizione (indice riga)
	dim InRange as Object
	dim oDescriptor as object
	dim oFound as object
	dim MyCounter as long
	InRange= oFoglio.getColumns().getByIndex(0)		'range costituito dalla sola colonna A
	oDescriptor = InRange.createSearchDescriptor()
	With oDescriptor
		.SearchString = CodiceTabella		'testo che identifica il tipo di tabella da ricercare (APP,FER,TRA, etc)
		.SearchWords = True
		.SearchType = 1  
		.SearchCaseSensitive = False
	End With
	oFound = InRange.findFirst(oDescriptor)
	MyCounter = oFound.getCellAddress.Row		'riga della cella contente il valore ricercato
	'pulisco variabili oggetto non più necessarie
	set InRange = nothing
	set oDescriptor = nothing
	set oFound = nothing
rem creo oggetto oCella (cella che fa parte della tabella - prima cella dei titoli)
'		la riga alla quale la cella appartiene deve avere tutte le celle piene anche se unite
	dim oCella as object
	oCella = oFoglio.getCellByPosition(1,MyCounter+2)
rem creo oggetto oCursore a partire dalla cella
	dim oCursore as object
	oCursore = oCella.getSpreadSheet().createCursorByRange(oCella)
rem muovo il cursore all'inizio della regione (tabella) e determino la prima colonna/riga
	dim PrimaColonna as long
	dim PrimaRiga as long
	oCursore.gotoStart()
	PrimaColonna = oCursore.getRangeAddress().StartColumn
	PrimaRiga = oCursore.getRangeAddress().StartRow
'	MsgBox PrimaColonna & " , " & PrimaRiga	
rem muovo il cursore alla fine della regione (tabella) e determino l'ultima colonna/riga
	dim UltimaRiga as long
	dim UltimaColonna as Long
	oCursore.gotoEnd()
	UltimaColonna = oCursore.getRangeAddress().StartColumn
	UltimaRiga = oCursore.getRangeAddress().StartRow	
'	MsgBox UltimaColonna & " , " & UltimaRiga
rem creo oggetto tabella definito tramite funzione
	dim oTabellaDati as object
	oTabellaDati = oFoglio.getCellRangeByPosition(PrimaColonna,PrimaRiga,UltimaColonna,UltimaRiga)
	Print oTabellaDati.AbsoluteName()
End Sub
Allego file.
Saluti.
Geo
Allegati
QdC2022_DefinireCorrdinateTabellaPerForum.ods
(21.18 KiB) Scaricato 69 volte
LibO 7 su LinuxMint 21
Rispondi