uno:ExecuteSearch range ricerca & caratteri speciali

Creare una macro - Scrivere uno script - Usare le API
Rispondi
mario-T
Messaggi: 38
Iscritto il: venerdì 7 marzo 2014, 12:48

uno:ExecuteSearch range ricerca & caratteri speciali

Messaggio da mario-T »

Ciao, dovendo eliminare il conenuto di celle che contengono parti di testo indesiderato, uso questo tipo di semplice macro:

Codice: Seleziona tutto

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

Sub Main
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
rem ----------------------------------------------------------------------
dim args26(17) as new com.sun.star.beans.PropertyValue
args26(0).Name = "SearchItem.StyleFamily"
args26(0).Value = 2
args26(1).Name = "SearchItem.CellType"
args26(1).Value = 0
args26(2).Name = "SearchItem.RowDirection"
args26(2).Value = true
args26(3).Name = "SearchItem.AllTables"
args26(3).Value = false
args26(4).Name = "SearchItem.Backward"
args26(4).Value = false
args26(5).Name = "SearchItem.Pattern"
args26(5).Value = false
args26(6).Name = "SearchItem.Content"
args26(6).Value = false
args26(7).Name = "SearchItem.AsianOptions"
args26(7).Value = false
args26(8).Name = "SearchItem.AlgorithmType"
args26(8).Value = 0
args26(9).Name = "SearchItem.SearchFlags"
args26(9).Value = 65536
args26(10).Name = "SearchItem.SearchString"
args26(10).Value = "PALLAVOLO "
args26(11).Name = "SearchItem.ReplaceString"
args26(11).Value = ""
args26(12).Name = "SearchItem.Locale"
args26(12).Value = 255
args26(13).Name = "SearchItem.ChangedChars"
args26(13).Value = 2
args26(14).Name = "SearchItem.DeletedChars"
args26(14).Value = 2
args26(15).Name = "SearchItem.InsertedChars"
args26(15).Value = 2
args26(16).Name = "SearchItem.TransliterateFlags"
args26(16).Value = 1280
args26(17).Name = "SearchItem.Command"
args26(17).Value = 1

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args26())

rem ----------------------------------------------------------------------
dim args27(17) as new com.sun.star.beans.PropertyValue
args27(0).Name = "SearchItem.StyleFamily"
args27(0).Value = 2
args27(1).Name = "SearchItem.CellType"
args27(1).Value = 0
args27(2).Name = "SearchItem.RowDirection"
args27(2).Value = true
args27(3).Name = "SearchItem.AllTables"
args27(3).Value = false
args27(4).Name = "SearchItem.Backward"
args27(4).Value = false
args27(5).Name = "SearchItem.Pattern"
args27(5).Value = false
args27(6).Name = "SearchItem.Content"
args27(6).Value = false
args27(7).Name = "SearchItem.AsianOptions"
args27(7).Value = false
args27(8).Name = "SearchItem.AlgorithmType"
args27(8).Value = 0
args27(9).Name = "SearchItem.SearchFlags"
args27(9).Value = 65536
args27(10).Name = "SearchItem.SearchString"
args27(10).Value = "PALLAVOLO "
args27(11).Name = "SearchItem.ReplaceString"
args27(11).Value = ""
args27(12).Name = "SearchItem.Locale"
args27(12).Value = 255
args27(13).Name = "SearchItem.ChangedChars"
args27(13).Value = 2
args27(14).Name = "SearchItem.DeletedChars"
args27(14).Value = 2
args27(15).Name = "SearchItem.InsertedChars"
args27(15).Value = 2
args27(16).Name = "SearchItem.TransliterateFlags"
args27(16).Value = 1280
args27(17).Name = "SearchItem.Command"
args27(17).Value = 3

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args27())

rem ----------------------------------------------------------------------
End Sub
So che si possono anche impostare delle funzioni che fanno questo tipo di cose, ma non sono mai riuscito a farle funzionare, per cui mi appoggio a ciò che mi funziona. Quando devo eliminare molte parole, inserisco un ciclo for next che legge una colonna di parole "indesderate" ed una variabile così elimino tutto in maniera semplice e veloce. A forza di usare questo tipo di ricerca mi sono venute alcune domande.
1- È possibile far leggere i dati da cercare sul foglio1 e farli cancellare sul foglio2?
2- Si può impostare un range di celle all' interno del quale far sostituire le parole cercate? (Non riesco ad essere più chiaro di così..) Faccio un esempio. Nel foglio1 devo cercare la parola patata, posso fare in modo che venga cercata solo nel range A1:M77?
3- Questo tipo di opzione:
args27(10).Name = "SearchItem.SearchString"
args27(10).Value = "PALLAVOLO "
consente in qualche modo l' utilizzo di carateri speciali? Tipo PAL* (che non funziona....) per far cercare tutte la parole che iniziano con PAL?
Spero di essere stato chiaro, grazie.
LibreOffice 7.3.7.2 su LinuxMint 21.3
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: uno:ExecuteSearch range ricerca & caratteri speciali

Messaggio da patel »

una macro più semplice della tua è questa

Codice: Seleziona tutto

Sub replacestring2
Dim Doc As Object, Sheet As Object, sostituisci As Object
Doc = ThisComponent
Sheet = Doc.Sheets(0)
sostituisci = Sheet.getCellRangeByName("A1:A8").createReplaceDescriptor()
sostituisci.SearchString = "pippo"
sostituisci.ReplaceString = "pluto"
Sheet.ReplaceAll(sostituisci) 
end sub
per la domanda 1 allega un file di esempio, per la 3 non so.
Ultima modifica di patel il mercoledì 19 marzo 2014, 19:13, modificato 2 volte in totale.
-------------------
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
mario-T
Messaggi: 38
Iscritto il: venerdì 7 marzo 2014, 12:48

Re: uno:ExecuteSearch range ricerca & caratteri speciali

Messaggio da mario-T »

Intanto grazie per la risposta, poi allego un file di prova, in cui la macro una volta avviata cancella nel foglio planner tutte le stringhe elencate da G5 in poi. Ovviamente cancella pure quelle che sono da "esempio". Ecco il perchè della mia domanda sui fogli separati o il range da modificare. Ciao.
Allegati
test.ods
(18.34 KiB) Scaricato 168 volte
LibreOffice 7.3.7.2 su LinuxMint 21.3
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: uno:ExecuteSearch range ricerca & caratteri speciali

Messaggio da Gaetanopr »

Per quanto riguarda il punto 2 il range è possibile impostarlo, invece per il punto 3 si dovrebbero usare le espressioni regolari, ma da alcune prove che ho fatto ho qualche dubbio, quindi ho impostato la macro diversamente, uso il find e non il replace(concordo con quanto detto da patel)

Codice: Seleziona tutto

Sub replacestring2
Dim Doc As Object, Sheet As Object, sostituisci As Object
Dim Risc()
Doc = ThisComponent
Sheet = Doc.Sheets(0)
Range = Sheet.getCellRangeByName("A1:A100")
sostituisci = Range.createReplaceDescriptor()

With sostituisci
    .SearchRegularExpression = True
    .SearchString = "PAL*"
End With
    
   Risc = Range.findAll(sostituisci)
   If Not IsNull(Risc) Then 
    For each cell in Risc.Cells
      If cell.String Like "PAL*" Then cell.string = ""
    next cell  
   End if  
  
End sub
si può modificare anche in questo modo

Codice: Seleziona tutto

With sostituisci
    .SearchString = "PAL"
End With
La ricerca esatta avviene nel ciclo for each

Puoi anche usare un ciclo for next, effettuare la verifica con l'operatore Like e cancellare le occorrenze trovate, ma sicuramente il primo metodo è estremamente più veloce
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: uno:ExecuteSearch range ricerca & caratteri speciali

Messaggio da patel »

Gaetano, cosa ne pensi di questa (vedi file allegato da Mario) ?

Codice: Seleziona tutto

 Sub replacestring
    Dim Doc As Object, Sheet As Object, sostituisci As Object, Risc  As Object
    Doc = ThisComponent
    Sheet = Doc.Sheets(0)
    Range = Sheet.getCellRangeByName("G7:G12")
    sostituisci = Range.createReplaceDescriptor()
    sostituisci.SearchString = "2A-1"
    Risc = Range.findAll(sostituisci)
    If Not IsNull(Risc) Then  Risc.clearContents(5)
    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
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: uno:ExecuteSearch range ricerca & caratteri speciali

Messaggio da Gaetanopr »

Direi che è un'ottima soluzione(questa me la conservo)
Però credo siano d'obbligo delle spiegazioni per l'uso di entrambe le macro
mario-T ha scritto:....consente in qualche modo l' utilizzo di carateri speciali? Tipo PAL* (che non funziona....) per far cercare tutte la parole che iniziano con PAL?
Spero di essere stato chiaro, grazie.
Se si vogliono trovare tutte le parole che iniziano con PAL bisogna usare l'operatore Like, come ho fatto nella mia macro, se invece si devono cancellare tutte le parole dove è contenuta la parola PAL, quindi sia all'inizio o in qualsiasi altra parte del testo, la macro di patel è un'ottima soluzione.
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
mario-T
Messaggi: 38
Iscritto il: venerdì 7 marzo 2014, 12:48

Re: uno:ExecuteSearch range ricerca & caratteri speciali

Messaggio da mario-T »

Ammazza quanta ciccia..... Mi ci vorrà un po' sia per capirci in generale, sia per capire quale sia la cosa migliore da utilizzare, comunque GRAZIE MILLE!
LibreOffice 7.3.7.2 su LinuxMint 21.3
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: uno:ExecuteSearch range ricerca & caratteri speciali

Messaggio da Gaetanopr »

Patel, la macro può essere modificata così, in modo tale da cancellare il contenuto delle celle che inizia in un determinato modo(2A-1) come da esempio

Codice: Seleziona tutto

    Sub replacestring
    Dim Doc As Object, Sheet As Object, sostituisci As Object, Risc  As Object
    Doc = ThisComponent
    Sheet = Doc.Sheets(0)
    Range = Sheet.getCellRangeByName("G7:G12")
    sostituisci = Range.createReplaceDescriptor()
    With sostituisci
         .SearchRegularExpression = True
         .SearchString = "^2A-1"
    End With     
    Risc = Range.findAll(sostituisci)
    If Not IsNull(Risc) Then  Risc.clearContents(5)
    End sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: uno:ExecuteSearch range ricerca & caratteri speciali

Messaggio da patel »

giusto, e se si vuole cancellare il contenuto delle celle che finisce in un determinato modo(SEVE)
.SearchString = "SEVE$"
-------------------
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
Rispondi