You are viewing a plain text version of this content. The canonical link for it is here.
Posted to utenti-it@openoffice.apache.org by gurxs <gu...@yahoo.it> on 2014/06/26 16:30:55 UTC

[utenti-it] Assegnare una macro all'evento del foglio via Basic

Buongiorno a tutti,

sto preparando un cockpit in Calc per eseguire alcuni controlli 
automatici sulla gestione di Errori.

Fin'ora me la sono cavata abbastanza bene con Basic, ma adesso mi sono 
arenato su questo problema e spero che qualcuno di voi abbia e/o sappia 
aiutarmi a risolverlo.

Quando l'utente inserisce un titolo nel foglio "Generale", ho fatto una 
macro che, in modo automatico, vada ad aprire un nuovo foglio di calcolo 
e lo popola con le formule necessarie, inoltre crea una specie di 
tabella (Rating).

Questa tabella è fatta in questo modo: le prime 3 colonne e le prime N 
righe del foglio contengono valori e/o formule.
Questo Range di elementi li ho anche inseriti in un DatabaseNameRange.
Vorrei "Sortare" questo NamedRange ogni volta che una qualsiasi cella 
del foglio viene modificata.

via Gui, questo lo ottengo cliccando con il tasto destro sul nome del 
foglio, quindi vado su
Eventi foglio --> Contenuto Modificato clicco su Macro e scelgo la 
Subroutine che mi interessa far girare.

Fatta a mano, funziona, ma (poiché il foglio nasce ad un preciso evento) 
vorrei fare questa assegnazione via Basic.

Qualcuno ha idea di come potrei fare e / o dove posso trovare questa info ?

Grazie
AS


---
Questa e-mail è priva di virus e malware perché è attiva la protezione avast! Antivirus.
http://www.avast.com


---------------------------------------------------------------------
To unsubscribe, e-mail: utenti-it-unsubscribe@openoffice.apache.org
For additional commands, e-mail: utenti-it-help@openoffice.apache.org


[utenti-it] Funzione Sort che non Ordina (era: Assegnare una macro all'evento del foglio via Basic)

Posted by gurxs <gu...@yahoo.it>.
Ciao a tutti,

dopo giorni di ricerche su internet che non hanno portato a nulla e 
nessuna risposta alla mail precedente, ho deciso di fare un workaround 
al problema.

La soluzione che tento di attuare è la seguente.

Quando, la macro che rileva un nuovo titolo, crea il nuovo foglio e 
carica dati e tabella,
aggiunge nella prima cella della colonna successiva alla tabella la funzione

     ORSheet.getCellByPosition(ORCol + 1, 0).Formula = 
"=FSORTRATINGS(""ORRATINGS"")"

La funzione

Public Function FSORTRATINGS(wRange as Variant)
     SortRatings()
     FSORTRATINGS = "Sorted"
End Function

chiama la subroutine di Sort (presa da internet e modificata)

Sub SortRatings()
   Dim oSheet        ' Calc sheet containing data to sort.
   Dim oCellRange    ' Data range to sort.

   REM An array of sort fields determines the columns that are
   REM sorted. This is an array with two elements, 0 and 1.
   REM To sort on only one column, use:
   REM Dim oSortFields(0) As New com.sun.star.util.SortField
   Dim oSortFields(1) As New com.sun.star.util.SortField

   REM The sort descriptor is an array of properties.
   REM The primary property contains the sort fields.
   Dim oSortDesc(0) As New com.sun.star.beans.PropertyValue

   REM Get the sheet named "Sheet1"
   oSheet = ThisComponent.Sheets.getByName("Orders")

   REM Get the cell range to sort
   oCellRange = oSheet.getCellRangeByName("ORRATINGS")

   REM Select the range to sort.
   REM The only purpose would be to emphasize the sorted data.
   'ThisComponent.getCurrentController.select(oCellRange)

   REM The columns are numbered starting with 0, so
   REM column A is 0, column B is 1, etc.
   REM Sort column B (column 1) descending.
   oSortFields(0).Field = 1
   oSortFields(0).SortAscending = True

   REM If column B has two cells with the same value,
   REM then use column A ascending to decide the order.
   oSortFields(1).Field = 0
   oSortFields(1).SortAscending = True

   REM Setup the sort descriptor.
   oSortDesc(0).Name = "SortFields"
   oSortDesc(0).Value = oSortFields()

   REM Sort the range.
   oCellRange.Sort(oSortDesc())
End Sub

Credevo, con questa soluzione, di aver fatto una furbata, invece non 
funziona, nel senso che la routine non si innesca.

Ho provato a mettere dei MSGBOX per verificare, ma non arriva mai a 
lanciare la sub.

Sareste così gentili da dirmi cosa sbaglio ?
Grazie

---
Questa e-mail è priva di virus e malware perché è attiva la protezione avast! Antivirus.
http://www.avast.com


---------------------------------------------------------------------
To unsubscribe, e-mail: utenti-it-unsubscribe@openoffice.apache.org
For additional commands, e-mail: utenti-it-help@openoffice.apache.org


Re: [utenti-it] Assegnare una macro all'evento del foglio via Basic

Posted by Cesare Spaziani <ce...@gmail.com>.
Ciao,
per gestire gli eventi da macro puoi procedere in due modi.

1. assegnando una sub-routine all'evento:

Sub SetDocEvent()
Dim oSheet
Dim mEvt(1) as New com.sun.star.beans.PropertyValue
    oSheet = ThisComponent.getCurrentController.ActiveSheet
    mEvt(0).Name = "EventType"
    mEvt(0).Value= "Script"
    mEvt(1).Name = "Script"
    mEvt(1).Value
="vnd.sun.star.script:Standard.Module1.TestEventChange?language=Basic&location=application"
    oSheet.getEvents().replaceByName("OnChange", mEvt())   
End Sub

Sub TestEventChange
    Msgbox("Test")
End Sub

2. utilizzando gli event listner:

Global oSheet, oRange, oListener

Sub AddListener
    oSheet = ThisComponent.getCurrentController.ActiveSheet
    oRange = oSheet.getCellRangeByName("A1:B2")
    oListener = CreateUnoListener("Test_",
"com.sun.star.chart.XChartDataChangeEventListener")
    oRange.addChartDataChangeEventListener(oListener)
End Sub

Sub Test_chartDataChanged
    MsgBox("Test")
End Sub

Sub RemoveListner
    oRange.removeChartDataChangeEventListener(oListener)
End Sub

Il primo metodo è del tutto equivalente all'assegnazione che fai via GUI.
Il secondo permette di attivare più listener sullo stesso foglio su
range diversi, e quindi è utile per gestire situazioni più complicate.

C.

Il 26/06/2014 16:30, gurxs ha scritto:
> Buongiorno a tutti,
>
> sto preparando un cockpit in Calc per eseguire alcuni controlli
> automatici sulla gestione di Errori.
>
> Fin'ora me la sono cavata abbastanza bene con Basic, ma adesso mi sono
> arenato su questo problema e spero che qualcuno di voi abbia e/o
> sappia aiutarmi a risolverlo.
>
> Quando l'utente inserisce un titolo nel foglio "Generale", ho fatto
> una macro che, in modo automatico, vada ad aprire un nuovo foglio di
> calcolo e lo popola con le formule necessarie, inoltre crea una specie
> di tabella (Rating).
>
> Questa tabella è fatta in questo modo: le prime 3 colonne e le prime N
> righe del foglio contengono valori e/o formule.
> Questo Range di elementi li ho anche inseriti in un DatabaseNameRange.
> Vorrei "Sortare" questo NamedRange ogni volta che una qualsiasi cella
> del foglio viene modificata.
>
> via Gui, questo lo ottengo cliccando con il tasto destro sul nome del
> foglio, quindi vado su
> Eventi foglio --> Contenuto Modificato clicco su Macro e scelgo la
> Subroutine che mi interessa far girare.
>
> Fatta a mano, funziona, ma (poiché il foglio nasce ad un preciso
> evento) vorrei fare questa assegnazione via Basic.
>
> Qualcuno ha idea di come potrei fare e / o dove posso trovare questa
> info ?
>
> Grazie
> AS
>
>
> ---
> Questa e-mail è priva di virus e malware perché è attiva la protezione
> avast! Antivirus.
> http://www.avast.com
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: utenti-it-unsubscribe@openoffice.apache.org
> For additional commands, e-mail: utenti-it-help@openoffice.apache.org
>