Riferimento Indirizzo Righe Colonne

Discussioni sull'applicazione per i fogli di calcolo
Rispondi
Avatar utente
Biagio91
Messaggi: 238
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Ciao a tutti
mi collego alla discussione
https://forum-test.openoffice.org/it/fo ... ae28337784
Per esporre una ulteriore titubanza, che seppur correlata è palesemente off-topic rispetto alla suddetta discussione;
Utilizzando lo stesso file come Esempio, si vuole rendere l'intervallo "fisso" del Cerca.Vert (B2:C10) più "Dinamico", (cosa necessaria nel caso di aggiunta/eliminazione righe) ho provato a definire l'intervallo tramite PrimaCellaDelRange e UltimaCellaDelRange, per poi sostituirli nella formula e utilizzarli come riferimenti per le celle dell'intervallo; ho utilizzato il seguente codice, ma sto sbagliando qualcosa e va in errore; il primo errore che trovo sembra essere focalizzato su FormulaQuantita = "=CERCA.VERT(B2;Elenco."& PrimaCellaDelRange &":"& UltimaCellaDelRange &";2)"

Codice: Seleziona tutto

    Sub pulsAggiungi
    Dim NuovoProdotto As String
    Dim NuovaQuantita As String
    Dim FormulaQuantita As String
    Dim FormulaProdotto As String
    Dim FoglioElenco as Object
    Dim FoglioRiepilogo as Object


    Cursore = FoglioAttivo.createCursor
    UltimaRiga = Cursore.RangeAddress.EndRow
    UltimaColonna = Cursore.RangeAddress.EndColumn
    'Cursore.gotoEndOfUsedArea(false)
    PrimaCellaDelRange = foglioAttivo.GetCellByPosition (1,1)
    UltimaCellaDelRange = foglioAttivo.GetCellByPosition (UtlimaColonna,UltimaRiga)
    FormulaProdotto = "=COLLEGAMENTO([...])"
    FormulaQuantita = "=CERCA.VERT(B2;Elenco."& PrimaCellaDelRange &":"&UltimaCellaDelRange &";2)"
    [...]
    Parte dove vengono inserite le righe necessarie sui fogli Elenco e Riepilogo, si apre l'InputBox, si trasmettono i dati al foglio Elenco e su riepilogo di riflesso, si esegue l'inserimento del nuovo foglio se non esiste già.
    [/...]
    End Sub

Un consiglio su come risolvere?

Grazie mille
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Riferimento Indirizzo Righe Colonne

Messaggio da unlucky83 »

PrimaCellaDelRange = foglioAttivo.GetCellByPosition (1,1)
UltimaCellaDelRange = foglioAttivo.GetCellByPosition (UtlimaColonna,UltimaRiga)

Questi sono oggetti. Non sono stringhe con il riferimento alla cella. O adoperi AbsoluteName avendo cura di eliminare dalla stringa il nome del foglio oppure devi seguire un altra strada.
Di solito io preferisco definire dei nomi alle aree celle che poi con macro ridefinisco quando cambiano di ampiezza...
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Avatar utente
Biagio91
Messaggi: 238
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Ciao unluky83,
Grazie per l'interessamento,
Caspita quindi nel mio esempio sbagliato a prescindere, in realtà ci ero andato vicino, dovevo definire le variabili come oggetto e avrebbe "teoricamente" funzionato se non ho capito male giusto? mi vedo il discorso di AbsoluteName nel frattempo.
Dici che non si sarebbe aggiornato automaticamente il Range di celle?

Effettivamente io cercavo di fare proprio quello che hai detto tu, ridefinire l'area delle celle interessate nel momento in cui viene aggiunta una riga.
Se non ti dispiace darmi due dritte, mi affiderei al metodo tuo visto che lo usi spesso, mi suona da più "assodato" nel tempo.
Ultima modifica di Biagio91 il martedì 23 febbraio 2021, 21:21, modificato 1 volta in totale.
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Avatar utente
lucky63
Volontario assiduo
Volontario assiduo
Messaggi: 2995
Iscritto il: martedì 18 maggio 2010, 17:01

Re: Riferimento Indirizzo Righe Colonne

Messaggio da lucky63 »

.
Nel tuo esempio originario (corretto tramite .FormulaLocal) realizzi di fatto due fogli (Elenco - Riepilogo) che hanno gli stessi dati senza effettuare alcun controllo se ne esistano o meno di uguali già inseriti. Li inserisci e basta. I due fogli differenziano unicamente per il fatto che nel foglio “Elenco” li inserisci direttamente mentre nel foglio “Riepilogo” ricorri a un combinato macro/funzioni/formule che credo non abbia alcun senso utilizzarsi potendo invece scrivere direttamente gli stessi dati anche nel foglio “Riepilogo”.
Quindi, sapendo quello che con parole tue vorresti realmente realizzare, tale parte potrebbe essere molto più semplificata rispetto al combinato macro/funzioni/formule che hai utilizzato e vai utilizzando. Inoltre considera che nell'impostazione d'uso di “Cerca.Vert() hai omesso di utilizzare il “Quarto” parametro e ciò potrebbe comportarti problemi di riscontro. Nell'help e/o on-line trovi molte indicazioni per approfondire nel merito del suo utilizzo.
.
Avatar utente
Biagio91
Messaggi: 238
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

lucky63 ha scritto:.
Nel tuo esempio originario (corretto tramite .FormulaLocal) realizzi di fatto due fogli (Elenco - Riepilogo) che hanno gli stessi dati senza effettuare alcun controllo se ne esistano o meno di uguali già inseriti. Li inserisci e basta. I due fogli differenziano unicamente per il fatto che nel foglio “Elenco” li inserisci direttamente mentre nel foglio “Riepilogo” ricorri a un combinato macro/funzioni/formule che credo non abbia alcun senso utilizzarsi potendo invece scrivere direttamente gli stessi dati anche nel foglio “Riepilogo”.
Si XD è vero effettivamente è controverso senza una adeguata spiegazione. Il file Esempio rimarrà poi effettivamente vuoto, una sorta di Prototipo da richiamare per la compilazione di altri file, non dovranno esistere dati duplicati (dovrebbe essere un file molto limitato, al punto che forse, e sottolineo forse, una funzione di ricerca valori duplicati o già esistenti è eccessiva, anche se sicuramente torna comoda per backgroud personale).

Il foglio Riepilogo di questo file esempio (RiepilogoEsempio), è quindi un foglio semi-statico i cui valori verranno richiamati da altri file; nei file di destinazione i fogli "RiepilogoRichiamato" conterranno quindi solamente il copia/incolla dei valori contenuti sul foglio RiepilogoEsempio, questi fogli RiepilogoRichiamati non saranno modificabili dall'utente ma solo visualizzabili; saranno comunque in ogni file lo stesso copia/incolla del foglio RiepilogoEsempio, anch'esso non modificabile dall'utente ma solo dal "Proprietario" del file che potrà aggiungere o rimuovere righe a seconda del caso (dal foglio Elenco per essere sicuri di non andare a fare danni).
Non ho utilizzato un modello predefinito per poter appunto modificare i valori contenuti nel file Esempio e a cascata gli altri si aggiorneranno una volta aperti, senza cancellare i dati inseriti negli altri fogli (modificabili dall'utente). :knock:
luky63 ha scritto:Quindi, sapendo quello che con parole tue vorresti realmente realizzare, tale parte potrebbe essere molto più semplificata rispetto al combinato macro/funzioni/formule che hai utilizzato e vai utilizzando.
Ci ragiono su, sembrava la strada più "abbordabile" viste le mie lacunose competenze.
luky63 ha scritto:Inoltre considera che nell'impostazione d'uso di “Cerca.Vert() hai omesso di utilizzare il “Quarto” parametro e ciò potrebbe comportarti problemi di riscontro. Nell'help e/o on-line trovi molte indicazioni per approfondire nel merito del suo utilizzo.
.
Grazie mille, Ordinato è stato lasciato erroneamente in predefinito pensando che avrebbe inserito come valore 0. Si vuole che questa formula restituisca il valore solo ed esclusivamente se esiste, altrimenti se come negli elenchi non ordinati restituisce l'errore "Errore: valore non disponibile" lo si trasformi in una stringa ridotta tipo "NA" oppure in nulla ""; quindi lo correggo e lo imposto a 0 o Falso o ndr.
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Avatar utente
Biagio91
Messaggi: 238
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Ciao a tutti,
sono ancora bloccato su questo argomento, tralasciando gli errori che avevo fatto nella stesura del codice precedente (che non ho corretto nel post), se possibile vorrei chiedervi consiglio sul successivo codice, che comunque mi va in errore:

Codice: Seleziona tutto

Sub Prova_IntervalloDinamico
RigaInizioRange = 0
ColonnaIntervalloCercaVert = 2
	'Definisco un Cursore per utilizzarlo successivamente
		Cursore = FoglioAttivo.createCursor

		Do while Foglio1.getCellByPosition(1,RigaInizioRange).String <> "TitoloRange2" 
		RigaInizioRange = RigaInizioRange + 1
		Loop
		RigaFineRange1 = RigaInizioRange - 2 '-3
			
	'Utilizzo Cursore per definire la ColonnaFineRangeListino
	ColonnaFineRange1 = Cursore.RangeAddress.EndColumn
	'Trovo i riferimenti per l'intervallo che mi interessa
	CellaInizioRange1 = FoglioElencoProdotti.GetCellByPosition (0,0)
	CellaFineRange1 = FoglioElencoProdotti.GetCellByPosition (ColonnaFineRangeListino, RigaFineRangeListino)

	FormulaRiepilogativaRange1 = "=CERCA.VERT(A1;" & CellaInizioRange1 & ":" & CellaFineRange1 & ";" & ColonnaIntervalloCercaVert & ";0)"
End Sub
 Editato: Corretto il refuso:
unlucky83 ha scritto:CellaInizioRangeListino e CellaFineRangeListino non li trovo nel codice, quindi sono stringhe vuote
 
L'errore si genera comunque, il refuso era una svista di copia incolla per cambiare qualche nome rispetto ad un file bozza.
Lerrore è ovviamente sulla formula riepilogativa del Cerca.Vert , riporta: "Valore per la proprietà errato".

Grazie mille
Ultima modifica di Biagio91 il giovedì 18 marzo 2021, 11:17, modificato 6 volte in totale.
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Riferimento Indirizzo Righe Colonne

Messaggio da unlucky83 »

CellaInizioRangeListino e CellaFineRangeListino non li trovo nel codice, quindi sono stringhe vuote
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Avatar utente
Biagio91
Messaggi: 238
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Ho aggiornato il post precedente grazie unluky, pensavo che volendo potremo eliminare i nostri commenti eventualmente per non fare confusione ad altri utenti... che dici? io lascerei solo il post originario con la correzione effettuata...così per amor di praticità
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Riferimento Indirizzo Righe Colonne

Messaggio da unlucky83 »

Lascia tutto così. Chi leggerà la discussione si accorgerà del tipo di errori che si possono fare e presterà attenzione
L’importante è mettere Risolto al primo messaggio della discussione
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Avatar utente
Biagio91
Messaggi: 238
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Aspetta...non vorrei aver fatto passare che il problema si è risolto XD NON si è risolto il problema....questo intendevo dire XD
Per questo ho avanzato la precedente proposta..
Comunque ok, lascio così
Ultima modifica di Biagio91 il sabato 20 marzo 2021, 17:04, modificato 1 volta in totale.
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Riferimento Indirizzo Righe Colonne

Messaggio da unlucky83 »

CellaInizioRange1 È un oggetto, ma a te serve la stringa del riferimento cella.
Idem per la cellaFineRange1
Questo te lo avevo fatto notare anche prima
Con questa modifica non hai più l'errore in FormulaRiepilogativaRange1

Codice: Seleziona tutto

 CellaInizioRange1 = FoglioElencoProdotti.GetCellByPosition (0,0).AbsoluteName
       a=Split(CellaInizioRange1,".")
       CellaFineRange1 = FoglioElencoProdotti.GetCellByPosition (ColonnaFineRangeListino, RigaFineRangeListino).AbsoluteName
       b=Split(CellaFineRange1,".")
       
       FormulaRiepilogativaRange1 = "=CERCA.VERT(A1;" & a(1) & ":" & b(1) & ";" & ColonnaIntervalloCercaVert & ";0)"
       msgbox FormulaRiepilogativaRange1
Ora l'errore nella formula non c'è, però credo che stai gestendo male la ricerca dell'area dinamica.
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Avatar utente
Biagio91
Messaggi: 238
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Ciao,
posso domandarti alcune delucidazioni?

Ho letto la guida pitonyak su "Split" che riporta sulla sezione dedicata a "Table 13. Summary of subroutines and functions related to arrays."
Split(str, delimiter, n):
Split the string argument into an array of strings. The default delimiter is a space. The optional argument “n” limits the number of strings returned.

Ma non sono sicuro di quello che ho capito e ti vorrei chiedere conferma, cercando di spiegare a parole quello che ho capito..
a=Split(CellaInizioRange1,".") il punto come separatore serve ad intercalare il NomeFoglio"."Cella"." ecc che sarebbe il riscontro dell'utilizzo di AbsoluteName...giusto?
 Editato: 
unlucky83 ha scritto:Ti riporto un codice per comprendere split.
non avevo infatti capito una ceppa 
E se lasciato vuoto il terzo parametro (opzionale) che valore assume?
Mi converrebbe specificarlo affinché mi restituisca solo un risultato?

E su FormulaRiepilogativaRange1 non capisco (1) a cosa si riferisce... il primo risultato restituito da Split?

Ti sarei grato se riuscissi a darmi una mano a capire meglio perché se penso a come devo impostarla per utilizzarla in relazione al Range2 mi sembra un labirito XD

Grazie mille intanto per il tempo che hai già dedicato a questo mio problema.

P.S. una volta capito questo passerei al domandarti cosa intendi con "sto gestendo male la ricerca dinamica" o sarebbe meglio affrontare a priori questo argomento?
Ultima modifica di Biagio91 il domenica 21 marzo 2021, 2:30, modificato 5 volte in totale.
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Riferimento Indirizzo Righe Colonne

Messaggio da unlucky83 »

Mi ero dimenticato dell'esistenza del terzo parametro di split, dato che non lo uso mai.
Ti riporto un codice per comprendere split. Fai girare la macro e così dovrebbe essere più chiaro l'uso di split.

Codice: Seleziona tutto

Sub Spiega_Split
Frase="Ciao-sono.io.come.stai"
a=split(Frase,".")
For i=0 To ubound(a)
If i=0 Then
 testo=a(0)
 else
 testo=testo & chr(13) &a(i)
End if
Next
msgbox "La frase è: " & Frase & chr(13)  & chr(13) & "Usando split(Frase,""."") abbiamo"  & chr(13) & chr(13) & testo
a=split(Frase,".",1)
For i=0 To ubound(a)
If i=0 Then
 testo=a(0)
 else
 testo=testo & chr(13) &a(i)
End if
Next
msgbox "La frase è: " & Frase & chr(13)  & chr(13) & "Usando split(Frase,""."",1) abbiamo"  & chr(13) & chr(13) & testo
a=split(Frase,".",2)
For i=0 To ubound(a)
If i=0 Then
 testo=a(0)
 else
 testo=testo & chr(13) &a(i)
End if
Next
msgbox "La frase è: " & Frase & chr(13)  & chr(13) & "Usando split(Frase,""."",2) abbiamo"  & chr(13) & chr(13) & testo
a=split(Frase,".",3)
For i=0 To ubound(a)
If i=0 Then
 testo=a(0)
 else
 testo=testo & chr(13) &a(i)
End if
Next
msgbox "La frase è: " & Frase & chr(13)  & chr(13) & "Usando split(Frase,""."",3) abbiamo"  & chr(13) & chr(13) & testo
End Sub
Scendendo nello specifico della macro del precedente commento
-CellaInizioRange1 è una stringa del tipo $Foglio1.$A$1

Codice: Seleziona tutto

a=Split(CellaInizioRange1,".")
-a mi diventa un array di due elementi perchè il riferimento cella presenta solo un punto che impiego come separatore per splittare il testo. il parametro opzionale l'ho ignorato, ma se vuoi metterlo userei il 2, per costruire un array di 2 elementi. Il secondo elemento è quello che mi interessa, perchè è quello che avrà la stringa $A$1
-Per richiamare l'elemento dell'array che mi interessa per definire l'area dinamica, uso la sintassi a(1), cioè il secondo elemento. Infatti l'array a ha il primo elemento che parte dall'indice 0 quindi è a(0)
-ho fatto la stessa cosa per ricavare il solo riferimento di cella dell'ultimo elemento dell'area, ottenendo la stringa "desiderata" in b(1)
una volta capito questo passerei al domandarti cosa intendi con "sto gestendo male la ricerca dinamica" o sarebbe meglio affrontare a priori questo argomento?
Siccome hai riportato una macro che adopera variabili globali senza ricordarti di riportarle nel codice e siccome non hai fornito un allegato di esempio per comprendere la struttura del file (quali fogli, dove è l'area di ricerca...) non mi sono soffermato molto sulla comprensione del resto del codice, però mi sembra proprio che non hai sviluppato la parte che sfrutta il cursore per ottenere l'ultima cella dell'area interessata.
Se proponi un allegato simbolico che rispecchia la struttura del tuo file, funzionale per questa fase di sviluppo e contenente il codice che ci interessa, di sicuro troveremo una rapida soluzione. :D
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Avatar utente
Biagio91
Messaggi: 238
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Ciao,
Grazie mille, Wow, Ok la spiegazione di Split ora è decisamente più chiara.
Scusate se ho usato terminologie improprie, spero non abbiano creato confusione, non sono molto esperto come avrete notato XD
unlucky83 ha scritto: mi sembra proprio che non hai sviluppato la parte che sfrutta il cursore per ottenere l'ultima cella dell'area interessata.
è la prima volta che l'ho usato da solo, o meglio che ci ho provato a sto punto XD

Farò come dici e proporrò un file di esempio il più semplificato possibile.
Intanto grazie mille per le dritte e le spiegazioni!
Ultima modifica di Biagio91 il domenica 21 marzo 2021, 2:24, modificato 2 volte in totale.
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Avatar utente
Biagio91
Messaggi: 238
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Eccomi,
cavolo pensavo fosse più semplice da preparare come file, l'ho semplificato il più possibile ma è comunque un file "articolato".
Ho cercato di essere il più esplicito possibile nelle spiegazioni annotate, spero di non aver inserito cose futili.

Aspetto notizie :D

Grazie mille
Ciao
Allegati
EsempioRiferimentoIndirizzoRigheColonne.ods
(17.43 KiB) Scaricato 86 volte
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Riferimento Indirizzo Righe Colonne

Messaggio da unlucky83 »

Sono un pò arrugginito e ho messo un pò di tutto in questo codice

Codice: Seleziona tutto

Sub InserisciFormule
	'Parametri di foglio Riepilogo
	FoglioRiepilogo=thiscomponent.sheets.getbyname("Riepilogo")
	rigo=4 'da incrementare
	'-------
	Cursore = FoglioRiepilogo.createCursor
	Cursore.gotoendofusedarea(false)
	AreaRiepilogo=FoglioRiepilogo.getcellrangebyposition(1,rigo-1,3,Cursore.rangeaddress.endRow+1).ClearContents(20)
	'-------
	area=intervalloDInamicoDeiTitoli
	If isNull(area) Then Exit Sub
	For i=0 To ubound(area)
		a=split(area(i),":")
		b=split(a(0),"$")
		testo=""
		For j=0 To ubound(b)-1
			testo=testo & b(j) 'costruisco testo per la funzione se
		Next
		c=split(a(1),"$")
		d=Clng(c(ubound(c)))-Clng(b(ubound(b)))
		For j=0 To d
			FormulaRiepilogativaRange0 ="=SE(" & testo & Clng(b(ubound(b)))+j & "="""";""Vuoto"";" & testo & Clng(b(ubound(b)))+j & ")"
			oCell0=FoglioRiepilogo.getCellByPosition(1,rigo-1)
			ocell0.formulalocal = FormulaRiepilogativaRange0
			FormulaRiepilogativaRange1 = "=CERCA.VERT(B" & rigo & ";" & area(i) & ";2;0)"
			FormulaRiepilogativaRange2 = "=CERCA.VERT(B" & rigo & ";" & area(i) & ";3;0)"
			oCell0=FoglioRiepilogo.getCellByPosition(2,rigo-1)
			ocell0.formulalocal = FormulaRiepilogativaRange1
			oCell0=FoglioRiepilogo.getCellByPosition(3,rigo-1)
			ocell0.formulalocal = FormulaRiepilogativaRange2
			rigo=rigo+1
		Next
		FormulaRiepilogativaRange0 ="=SE(" & testo & Clng(b(ubound(b)))+j+1 & "="""";""Vuoto"";" & testo & Clng(b(ubound(b)))+j+1 & ")"
		oCell0=FoglioRiepilogo.getCellByPosition(1,rigo-1)
		ocell0.formulalocal = FormulaRiepilogativaRange0
		rigo=rigo+1
	NEXT
End Sub

Function IntervalloDinamicoDeiTitoli
	'Parametri di foglio ElencoProdotti
	FoglioElencoProdotti=thiscomponent.sheets.getbyname("ElencoProdotti")
	Titoli_prodotti=array("TitoloElenco1","TitoloElenco2","TitoloElenco3")
	Col_Titoli=1 'colonna in cui cercare i titoli elenco
    '---------------------------------
	aree_prodotti=dimarray(ubound(Titoli_prodotti))
	arrayTabelle_Prodotti=FoglioElencoProdotti.columns(Col_Titoli).queryContentCells(4)
	For i=0 To ubound(Titoli_prodotti)
		CellaTitolo=Cerca(Titoli_prodotti(i),Col_Titoli,FoglioElencoProdotti,ThisComponent)
		If IsNull(Cellatitolo) Then
			msgbox "fine"
			IntervalloDinamicoDeiTitoli=Null
			exit function
		End if
		j=0
		Do
			range2 = arrayTabelle_Prodotti(j).queryintersection(CellaTitolo.rangeaddress)
	   		if range2.RangeAddressesAsString <> "" Then Exit do
	   		j=j+1
		Loop
		aree_prodotti(i)=FoglioElencoProdotti.getcellrangebyposition(Col_Titoli, CellaTitolo.rangeaddress.StartRow+2, Col_Titoli+2,arrayTabelle_Prodotti(j).rangeaddress.EndRow).AbsoluteName
	Next
	IntervalloDinamicoDeiTitoli=aree_prodotti
End function

function Cerca(ricerca,indexCol,sh,Doc)
Dim CampoRicerca As Object
Dim Risc As Object
Dim oSD As Object
Dim uriga As Long
   If Ricerca = "" Then Exit function
   oSD = Sh.createSearchDescriptor
   CampoRicerca = Sh.columns(indexCol)
   oSD.searchType = 1
   oSD.setSearchString( Ricerca )
   Risc = CampoRicerca.findFirst( oSD )
   If Not IsNull( Risc ) Then
        Cerca= Risc
   Else
        Msgbox ("Nessun Riscontro", 33, "Ricerca") 
		Cerca=Null
   End If
End function

Ti allego il file così puoi fare dei test
Allegati
EsempioRiferimentoIndirizzoRigheColonne_risposta.ods
(19.7 KiB) Scaricato 87 volte
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Avatar utente
Biagio91
Messaggi: 238
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Ciao,
WOW....credo che mi ci vorrà un bel po' per studiarmi questo codice qui....mi scuso in anticipo per l'attesa che ci sarà nel riscontro.

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

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Ciao,
Ringraziandoti ancora per la pazienza e l'interessamento, vorrei chiederti un favore...Non è che mi metteresti qualche commento in più per capire meglio il tutto?
Ci sono parti che mi sembrano aramaico XD scusa la richiesta immagino che trovandomi di fronte ad un qualcosa di completo sia per lo meno strana, è solo che vorrei capire meglio e chi se non il suo ideatore potrebbe spiegarmi meglio? XD
Grazie mille se lo prenderai in considerazione.
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: Riferimento Indirizzo Righe Colonne

Messaggio da unlucky83 »

Partiamo dalla funzione Cerca, che viene chiamata all'interno dell'altra funzione in questo modo

Codice: Seleziona tutto

CellaTitolo=Cerca(Titoli_prodotti(i),Col_Titoli,FoglioElencoProdotti,ThisComponent)

Codice: Seleziona tutto

function Cerca(ricerca,indexCol,sh,Doc)
Questa funzione vuole come parametri:
"ricerca" che contiene la stringa del titolo elenco prodotti da cercare (>Titoli_prodotti(i) )
"indexCol" che riporta l'indice di colonna in cui cercare la stringa (>Col_Titoli)
"sh" che è l'oggetto foglio in cui cercare la stringa nella colonna indicata (>FoglioElencoProdotti)
Doc che è l'oggetto documento. Del tutto inutile perchè non impiegata nel codice della function...è un residuo della macro che ho preso e adattato a questo scopo (>ThisComponent)
La funzione restituisce o l'oggetto RangeCell in cui è stata trovata la stringa da cercare oppure un valore nullo se non è stata trovata nessuna occorrenza.
Con questa funzione puoi vedere un esempio di utilizzo di "createSearchDescriptor", molto utile nello sviluppo di macro.

Passiamo ora all'altra funzione che ti ho fornito

Codice: Seleziona tutto

function IntervalloDinamicoDeiTitoli
Partiamo dall'output di questa funzione: restituisce un valore nullo se la funzione cella ha restituito valore nullo oppure un array di "AbsoluteName" dell'elenco prodotti di ciascun blocco.
Questa funzione opera adoperando due metodi interessanti: queryContentCells(4) che serve per individuare le celle contenenti stringhe (4 sta per stringhe);
queryintersection che adopero per vedere quale tra queste aree presenta il titolo corrispondente. L'output però è un indirizzo che inizia dal secondo rigo del blocco, notare infatti il +2 dopo CellaTitolo.rangeaddress.StartRow della parte seguente

Codice: Seleziona tutto

      aree_prodotti(i)=FoglioElencoProdotti.getcellrangebyposition(Col_Titoli, CellaTitolo.rangeaddress.StartRow+2, Col_Titoli+2,arrayTabelle_Prodotti(j).rangeaddress.EndRow).AbsoluteName
Passiamo alla macro principale, Sub InserisciFormule.
Nella parte alta ho usato il cursore solo per individuare la parte usata del foglio per poter fare una pulizia completa del foglio riepilogo. ClearContents(20) è il metodo per pulire l'area (20=4+16, 4 sta per stringhe e 16 sta per formule)
Se la prima funzione ha dato valore nullo, si ha:

Codice: Seleziona tutto

area=intervalloDInamicoDeiTitoli
   If isNull(area) Then Exit Sub
cioè la macro non fa nulla. Ha incontrato un errore e quindi non ottieni alcun risultato.
Se tutto è andato bene invece procede e la variabile "area" risulta essere l'array di tre elementi (nel tuo esempio hai fornito tre elenchi) contenente gli absoluteName dei tre elenchi (dal titolo all'ultimo rigo dell'elenco, dalla prima colonna alla terza) .

Codice: Seleziona tutto

   a=split(area(i),":")
      b=split(a(0),"$")
      testo=""
      For j=0 To ubound(b)-1
         testo=testo & b(j) 'costruisco testo per la funzione se
      Next
      c=split(a(1),"$")
      d=Clng(c(ubound(c)))-Clng(b(ubound(b)))
Le variabili a, b, c sono degli array risultati di split, che mi servono per raccogliere soltanto alcune parti della stringa fornita da "AbsoluteName".
d è l'operazione per capire da quanti elementi è composto un elenco.


Come anticipato, sono un pò arrugginito, quindi ho fatto un assemblaggio di alcune cose che mi ricordavo e di altre che volevo ripassare. DI sicuro non ti ho messo sul tavolo niente di semplice, quindi non ti preoccupare a chiedere. Mi sono permesso di girarti questo mix solo per darti una panoramica su vari strumenti che si possono adoperare. Ho capito che sei curioso e che vuoi imparare.
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Avatar utente
Biagio91
Messaggi: 238
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Beh, hai ragione, tempo permettendo sicuramente l'argomento mi interessa.

Ti ringrazio per le spiegazione già date e per la disponibilità ad eventuali altri spiegazioni future.
Appena possibile inizio a studiarmelo bene.

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

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Il codice seguente AreaRiepilogo=FoglioRiepilogo.getcellrangebyposition(1,rigo-1,3,Cursore.rangeaddress.endRow+1).ClearContents(20) serve a cancellare tutti i numeri e formule presente nell'intervallo desiderato? Se non necessitassi per il momento di questa opzione potrei commentarlo tranquillamente?

Il codice seguente aree_prodotti=dimarray(ubound(Titoli_prodotti)) serve a creare un vettore vuoto di dimensione pari all'array Titoli_prodotti ovvero 3
DimArray(args) Return an empty Variant array. The arguments specify the dimension.
Giusto?


Range2....ecco qui iniziano i problemi seri....Ho capito che questo assieme alla funzione ricerca è un punto chiave del codice, ma non riesco ad uscirne a capirne il funzionamento.

Quando provo a far girare la macro, mi si ferma su
Errore qui:
Aree_Prodotti(i)=FoglioElencoProdotti.GetCellRangeByPosition(Col_Titoli, CellaTitolo.RangeAddress.StartRow+2, Col_Titoli+2, ArrayTabelle_Prodotti(j).rangeaddress.EndRow).AbsoluteName


Sono convinto che dipenda da (j) ma per l'appunto, l'indice secondario (j),la parte di Range2
Do
range2 = arrayTabelle_Prodotti(j).queryintersection(CellaTitolo.rangeaddress)
if range2.RangeAddressesAsString <> "" Then Exit do
j=j+1
Loop


e la parte

Codice: Seleziona tutto

oCell0=FoglioRiepilogo.getCellByPosition(1,rigo-1)
         ocell0.formulalocal = FormulaRiepilogativaRange0
         FormulaRiepilogativaRange1 = "=CERCA.VERT(B" & rigo & ";" & area(i) & ";2;0)"
         FormulaRiepilogativaRange2 = "=CERCA.VERT(B" & rigo & ";" & area(i) & ";3;0)"
         oCell0=FoglioRiepilogo.getCellByPosition(2,rigo-1)
         ocell0.formulalocal = FormulaRiepilogativaRange1
         oCell0=FoglioRiepilogo.getCellByPosition(3,rigo-1)
         ocell0.formulalocal = FormulaRiepilogativaRange2
         rigo=rigo+1
      Next
      FormulaRiepilogativaRange0 ="=SE(" & testo & Clng(b(ubound(b)))+j+1 & "="""";""Vuoto"";" & testo & Clng(b(ubound(b)))+j+1 & ")"
      oCell0=FoglioRiepilogo.getCellByPosition(1,rigo-1)
      ocell0.formulalocal = FormulaRiepilogativaRange0
      rigo=rigo+1
   NEXT
sono quelle più ostiche sulle quali dovrei veramente chiederti delucidazioni in merito...non capisco come andare a risolvere.... allego l'immagine dell'errore.

Intanto, mi domando come mai ci sia la necessità di ridefinire per due volte
FormulaRiepilogativaRange0 ="=SE(" & testo & Clng(b(ubound(b)))+j+1 & "="""";""Vuoto"";" & testo & Clng(b(ubound(b)))+j+1 & ")"
oCell0=FoglioRiepilogo.getCellByPosition(1,rigo-1)
ocell0.formulalocal = FormulaRiepilogativaRange0
La prima dentro il primo ciclo For, la seconda dentro il secondo ciclo For;

Inoltre...vorrei domandarti come mai alla fine dei cicli si definisce rigo=rigo+1

Insomma, avrei da porti un sacco di domande soprattutto perché quanto mi hai suggerito è veramente interessantissimo e mi stavo domandando a questo punto se potessi scriverti in privato.
Allegati
Cattura.PNG
Cattura.PNG (6.1 KiB) Visto 3793 volte
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Avatar utente
Biagio91
Messaggi: 238
Iscritto il: mercoledì 3 febbraio 2021, 20:25

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Codice: Seleziona tutto

	Area=IntervalloDinamicoDeiTitoli
	If IsNull(Area) Then Exit Sub
	For i=0 To Ubound(Area)
		a=Split(Area(i),":")
		b=Split(a(0),"$")
		Testo=""
		For j=0 To Ubound(b)-1
			Testo=Testo & b(j) 'costruisco testo per la funzione se
		Next
		c=Split(a(1),"$")
		d=CLng(c(Ubound(c)))-CLng(b(Ubound(b))) 'Clng = Converti in Long
		For j=0 To d


		'Il codice di FormulaRiepProdotto è stato preparato giustamente come suggerito dal file esempio del forum
		'Ma effettivamente a me serviserbbe che il testo scritto, fosse pure un collegamento al relativo foglio, quindi la successiva formula andrebbe rivista 
		'Come da esempio del forum:	'=SE(ElencoProdotti.B5="";"Vuoto";ElencoProdotti.B5)
			FormulaRiepProdotto ="=SE(" & Testo & Clng(b(Ubound(b)))+j & "="""";""Vuoto"";" & Testo & Clng(b(Ubound(b)))+j & ")"
			oCell0=FoglioRiepilogo.GetCellByPosition(1,Rigo-1) 'B4
			ocell0.FormulaLocal = FormulaRiepProdotto
			FormulaRiepScorta = "=CERCA.VERT(B" & Rigo & ";" & Area(i) & ";2;0)"	'Scorta
			FormulaRiepStabilita = "=CERCA.VERT(B" & Rigo & ";" & Area(i) & ";3;0)"	'Stabilità
			oCell0=FoglioRiepilogo.GetCellByPosition(2,Rigo-1)
			ocell0.FormulaLocal = FormulaRiepScorta
			oCell0=FoglioRiepilogo.GetCellByPosition(3,Rigo-1)
			ocell0.FormulaLocal = FormulaRiepStabilita
			Rigo=Rigo+1
		Next
		FormulaRiepProdotto ="=SE(" & Testo & Clng(b(Ubound(b)))+j+1 & "="""";""Vuoto"";" & Testo & Clng(b(Ubound(b)))+j+1 & ")"
		oCell0=FoglioRiepilogo.getCellByPosition(1,Rigo-1)
		ocell0.FormulaLocal = FormulaRiepProdotto
		Rigo=Rigo+1
	NEXT
In questa parte qui è possibile che forse manchi qualcosa o ci sia una ripetizione di qualcosa? non capisco come mai abbiamo inserito 2 volte la parte
FormulaRiepProdotto ="=SE(" & Testo & Clng(b(Ubound(b)))+j+1 & "="""";""Vuoto"";" & Testo & Clng(b(Ubound(b)))+j+1 & ")"
oCell0=FoglioRiepilogo.getCellByPosition(1,Rigo-1)
ocell0.FormulaLocal = FormulaRiepProdotto
Rigo=Rigo+1

una nel primo ciclo e una nel secondo, e se avessimo quindi dovuto inserire anche le altre oppure non inserire questa...


Comunque ho fatto una copia allegabile del file finale su cui forse a questo punto converrebbe testare il codice assieme al resto.

Lo allegherei se mi dici che ci guardiamo assieme

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

Re: Riferimento Indirizzo Righe Colonne

Messaggio da Biagio91 »

Hei per caso ci sono novità?
purtroppo sono ancora bloccato..
OpenOffice 4.1.8 su Windows 7-10
::::May we meet again into the matrix::::
Rispondi