[Risolto] CellAddress di un MAX e Search nei valori

Creare una macro - Scrivere uno script - Usare le API
Rispondi
Gray Mouser
Messaggi: 3
Iscritto il: domenica 19 marzo 2017, 23:53

[Risolto] CellAddress di un MAX e Search nei valori

Messaggio da Gray Mouser »

Salve
Ho un'infarinatura di VBA , ma mi sono accorto che è come pretendere di capire il rumeno solo perchè si conosce l'italiano ^^"

Sto lavorando su questo codice , e mi servirebbe sapere come recuperare il .Row del MAX

Codice: Seleziona tutto

Sub Rosse

objSheet=ThisComponent.Sheets(0)
objRange=objSheet.getCellRangeByName("B2:B129")
strUltPropr=objSheet.getCellByPosition(10,16).string

Search_Desc = objRange.createSearchDescriptor()
Search_Desc.SearchString = strUltPropr
Search_Result = objRange.findAll(Search_Desc)
intNumFound = Search_Result.Count
LastOccur = Search_Result.getByIndex( intNumFound - 1) 
objCellAddr = LastOccur.CellAddress
intRow = objCellAddr.Row

objRange1=objSheet.getCellRangeByName("F2:F" & intRow)
dblMaxRatio=objRange1.computeFunction(com.sun.star.sheet.GeneralFunction.MAX)

' intRow1 = --- la riga dove si trova il massimo ---
End Sub
La prima parte serve per stabilire il range ( variabile ) dove cercare il massimo ( in una colonna di formule ) . Nella seconda parte dovrei fare delle modifiche nella stessa riga del massimo . Purtroppo arrivo fino ad avere dblMaxRatio e poi non ho più idea di come andare avanti.

Dato che non son riuscito a trovare una soluzione diretta ( ed arriviamo alla seconda parte del problema ) ho provato ad utilizzare un nuovo SearchDescriptor usando dblMaxRatio come SearchString , ma ho un errore in

Codice: Seleziona tutto

intNumFound1 = Search_Result1.Count
A furia di sbatterci la testa ho pensato che fosse perchè non trovava nulla , ed ho provato con Modifica > Cerca e sostituisci , il quale effettivamente non ha trovato nulla finchè non gli ho detto di cercare in Valori anzichè in Formule.
Non sono riuscito a trovare nessuna proprietà di SearchDescriptor che mi consenta di far fare allo script una ricerca per valori anzichè ( come pare stia facendo ) per formule . Quindi la seconda domanda è : come posso fare ?
Ultima modifica di charlie il sabato 1 aprile 2017, 14:03, modificato 2 volte in totale.
Motivazione: Inserito spunta verde.
OpenOffice 4.1.3 su Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4016
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: CellAddress di un MAX e Search nei valori

Messaggio da patel »

Codice: Seleziona tutto

Sub Rosse
objSheet=ThisComponent.Sheets(0)
objRange=objSheet.getCellRangeByName("B2:B129")
strUltPropr=objSheet.getCellByPosition(10,16).string

Search_Desc = objRange.createSearchDescriptor()
Search_Desc.SearchString = strUltPropr
Search_Result = objRange.findAll(Search_Desc)
intNumFound = Search_Result.Count
LastOccur = Search_Result.getByIndex( intNumFound - 1) 
objCellAddr = LastOccur.CellAddress
intRow = objCellAddr.Row
objRange1=objSheet.getCellRangeByName("F2:F" & intRow)
dblMaxRatio=objRange1.computeFunction(com.sun.star.sheet.GeneralFunction.MAX)
'--------------
Search_Desc = objRange1.createSearchDescriptor()
Search_Desc.SearchString = dblMaxRatio
Search_Result = objRange1.findAll(Search_Desc)
objCellAddr = Search_Result(0).CellAddress
intRow = objCellAddr.Row + 1
print introw
End Sub
un altro modo poteva essere scorrere il range con un ciclo For riga per riga e trovare la riga in cui è il MAX
-------------------
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
Gray Mouser
Messaggi: 3
Iscritto il: domenica 19 marzo 2017, 23:53

Re: CellAddress di un MAX e Search nei valori

Messaggio da Gray Mouser »

Si pianta qui
Immagine

Per comodità allego il file , forse così verrà più facile trovare una soluzione
Allegati
PropV3_0.ods
(40.26 KiB) Scaricato 154 volte
OpenOffice 4.1.3 su Windows 7
Gaetanopr
Volontario
Volontario
Messaggi: 3291
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: CellAddress di un MAX e Search nei valori

Messaggio da Gaetanopr »

Lasciando la prima parte invariata cambierei la seconda così

Codice: Seleziona tutto

Sub Rosse
objSheet=ThisComponent.Sheets(0)
objRange=objSheet.getCellRangeByName("B2:B129")
strUltPropr=objSheet.getCellByPosition(10,16).string

Search_Desc = objRange.createSearchDescriptor()
Search_Desc.SearchString = strUltPropr
Search_Result = objRange.findAll(Search_Desc)
intNumFound = Search_Result.Count
LastOccur = Search_Result.getByIndex( intNumFound - 1) 
objCellAddr = LastOccur.CellAddress
intRow = objCellAddr.Row
objRange1=objSheet.getCellRangeByName("F2:F" & intRow)
Dim calc
calc = createUnoService( "com.sun.star.sheet.FunctionAccess" )
Massimo = calc.callFunction("MAX", Array(objRange1)    
print calc.callFunction("MATCH", Array(Massimo, objRange1, False)) + 1


End Sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Gray Mouser
Messaggi: 3
Iscritto il: domenica 19 marzo 2017, 23:53

Re: CellAddress di un MAX e Search nei valori

Messaggio da Gray Mouser »

Funziona perfettamente , grazie

Codice: Seleziona tutto

Sub Rosse

objSheet=ThisComponent.Sheets(0)
objRange=objSheet.getCellRangeByName("B2:B129")
strUltPropr=objSheet.getCellByPosition(10,16).string

Search_Desc = objRange.createSearchDescriptor()
Search_Desc.SearchString = strUltPropr
Search_Result = objRange.findAll(Search_Desc)
intNumFound = Search_Result.Count
intLastOccur = Search_Result.getByIndex( intNumFound - 1) ' get the Cell containing the last "Menu", need the -1 because indexes start at zero
objCellAddr = intLastOccur.CellAddress
intRow = objCellAddr.Row

objRange1=objSheet.getCellRangeByName("F2:F" & intRow)
'dblMaxRatio=objRange1.computeFunction(com.sun.star.sheet.GeneralFunction.MAX)
Dim calc
calc = createUnoService( "com.sun.star.sheet.FunctionAccess" )
Massimo = calc.callFunction("MAX", Array(objRange1)    
intRow1 = calc.callFunction("MATCH", Array(Massimo, objRange1, False))
objCellCost = objSheet.getCellByPosition(3, intRow1)
objCellCost.CellBackColor = 4

End Sub
Ora dovrò vedere come usare LARGE per avere non solo il max ma i primi 3 valori con relativa posizione , ma questa è un'altra storia ;)
OpenOffice 4.1.3 su Windows 7
Rispondi