Alle 01:17, venerdì 2 marzo 2007, Bart Aimar ha scritto:
> Mirko Santarelli ha scritto:
> > In effetti mi ero rivolto qui perche' la mia intenzione era di creare
> > una macro, ieri ci ho lavorato un po' (su carta) sulle possibili
> > soluzioni, poi mi metto al PC (anzi al MAC) con Openoffice 2.0 a provare
> > intanto il cerca e sostituisci e con questo semplice codice
> >
> > Sub prova
> > Dim Doc As Object
> > Dim Shett As Object
> > Dim ReplaceDescriptor As Object
> > Dim I As Integer
> > Doc = StarDesktop.CurrentComponent
> > Sheet = Doc.Sheets(0)
> > ReplaceDescriptor = Sheet.createReplaceDescriptor()
> > ReplaceDescriptor.SearchString = "is"
> > ReplaceDescriptor.ReplaceString = "was"
> > For I = 0 to Doc.Sheets.Count - 1
> > Sheet = Doc.Sheets(I)
> > Sheet.ReplaceAll(ReplaceDescriptor)
> > Next I
> >
> > End sub
> >
> > mi viene restituito errore sulla riga
> > Sheet= Doc. Sheets(0)     ...errore di runtime basic proprieta' o metodo
> > non trovati
>
> Prima di tutto devi decide se cercare in tutto il documento o soltanto
> su una tabella (magari quella attiva...)
> Io per il momento mi eviterei delle grane (la vita è già abbastanza
> complicata di suo) e cercherei solo sulla tabella attiva.
>
> In tal caso userei questo codice:
>
> Doc = thisComponent ' per ottenere il documento attivo
> Sheet = Doc.Sheets.getByName(doc.currentcontroller.activesheet.name) '
> per ottenere la tabella attiva

Non capisco perchè tutto sto giro per recuperare il foglio attivo:
Questo è sufficiente:
Sheet = doc.currentcontroller.activesheet


>
> Ho provato a sostituire nella tua macro quelle due righe e la macro
> funziona; cioè ti sostituisce gli "is" che hai scritto con dei "was"...
>
> Ma si tratta della sostituzione di una stringa e non della proprietà
> "colore di sfondo" di una cella....
> Pur conoscendo poco il ReplaceDescriptor, ritengo che con quello si
> possano trovare e sostituire soltanto le stesse cose che si possono
> trovare/sostituire con la GUI... e non di più.
> Quindi non ti risolve il problema!

sono daccordo


> Io ti consiglierei di usare un ciclo di for percorrendo cella per cella
> dal A1 all'ultima cella usata.
> Per ciascuna cella un if che verifica la proprietà " colore di sfondo",
> e se corrisponde a quello che cerchi lo modifica a "trasparente".
>
> Probabilmente ci sono dei metodi migliori... ma questo è quello che farei.

Il concetto di base è quello, però un ciclo in tutte le celle usate può 
diventare abbastanza oneroso dal punto di vista delle risorse.
Esistono dei metodi ottimizzati per selezionare le celle in base alle loro 
caratteristiche di contenuto o formattazione, come ad esempio i metodi 
dell'interfaccia XCellRangesQuery
In particolare ci sarebbe il metodo queryContentCells() che potrebbe servire 
allo scopo.
Questo metodo prende un parametro numerico che specifica quale tipo di 
contenuto cercare, ad es:

com.sun.star.sheet.CellFlags.HARDATTR 

selects all explicit formatting, but not the formatting which is applied 
implicitly through style sheets.  

In ogni caso, nonostante sembrasse perfetto, il metodo non mi ha consentito di 
ottenere il risultato atteso.
Funziona bene se si cercano contenuti semplici come STRING oppure VALUE o 
FORMULA, ma con i formati non funge.

Forse è un bug.

Fortunatamente esiste un modo molto più efficiente e soprattutto funzionante 
basato sul metodo getCellFormatRanges, che fa parte dell'interfaccia 
XCellFormatRangesSupplier la quale è supportata da qualunque range di calc, 
(anche un'intera tabella è un range)


ecco un breve esempio:

REM  *****  BASIC  *****

Sub Main

'colore da cercare e sostituire
MyCellBackColor = RGB(100,100,100)

oSheet = ThisComponent.CurrentController.ActiveSheet
oCellFormatRanges = oSheet.getCellFormatRanges
oRangeEnum = oCellFormatRanges.createEnumeration
While oRangeEnum.hasMoreElements
        oRange = oRangeEnum.nextElement
        If oRange.cellbackColor <> MyCellBackColor Then 
                oRange.cellbackColor = -1 'default (transparent)
        End If
        
Wend

End Sub




saluti
Paolo M


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Rispondere a