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
:super:

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

Codice: Seleziona tutto

sFileName = oSheet.GetCellRangeByName("A1").String

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

Codice: Seleziona tutto

sFileName = oSheet.GetCellRangeByName("A1").String
Che dire ?!?! .... perfetto :bravo:

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 :ucrazy:

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 :ucrazy:
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 :ucrazy:
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

Codice: Seleziona tutto

Sh.GetCellrangeByName("M2").Value = Now()
con

Codice: Seleziona tutto

Sh.GetCellrangeByName("M2").String = Now()
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

Codice: Seleziona tutto

Sh.GetCellrangeByName("M2").Value = Now()
con

Codice: Seleziona tutto

Sh.GetCellrangeByName("M2").String = Now()
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)

Codice: Seleziona tutto

Sh.GetCellrangeByName("M2").String = Now()
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
Gaetanopr ha scritto: venerdì 22 marzo 2024, 13:19 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

:crazy: :super: :bravo: :knock: