Pagina 1 di 1
[Risolto]Esportare range in file csv
Inviato: venerdì 8 marzo 2024, 8:38
da ferro0099
Buon di , navigando per cercare un modo per esportare in csv, mi sono imbattuto in una macro di "Patel" che potebbe fare al mio caso ma mi dà sempre un errore in:
"oRange = oSheet.getCellRangeByName(srange)"
Allego semplice file
la macro utilizzata è questa:
Codice: Seleziona tutto
Sub CreateCSVFile
oSheet = ThisComponent.getCurrentController.ActiveSheet
srange = oSheet.getCellRangeByName("D5").String
oRange = oSheet.getCellRangeByName(srange)
CellContentArray = oRange.getDataArray()
sFileName = "C:\Users\Ferro\Desktop\prova.csv" '<<<<<<<<<<<<<<<< modificare
n = FreeFile()
Open ConvertToUrl(sFileName) For Output As #n
For i = 0 To UBound(CellContentArray)
For j = 0 To UBound(CellContentArray(i))
print #n, str(CellContentArray(i)(j)) +";";
next
print #n
Next
Close #n
End Sub
Re: Esportare range in file csv
Inviato: venerdì 8 marzo 2024, 15:24
da patel
Che senso ha esportare una sola cella ? non capisco.
Re: Esportare range in file csv
Inviato: venerdì 8 marzo 2024, 15:29
da ferro0099
Scusami ... ma in D5 ho scritto =B5&":"&B7 ...nel senso che volevo esportare la cella B5 (carlo) e B7 (matteo) ...cioè celle non contigue
Re: Esportare range in file csv
Inviato: venerdì 8 marzo 2024, 16:35
da patel
Prova così
Codice: Seleziona tutto
Sub CreateCSVFile
oSheet = ThisComponent.getCurrentController.ActiveSheet
srange = "B5:B7"
oRange = oSheet.getCellRangeByName(srange)
CellContentArray = oRange.getDataArray()
sFileName = "C:\Users\Ferro\Desktop\prova.csv" '<<<<<<<<<<<<<<<< modificare
n = FreeFile()
Open ConvertToUrl(sFileName) For Output As #n
For i = 0 To UBound(CellContentArray)
For j = 0 To UBound(CellContentArray(i))
if j = UBound(CellContentArray(i)) then
print #n, str(CellContentArray(i)(j))
Else
print #n, str(CellContentArray(i)(j)) +";";
End If
next
Next
Close #n
End Sub
Re: Esportare range in file csv
Inviato: venerdì 8 marzo 2024, 17:00
da ferro0099
Grazie , si funziona ...... ma solo con 2 celle se aggingo un altra cella esempio "B5:B7:C9" mi dà errore
Re: Esportare range in file csv
Inviato: venerdì 8 marzo 2024, 17:50
da patel
Ma a cosa ti serve ? non capisco, comunque funziona soltanto con un range tipo B5:C9, altrimenti prova questa che esporta tutto il contenuto del foglio
Codice: Seleziona tutto
sub Main
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///C:/Download/prova.csv"
args1(1).Name = "FilterName"
args1(1).Value = "Text - txt - csv (StarCalc)"
args1(2).Name = "FilterOptions"
args1(2).Value = "44,34,ANSI,1,,0,false,true,true"
dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
end sub
Re: Esportare range in file csv
Inviato: venerdì 8 marzo 2024, 18:02
da ferro0099
Grazie... mi serve solo per esportare determinate celle in un file csv, per poi andarle a importare in un file csv di magazzino che riesco a gestirmi con il cellulare, non c'è modo di poter esportare più di sole 2 celle e non tutto il foglio?
Se fossimo stati amici ti avrei chiamato al cellulare
...quà è molto lunga da spiegare
Grazie comunque del tuo impegno
Re: Esportare range in file csv
Inviato: venerdì 8 marzo 2024, 19:43
da ferro0099
Scusami ancora ...tenendo tutto il foglio in csv se non volgio che venga sovrascritto ma salvato con un nome con riferimento alla dicitura di una cella?
Re: Esportare range in file csv
Inviato: sabato 9 marzo 2024, 12:24
da patel
ferro0099 ha scritto: ↑venerdì 8 marzo 2024, 18:02
non c'è modo di poter esportare più di sole 2 celle e non tutto il foglio?
Un range non è fatto soltanto da 2 celle, ma da tutte le celle comprese tra le due indicate nel range, quindi quando scrivo B5:C9 sono comprese tutte le celle tra i 2 estremi.
Allega un esempio realistico di quello che ti serve ed anche il risultato desiderato, probabilmente a te non serve la struttura del csv. ma basta un elenco del contenuto delle celle.
Re: Esportare range in file csv
Inviato: martedì 12 marzo 2024, 17:05
da ferro0099
patel ha scritto: ↑venerdì 8 marzo 2024, 17:50
Ma a cosa ti serve ? non capisco, comunque funziona soltanto con un range tipo B5:C9, altrimenti prova questa che esporta tutto il contenuto del foglio
Codice: Seleziona tutto
sub Main
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(2) as new com.sun.star.beans.PropertyValue
args1(0).Name = "URL"
args1(0).Value = "file:///C:/Download/prova.csv"
args1(1).Name = "FilterName"
args1(1).Value = "Text - txt - csv (StarCalc)"
args1(2).Name = "FilterOptions"
args1(2).Value = "44,34,ANSI,1,,0,false,true,true"
dispatcher.executeDispatch(document, ".uno:SaveAs", "", 0, args1())
end sub
Ciao Patel , eccomi .... allora ti allego il file di lavoro chiedendoti i vari punti che dovrei riuscire a correggere
1 - Ho inserito nelgli eventi del foglio "SchedaCliente" negli eventi foglio una macro "InsData"che mi inserisca la data corrente nella cella "M2" ma dovrebbe cambiare solo quando modifico esclusivamente la Cella "E4"
2 -Ho cambiato il tuo codice "
args1(2).Value = "44,34,ANSI,1,,0,false,true,true" " in " args1(2).Value = "59/4" " per evitare tutte le virgole , ma mi servirebbe che mi venga esportato come indico sotto :
Cliente : ;Gialli
Prodotto : ;Toner Giallo1
Codice : ;2224
Ricetta : ;15
; peso - (Kg); Peso + (Kg);nr prodotti; Totale pesi (Kg)
Toner Nero: ;0.00;00.00;0;0.00
Toner Magenta: ;00.00;00.00;0;0.00
Toner Ciano: ;0.00;0.00;0;0.00
Toner Giallo : ;0.00;0.00;0;0.00
TOT;;;0;0.00
3 - Quando Salva dovrebbe non sovrascrivere ma salvare Prendendo come riferimento la cella "Cliente (E4) + il Codice (la Cella E8)
Grazie
Re: Esportare range in file csv
Inviato: mercoledì 13 marzo 2024, 20:38
da patel
Non so aiutarti, chiedi all'amministratore Charlie di spostare la discussione nella sezione Macro e UNO API, che è frequentata da esperti
Re: Esportare range in file csv
Inviato: giovedì 14 marzo 2024, 8:10
da ferro0099
Grazie comunque , c'è un modo ben preciso di chiedere di spostare la discussione ?
Re: Esportare range in file csv
Inviato: giovedì 14 marzo 2024, 11:08
da patel
L'ho fatto io cliccando sul punto esclamativo
Re: Esportare range in file csv
Inviato: giovedì 14 marzo 2024, 11:20
da ferro0099
patel ha scritto: ↑giovedì 14 marzo 2024, 11:08
L'ho fatto io cliccando sul punto esclamativo
Re: Esportare range in file csv
Inviato: giovedì 14 marzo 2024, 14:34
da charlie
Argomento spostato.
Re: Esportare range in file csv
Inviato: giovedì 14 marzo 2024, 21:37
da Gaetanopr
ferro0099 ha scritto: ↑venerdì 8 marzo 2024, 17:00
Grazie , si funziona ...... ma solo con 2 celle se aggingo un altra cella esempio "B5:B7:C9" mi dà errore
Ti basta inserire tutti i range in un array e le celle non contigue che devono essere esportate sulla stessa riga del csv le indichi all' interno di un altro array nidificato come nell'esempio.
Codice: Seleziona tutto
Sub CreateCSVFile
oSheet = ThisComponent.getCurrentController.ActiveSheet
srange = Array("C4:E4", "C6:E6", "C8:E8", "C10:E10", Array("F14", "I14", "L14", "O14"), Array("C16","I16", "L16", "O16" ), Array("C18","I18", "L18", "O18" ), Array("C20","I20", "L20", "O20" ), Array("C22","I22", "L22", "O22"), Array("C24","L24", "O24" ) )
sFileName = tuo indirizzo" '<<<<<<<<<<<<<<<< modificare
n = FreeFile()
Open ConvertToUrl(sFileName) For Output As #n
For x = 0 To ubound(srange)
if IsArray(srange(x)) = False Then
oRange = oSheet.getCellRangeByName(srange(x))
CellContentArray = oRange.getDataArray()
For i = 0 To UBound(CellContentArray)
For j = 0 To UBound(CellContentArray(i))
if j = UBound(CellContentArray(i)) then
print #n, str(CellContentArray(i)(j))
Else
print #n, str(CellContentArray(i)(j)) +";";
End If
next
Next
else
For arr = 0 To Ubound(srange(x))
oRange = oSheet.getCellRangeByName(srange(x)(arr))
CellContentArray = oRange.getDataArray()
For i = 0 To UBound(CellContentArray)
For j = 0 To UBound(CellContentArray(i))
if arr = UBound(srange(x)) then
print #n, str(CellContentArray(i)(j))
Else
print #n, str(CellContentArray(i)(j)) +";";
End If
next
Next
Next arr
end if
next x
Close #n
End Sub
Re: Esportare range in file csv
Inviato: lunedì 18 marzo 2024, 7:55
da ferro0099
Grazie Gaetanopr , perfetto!!
Però mi salva sempre giustamente sovrascivendo il file , se voleesi dare il nome al file prendendo in riferimento una cella ? è possibile?
Re: Esportare range in file csv
Inviato: lunedì 18 marzo 2024, 9:17
da Gaetanopr
Supponendo che l'indirizzo si trovi scritto in A1
Re: Esportare range in file csv
Inviato: lunedì 18 marzo 2024, 14:14
da ferro0099
Gaetanopr ha scritto: ↑lunedì 18 marzo 2024, 9:17
Supponendo che l'indirizzo si trovi scritto in A1
Che dire ?!?! .... perfetto
Ultima questione :
1 - Ho inserito nelgli eventi del foglio "SchedaCliente" negli eventi foglio una macro "InsData"che mi inserisca la data corrente nella cella "M2" ma dovrebbe cambiare solo quando modifico esclusivamente la Cella "E4" e invece mi aggiorna la data al cambiamento di qualsiasi altra cella
Re: Esportare range in file csv
Inviato: lunedì 18 marzo 2024, 15:07
da Gaetanopr
ferro0099 ha scritto: ↑lunedì 18 marzo 2024, 14:14
1 - Ho inserito nelgli eventi del foglio "SchedaCliente" negli eventi foglio una macro "InsData"che mi inserisca la data corrente nella cella "M2" ma dovrebbe cambiare solo quando modifico esclusivamente la Cella "E4" e invece mi aggiorna la data al cambiamento di qualsiasi altra cella
Cambia la tua macro con questa
Codice: Seleziona tutto
Sub InsData(Target)
If NOT Target.supportsService("com.sun.star.sheet.SheetCell") then exit sub
Sh = Target.getSpreadsheet()
addr = Target.getCellAddress()
rng = sh.getCellRangeByName("E4")
range2 = rng.queryintersection(Target.rangeaddress())
If range2.RangeAddressesAsString = "" Then
Exit Sub
Else
Sh.GetCellrangeByName("M2").Value = Now()
End if
End Sub
Re: Esportare range in file csv
Inviato: lunedì 18 marzo 2024, 15:15
da ferro0099
Gaetanopr ha scritto: ↑lunedì 18 marzo 2024, 15:07
ferro0099 ha scritto: ↑lunedì 18 marzo 2024, 14:14
1 - Ho inserito nelgli eventi del foglio "SchedaCliente" negli eventi foglio una macro "InsData"che mi inserisca la data corrente nella cella "M2" ma dovrebbe cambiare solo quando modifico esclusivamente la Cella "E4" e invece mi aggiorna la data al cambiamento di qualsiasi altra cella
Cambia la tua macro con questa
Codice: Seleziona tutto
Sub InsData(Target)
If NOT Target.supportsService("com.sun.star.sheet.SheetCell") then exit sub
Sh = Target.getSpreadsheet()
addr = Target.getCellAddress()
rng = sh.getCellRangeByName("E4")
range2 = rng.queryintersection(Target.rangeaddress())
If range2.RangeAddressesAsString = "" Then
Exit Sub
Else
Sh.GetCellrangeByName("M2").Value = Now()
End if
End Sub
Sono al PC .... provato il tutto , che dire ...Eccellente!!!!
Re: Esportare range in file csv
Inviato: venerdì 22 marzo 2024, 9:56
da ferro0099
Buon dì "Gaetanopr" .... ho modificato come da te suggerito e ti conferma che funziona tutto ... provandolo mi è venuta l'esigenza di salvare anche le celle "L2:M2" che identificano la data e l'ora di creazione della richiesta.
Quando salvo , mi indica la data come segnato sotto :
Cliente;;Bianchi
Data; 45373.4059837963
Prodotto;;Toner Giallo 1
CODICE;; 5555
Ricetta;; 15
Totale;Peso;NR PRODOTTI;PESO TOTALE (Kg)
Toner Nero;;;
Toner Magenta;;;
Toner Ciano;;;
Toner Viola;;;
TOTALE;;
Vorrei se fosse possibile che sia scritto : GG/MM/AAAA HH:MM
Re: Esportare range in file csv
Inviato: venerdì 22 marzo 2024, 11:12
da Gaetanopr
Nel file allegato non ci sono le macro da me proposte, in particolare la InsData(Target) ti basterebbe cambiare la parte finale
con
In questo modo avresti una data testuale.
Re: Esportare range in file csv
Inviato: venerdì 22 marzo 2024, 13:07
da ferro0099
Gaetanopr ha scritto: ↑venerdì 22 marzo 2024, 11:12
Nel file allegato non ci sono le macro da me proposte, in particolare la InsData(Target) ti basterebbe cambiare la parte finale
con
In questo modo avresti una data testuale.
Scusami ho inserito il vecchio file ti allego quello da te modificato e funzionante, ho modificato in InsData(Target)
e nella macro CreateCSVfile ho inserito srange = Array("C4:E4",
"L2:M2" ......ma non m cambia niente quando esporto il file il csv è sempre
Cliente;;Gialli
DATA;
45363.7040625
Prodotto;;Toner Giallo 1
CODICE;; 2224
Ricetta;; 15
;Totale;Peso;NR PRODOTTI;PESO TOTALE (Kg)
;;;;
;;;;
;;;;
;;;;
TOTALE;;;;
Re: Esportare range in file csv
Inviato: venerdì 22 marzo 2024, 13:19
da Gaetanopr
Devi effettuare almeno una modifica, avrai il file con la data inserita come valore e non come testo, prova a cambiare cliente ed esegui l'esportazione
Re: Esportare range in file csv
Inviato: venerdì 22 marzo 2024, 13:23
da ferro0099