Pagina 1 di 2

Trova e sostituisci

Inviato: mercoledì 2 maggio 2018, 19:38
da cater58
Sicuramente qualcosa in giro c'e' ... ma non riesco a trovarlo
mi serve una macro che molto semplicemente all'interno di un db csv mi trovi un valore alfanumerico e le lo cambi con un altro

esempi voglio cambiare tutti i "(2)" presenti nel database csv con "(B) " ... considerando che tale valore è CONTENUTO nellle celle e non è il loro ESATTO VALORE

esempio
IN TUTTE LE CELLE DEL DATABASE
se si trova una cella con valore "Antonio (2)" ... deve divenire "Antonio (B)"

potete darmi la stringa da inserire nel for next?
Gianni

Re: trova e sostituisci

Inviato: mercoledì 2 maggio 2018, 20:11
da patel
Vuoi trattare il file csv come un file di testo oppure lo apri con Calc e poi lo salvi in csv ? nel secondo caso potresti provare questa macro

Codice: Seleziona tutto

Sub replacestring
Dim Doc As Object, Sheet As Object, sostituisci As Object
Doc = ThisComponent
Sheet = Doc.Sheets(0)
sostituisci = Sheet.createReplaceDescriptor()
sostituisci.SearchString = "(2)"
sostituisci.ReplaceString = "(B)"
Sheet.ReplaceAll(sostituisci) 
end sub
altrimenti allega un csv di esempio

Re: trova e sostituisci

Inviato: mercoledì 2 maggio 2018, 20:37
da cater58
Innanzitutto grazie e ciao Patel

il file csv lo tratto come database

ti spiego meglio... io devo cambiare cosi come (2) in (B) , anche (3) in (C) .. e avanti cosi

quindi di fatto a me serve:

1) dentro un ciclo for next che ho gia correttamente impostato e che parte dalla ultima riga fino alla prima
2) per ogni riga
3) se trova (2) lo deve cambiare in (B) ... se trova (3) lo deve cambiare in (C) ... e avanti cosi ... seguendo una tabella di valori che ho io

Ora , per non complicarmi la vita, supponevo che se mi fosse stato detto come trasformare il (2) in (B) ... avrei io poi copiato i comandi le per le altre sostituzioni ... non so se è chiaro...

se puoi aiutarmi te ne sarei grato, io ho realizzato una cosa che funziona ma solo per i valori assoluti contenuti nelle celle, e non per porzioni di questi valori come a me serve

Ciao

Gianni

Re: trova e sostituisci

Inviato: giovedì 3 maggio 2018, 8:42
da patel
cater58 ha scritto: il file csv lo tratto come database
non so cosa significhi, lo apri con Base ? in questo caso non posso aiutarti

Re: trova e sostituisci

Inviato: giovedì 3 maggio 2018, 11:27
da cater58
non mi sono spiegato, certo che puoi .. allego il file di prova (tra l'altro proprio tu mi hai aiutato la scorsa volta sullo stesso file)

la macro è il modulo tre (la prima e la seconda le hai fatta tu)

io ho programmato allinizio la cancellazione di alcune colonne
successivamente c'e' il ciclo for next che mi serve e che al momento non fa cio che chiedo...ma identifica e sostituisce solo i valori assoluti dei campi

A ME INVECE SERVE per farti un esempio
- alla riga 10 colonna B c'e' Richard Tucker (2) ... mi deve divetare Richard Tucker (B)
- alla riga 51 colonna D c'e' ABC Classic (2) mi deve diventare ABC Classic (B)

poi... come ti ho detto (2) in (B) non è la unica variazione che mi serve ... poi saro' io a copiare le tue istruzioni variandole a mio uso ... (3) in (C) - (4) in (D) ecc ecc seguendo una tabella cha arriva a 100 ... certo sarebbe topico questa potesse essere usata in automatico...

Fammi sapere e grazie in anticipo per la tua disponibilità
Gianni

Re: trova e sostituisci

Inviato: giovedì 3 maggio 2018, 12:42
da patel
cater58 ha scritto:allego il file di prova (tra l'altro proprio tu mi hai aiutato la scorsa volta sullo stesso file)
la macro è il modulo tre (la prima e la seconda le hai fatta tu)
non hai allegato il file,Un file csv è un file di testo quindi non può contenere macro.
Se non rispondi mai alle mie domande non si va avanti, hai provato la macro che ti ho suggerito ?

Re: trova e sostituisci

Inviato: giovedì 3 maggio 2018, 13:27
da cater58
Ciao patel ... io il file lo vedo e lo ho pure riaperto dalla mesaggeria non so perche dici che non ho allegato nessun file
dammi un modo per inviartelo anche in privato...
si è un csv che apro con openoffice calc (non con database avevo sbagliato)
come ho detto gia contiene due macro che hai fatto tu, la terza è il mio tentativo di realizzare cio che mi serve ora
non ho provato la macro ... perchè non so come fare ad aggiungerla nel ciclo ... e piu che altro non so dove mettere le successive variazioni da 2/b 3/c ecc ecc

Re: trova e sostituisci

Inviato: giovedì 3 maggio 2018, 18:06
da patel
Ti ripeto, il file csv è un file di testo e non può contenere macro, documentati con google.
La mia macro non devi aggiungerla ad un ciclo, la devi provare da sola.
Forse tu le vedi le macro perché le hai messe in Macro personali invece che nel file ods, ma le vedi solo tu nel tuo pc.

Re: trova e sostituisci

Inviato: venerdì 4 maggio 2018, 16:16
da cater58

Codice: Seleziona tutto


Sub perdiskaos

doc=thiscomponent
Sh1 = Doc.Sheets(0)
c = Sh1.createCursor
c.gotoEndOfUsedArea(false)

Rem ----- Trova ultima riga dati utili nel foglio di lavoro -----
UltimaRiga = c.RangeAddress.EndRow

REM ----- Rimozione delle colonne che inizialmente non servono -----
Sh1.Columns.removeByIndex(0,1)
Sh1.Columns.removeByIndex(5,2)
Sh1.Columns.removeByIndex(6,1)
Sh1.Columns.removeByIndex(9,6)

Rem ----- Trova ultima riga dati utili nel foglio di lavoro -----
UltimaRiga = c.RangeAddress.EndRow

Rem ----- Avvio loop per la variazione dei codici  -----
For Riga = UltimaRiga To 2 Step -1
	If Sh1.getCellByPosition(0, Riga).string="Mannheim Steamroller" then Sh1.getCellByPosition(0, Riga).string="(B)"
	Next
End sub


Re: trova e sostituisci

Inviato: venerdì 4 maggio 2018, 16:26
da cater58
Ciao Patel
questa è la procedura dove si cancellano colonne nella prima parte, e dove cerco di fare la sostituzione che ti ho spiegato nella seconda
(essedo una prova qui provo a sostituire non "(2)" ma Manheim Steamroller" con "(B)" ... il concetto non cambia...)

La variazione che mi interessa e che ho spiegato dovrebbe stare dentro il ciclo for next.

Rem ----- Avvio loop per la variazione dei codici -----
For Riga = UltimaRiga To 2 Step -1
If Sh1.getCellByPosition(0, Riga).string="Mannheim Steamroller" then Sh1.getCellByPosition(0, Riga).string="(B)"
Next

Per quello che riguarda office e csv testo, non so come spiegarti ma aprendo il csv del formato del mio, mi viene chiesto se importarlo in oo calc , selezionando il divisore (nel mio caso ;
poi tutto funziona come calc, ma il formato rimane csv - devo usare questo formato per caricare nelle pagine we, ed è l'unico usabile

Sper di aver apiegato come mai posso usare un csv , ma non è questo il problema ... se mi aiuti ad inserire la variazione che mi serve, io sono a posto

Grazie ancora
Gianni

Re: trova e sostituisci

Inviato: venerdì 4 maggio 2018, 17:13
da patel
Non c'è bisogno di un ciclo for next

Codice: Seleziona tutto

Sub perdiskaos
doc=thiscomponent
Sh1 = Doc.Sheets(0)
c = Sh1.createCursor
c.gotoEndOfUsedArea(false)

Rem ----- Trova ultima riga dati utili nel foglio di lavoro -----
UltimaRiga = c.RangeAddress.EndRow

REM ----- Rimozione delle colonne che inizialmente non servono -----
Sh1.Columns.removeByIndex(0,1)
Sh1.Columns.removeByIndex(5,2)
Sh1.Columns.removeByIndex(6,1)
Sh1.Columns.removeByIndex(9,6)

Rem ----- Trova ultima riga dati utili nel foglio di lavoro -----
UltimaRiga = c.RangeAddress.EndRow

Rem ----- Avvio  variazione dei codici  -----
Dim  sostituisci As Object
sostituisci = Sh1.createReplaceDescriptor()
sostituisci.SearchString = "(2)"
sostituisci.ReplaceString = "(B)"
Sh1.ReplaceAll(sostituisci) 
End sub

Re: trova e sostituisci

Inviato: venerdì 4 maggio 2018, 17:21
da cater58
quindi devo aggiungere :

Codice: Seleziona tutto

sostituisci.SearchString = "(2)"
sostituisci.ReplaceString = "(B)"
sostituisci.SearchString = "(3)"
sostituisci.ReplaceString = "(C)"
sostituisci.SearchString = "(4)"
sostituisci.ReplaceString = "(d)"
....

e avanti cosi?

Re: trova e sostituisci

Inviato: venerdì 4 maggio 2018, 18:57
da patel
tutto dipende da quali sono i numeri da sostituire, se sono da 1 a 5 puoi fare così, se sono da 1 a 25 conviene mettere le lettere in un array e fare un ciclo.
Devi deciderti a spiegare tutto

Re: trova e sostituisci

Inviato: venerdì 4 maggio 2018, 19:02
da cater58
no i numeri sono da 2 a 100 seguendo una tabella che ho io
se mi puoi aiutare , te la invio .. in che formato ti serve?
Gianni

Re: trova e sostituisci

Inviato: venerdì 4 maggio 2018, 19:04
da patel
formato ods, quale lettera metti al posto del numero 100 ?

Re: trova e sostituisci

Inviato: venerdì 4 maggio 2018, 19:42
da cater58
ti invio il file ... i valori hanno un senso assegnato da me (oltre il numero delle lettere dell'alfabeto assegno valori particolari)
comunque ok , va bene anche appena puoi.
intanto ti invio il file
immensamente grazie
Gianni

Re: trova e sostituisci

Inviato: venerdì 4 maggio 2018, 20:07
da patel
non vedo file allegati, ma la mia sub funziona ? non l'hai ancora detto

Re: trova e sostituisci

Inviato: sabato 5 maggio 2018, 11:12
da cater58
questa macro qui si funziona per (2) >> (B)

Codice: Seleziona tutto

Sub perdiskaos
doc=thiscomponent
Sh1 = Doc.Sheets(0)
c = Sh1.createCursor
c.gotoEndOfUsedArea(false)

Rem ----- Trova ultima riga dati utili nel foglio di lavoro -----
UltimaRiga = c.RangeAddress.EndRow

REM ----- Rimozione delle colonne che inizialmente non servono -----
Sh1.Columns.removeByIndex(0,1)
Sh1.Columns.removeByIndex(5,2)
Sh1.Columns.removeByIndex(6,1)
Sh1.Columns.removeByIndex(9,6)

Rem ----- Trova ultima riga dati utili nel foglio di lavoro -----
UltimaRiga = c.RangeAddress.EndRow

Rem ----- Avvio  variazione dei codici  -----
Dim  sostituisci As Object
sostituisci = Sh1.createReplaceDescriptor()
sostituisci.SearchString = "(2)"
sostituisci.ReplaceString = "(B)"
Sh1.ReplaceAll(sostituisci) 
End sub

Re: trova e sostituisci

Inviato: sabato 5 maggio 2018, 11:14
da cater58
Allego la tabella di riferimento
essendo comunque una impostazione per la quale non dovrebbero esserci differenze per te, mi sono permesso di arrivare fino a 200, poi fammi sapere..
Grazie mille per tutto cio che farai
Gianni

Re: trova e sostituisci

Inviato: sabato 5 maggio 2018, 11:37
da cater58
SCUSA ERA ODT NON ODS
allego ods

Re: trova e sostituisci

Inviato: sabato 5 maggio 2018, 16:14
da patel
prova questa macro da inserire nel file dei codici, vedi immagine allegata, come puoi vedere prima carica il file csv e poi lo modifica

Codice: Seleziona tutto

Sub perdiskaos
doc=thiscomponent
Sh1 = Doc.Sheets(0)
Fname = "F:\Download\tutto.csv" ' percorso da modificare
UrlDelFile = ConvertToURL(Fname)
DocCsv = StarDesktop.loadComponentFromURL(UrlDelFile, "_blank", 0, Array())
Sh2 = DocCsv.Sheets(0)
REM ----- Rimozione delle colonne che inizialmente non servono -----
Sh2.Columns.removeByIndex(0,1)
Sh2.Columns.removeByIndex(5,2)
Sh2.Columns.removeByIndex(6,1)
Sh2.Columns.removeByIndex(9,6)
Rem ----- Avvio  variazione dei codici  -----
Dim  sostituisci As Object
sostituisci = Sh2.createReplaceDescriptor()
for r = 0 to 198
  sorig = Sh1.GetCellByPosition(0,r).String
  sfin = Sh1.GetCellByPosition(1,r).String  
  sostituisci.SearchString = sorig
  sostituisci.ReplaceString = sfin
  Sh2.ReplaceAll(sostituisci)
next
End sub

Re: trova e sostituisci

Inviato: sabato 5 maggio 2018, 17:16
da cater58
non mi è chiaro a quali file si riferiscono questi url scusa ...

fname = ad esempio c:tutto.csv , ok

le altre due righe a che file si riferiscono e di preciso cosa dovrei cambiare?

Codice: Seleziona tutto


Fname = "F:\Download\tutto.csv" ' percorso da modificare
UrlDelFile = ConvertToURL(Fname)
DocCsv = StarDesktop.loadComponentFromURL(UrlDelFile, "_blank", 0, Array())


Re: trova e sostituisci

Inviato: sabato 5 maggio 2018, 17:50
da cater58

Codice: Seleziona tutto


Sub perdiskaos

doc=thiscomponent
Sh1 = Doc.Sheets(0)
Fname ="C:\Users\pc\Desktop\tutto.csv" ' percorso da modificare
UrlDelFile = ConvertToURL(Fname)
DocCsv = StarDesktop.loadComponentFromURL(UrlDelFile, "_blank", 0, Array())
Sh2 = DocCsv.Sheets(0)

REM ----- Rimozione delle colonne che inizialmente non servono -----
Sh2.Columns.removeByIndex(0,1)
Sh2.Columns.removeByIndex(5,2)
Sh2.Columns.removeByIndex(6,1)
Sh2.Columns.removeByIndex(9,6)

Rem ----- Avvio  variazione dei codici  -----
Dim  sostituisci As Object
sostituisci = Sh2.createReplaceDescriptor()
for r = 0 to 198
  sorig = Sh1.GetCellByPosition(0,r).String
  sfin = Sh1.GetCellByPosition(1,r).String  
  sostituisci.SearchString = sorig
  sostituisci.ReplaceString = sfin
  Sh2.ReplaceAll(sostituisci)
next

End sub

mi si ferma qui
Sh2.Columns.removeByIndex(0,1)
dicendo errore runtime basic

Re: trova e sostituisci

Inviato: sabato 5 maggio 2018, 18:08
da cater58
è perche lo apre in sola lettura, quindi appena cerchi di cancellare la prima colonna si ferma

Re: trova e sostituisci

Inviato: sabato 5 maggio 2018, 19:08
da patel
non so risponderti, a me funziona col file che hai allegato, magari il tuo è protetto oppure già aperto da altra applicazione, tu devi aprire soltanto il file con i codici, non anche il csv prima di lanciare la macro.

Re: trova e sostituisci

Inviato: domenica 6 maggio 2018, 2:50
da cater58
?? e come si fa? :-)

Re: trova e sostituisci

Inviato: domenica 6 maggio 2018, 8:03
da patel
descrivi una per una le operazioni che fai

Re: trova e sostituisci

Inviato: domenica 6 maggio 2018, 18:10
da cater58
1) apri il file che ti ho allegato
2) lo apro come calc con divisore dei campi virgola
3) strumenti - macro - organizza macro - Openoffice basic
4) standard - module 2 - perdiskaos - esegui

da
Errore di runtime basic
Si è verificata una eccezione
Type:com.sun.star.uno.Runtimexception
Message:.

alla riga

Sh2.Columns.removeByIndex(0,1)

Re: trova e sostituisci

Inviato: lunedì 7 maggio 2018, 8:46
da patel
le operazioni da fare sono
1) assolutamente NON aprire il file csv
2) aprire il file con i codici (la macro deve essere inserita come già descritto e salvata)
3) lanciare la macro

come già detto ci pensa la macro ad aprire il file csv, se lo apri tu manualmente nasce l'errore.

Re: trova e sostituisci

Inviato: lunedì 7 maggio 2018, 10:13
da cater58
aaah ecccoooo

questa macro parte dal file con i codici non dal file tutto.csv - ci potevo anche pensare ma mi ero ormai fissato sul file csv.

grazieeeeee sei gentilissimo!!

gianni