Condividi:        

Selezionare ultime n celle di serie dati

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Selezionare ultime n celle di serie dati

Postdi pippovba » 09/01/10 00:33

Ecco un altro problema che sicuramente sarà facile per voi ma proprio non riesco a farlo.
Ho una serie di circa 6000 dati che ogni volta può cambiare in base alla importazione che viene fatta, la prima cella è la A1 poi A2 poi A3, ecc. ecc. volevo poter selezionare gli ultimi 2000 dati e copiarli in un'altro file .xls
E' tanto complicato da fare?
pippovba
Utente Junior
 
Post: 18
Iscritto il: 08/01/10 16:52

Sponsor
 

Re: Selezionare ultime n celle di serie dati

Postdi Anthony47 » 09/01/10 00:49

Ad esempio:
Codice: Seleziona tutto
PrR = Cells(Rows.Count, 1).End(xlUp).Row - 2000
If PrR < 1 Then PrR = 1
Range(Cells(PrR, 1), Cells(Rows.Count, 1).End(xlUp)).Copy _
  Destination:=Workbook("Il tuo File").Sheets("IlTuoFoglio").Range("A1")

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selezionare ultime n celle di serie dati

Postdi pippovba » 10/01/10 09:49

Ho inserito la rige nella Sub ma credo che ci sia qualcosa di sbagliato perchè mi ha errore nella compilazione.

Volevo chiedere se era possibile fare 2 cose:
1)Potete controllarmi il codice e vedere se si puo' migliorare qualcosa?

Public Sub cardati()
Workbooks.Open Filename:= _
"C:\csv\prova.csv"
PrR = Cells(Rows.Count, 1).End(xlUp).Row - 2000
If PrR < 1 Then PrR = 1
Range(Cells(PrR, 1), Cells(Rows.Count, 1).End(xlUp)).Copy _
ActiveSheet.Name = "prova_dati"
Destination:=.Sheets("a").Range("A1")
Workbooks(prova.csv).Close SaveChanges:=False
Workbooks.Save
End Sub


Praticamente devo prelevare gli ultimi 2000 dati in un file cvs e copiarli nella cartella corrente.

2) Volendo prelevare solo alcune parti del contenuto delle celle?
Mi spiego il file cvs si presenta così:

2009.11.05,21:45,5481.0,5491.0,5477.0,5489.5,194

vorrei copiare solo una parte della stringa e cioè dalla 18 cifra per 6 cifre cioè il numero 5481.0
è possibile farlo? Grazie in anticipo Anthony47
pippovba
Utente Junior
 
Post: 18
Iscritto il: 08/01/10 16:52

Re: Selezionare ultime n celle di serie dati

Postdi Flash30005 » 10/01/10 10:32

Se i campi sono formattati nella stessa maniera puoi usare il MId
Codice: Seleziona tutto
valore = Mid(Stringa,18,6)

Altrimenti devi contare le virgole e prelevare il campo contenuto tra la seconda e la terza con un codice tipo
Codice: Seleziona tutto
Public virg As Integer
Sub cercaCampo()
For virg = 1 To Len(Stringa)
    If Mid(Stringa, virg, 1) = "," Then
        ContaV = ContaV + 1
        If ContaV = 2 Then
            Call Prelevacampo
            GoTo esci
        End If
    End If
Next virg
esci:
End Sub
Sub Prelevacampo()
Campo = ""
For virg2 = virg + 1 To Len(Stringa)
    If Mid(Stringa, virg2, 1) = "," Then GoTo esci2
    Campo = Campo + Mid(Stringa, virg2, 1)
Next virg2
esci2:
MsgBox Campo
End Sub


Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Selezionare ultime n celle di serie dati

Postdi Anthony47 » 10/01/10 13:41

Errato Destination:=Workbook("Il tuo File").etc etc,
Corretto:
Codice: Seleziona tutto
Destination:=Workbooks("Il tuo File").Sheets("IlTuoFoglio").Range("A1")

(durante l' editing del nome del workbook ho cancellato una S di troppo!)

1)Potete controllarmi il codice e vedere se si puo' migliorare qualcosa?
Se funziona e' perfetto...

2) Volendo prelevare solo alcune parti del contenuto delle celle?
Mi spiego il file cvs si presenta così:

2009.11.05,21:45,5481.0,5491.0,5477.0,5489.5,194
vorrei copiare solo una parte della stringa e cioè dalla 18 cifra per 6 cifre cioè il numero 5481.0
Trattandosi di un file ".csv" (csv, vero?) tu vuoi quindi importare il 3° campo solamente.
La macro di Flash credo che faccia il lavoro, ma ti lascia l' eventuale problema del separatore decimale, nel caso che il tuo separatore decimae sia la "virgola" e non il "punto" (perche' 5481.0 vuoi che venga importato come numero, vero?).
Quindi in alternativa puoi fare l' importazione selettiva del file:
-Menu /Dati /Importa dati esterni /Importa dati
-selezioni csv come Tipo file, poi selezioni il file che devi importare.
-nel wizard di Importazione guidata, scegli Delimitati, Avanti
-come Delimitatore spunti Virgola, Avanti
-selezioni la prima colonna (quella che contiene la data) e spunti "Non importare colonna"
-ripeti per tutte le altre colonne che non vuoi importare
-quando sei rimasto col la sola colonna da importare, premi Avanzate, e scegli come Separatore decimale il "punto"; togli la scelta "punto" quale Separatore delle migliaia.
-Ok, Fine, scegli in quale cella vuoi importare, Ok

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selezionare ultime n celle di serie dati

Postdi pippovba » 10/01/10 14:27

Ho fatto alcune modifiche ma ho sempre lo stesso errore:

dice errore di compilazione ed evidenza la riga con Destination:=Workbook...ecc ecc

Public Sub cardati()
Workbooks.Open Filename:= _
"C:\csv\prova.csv"
Windows("prova.csv").Activate
PrR = Cells(Rows.Count, 1).End(xlUp).Row - 2000
If PrR < 1 Then PrR = 1
Range(Cells(PrR, 1), Cells(Rows.Count, 1).End(xlUp)).Copy _
Windows("prova_dati.xls").Activate
Destination:=Workbook("prova_dati.xls").Sheets("a").Range("A1") >>>>>> ERRORE SU QUESTA RIGA
Workbooks(prova.csv).Close SaveChanges:=False
Workbooks.Save
End Sub


Attualmente per importare i dati dal file csv utilizzo un meccanismo abbastanza complicato e occorrono almeno 5 macro e non sempre funzionano bene, è un meccanismo complicato e volevo creare 1 sola macro che importi i dati! E' 3 giorni che sto diventando matto!
pippovba
Utente Junior
 
Post: 18
Iscritto il: 08/01/10 16:52

Re: Selezionare ultime n celle di serie dati

Postdi pippovba » 10/01/10 14:31

Sto' provando a inserire la funzione

valore = Mid(Stringa,18,6)

all'interno della Sub ma non riesco a fare nianche questo!
pippovba
Utente Junior
 
Post: 18
Iscritto il: 08/01/10 16:52

Re: Selezionare ultime n celle di serie dati

Postdi Flash30005 » 10/01/10 17:55

Fammi capire, tu hai un file prova.csv in C:\csv\ e vorresti prelevare tutti i campi di quel file compresi dal carattere 18 a 23 (6 caratteri a partire dal 18°) e li vorresti in un foglio di excel che chiamiamo foglio1.
Prova a inviare un file csv con alcuni dati e proverò a realizzare una macro che faccia quanto richiedi.

Fai sapere
Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Selezionare ultime n celle di serie dati

Postdi pippovba » 10/01/10 18:18

Questo è come si presenta il file csv:

2009.11.05,21:45,5481.0,5491.0,5477.0,5489.5,194
2009.11.06,08:00,5482.0,5492.5,5479.5,5491.5,133
2009.11.06,08:15,5491.0,5498.5,5491.0,5497.0,136
2009.11.06,08:30,5496.5,5498.5,5494.0,5495.5,76
.......
.......

dopo aver eseguito la macro risultato:

5481,0
5482,0
5491,0
5496,0
......
......

per un mumero di righe che varia ogni volta, pero' mi occorrono solo gli ultimi 2000 dati.
Quello che vorrei riuscire a fargli fare alla sub è:

- Aprire 1 solo files excel con la macro in questione che eseguendo la macro faccia:
1) Prelevare dal file csv che si trova in c:\csv senza aprirlo
2) preleva il numero compreso tra la 18 e 23 esima cifra.
3) cambia il punto (.) con la virgola(,)
4) copia il risultato a partire dalla cella A1

ho 15 file csv da esportare i dati e non 1 per questo che vorrei completare la macro!
pippovba
Utente Junior
 
Post: 18
Iscritto il: 08/01/10 16:52

Re: Selezionare ultime n celle di serie dati

Postdi Anthony47 » 10/01/10 18:52

Perdona, perche' non usi il codice che ti ho dato in questo messaggio viewtopic.php?f=26&t=84338&p=480072#p479869 con la correzione data in quest' altro viewtopic.php?f=26&t=84338&p=480072#p480067 :?: :!: :?:
Cioe'
Codice: Seleziona tutto
PrR = Cells(Rows.Count, 1).End(xlUp).Row - 2000
If PrR < 1 Then PrR = 1
Range(Cells(PrR, 1), Cells(Rows.Count, 1).End(xlUp)).Copy _
  Destination:=Workbooks("Il tuo File").Sheets("IlTuoFoglio").Range("A1")

Da quello che deduco dal tuo codice, "Il tuo File"="prova_dati.xls", "IlTuoFoglio"="a".

Questa lavora sulla colonna A.

L' istruzione Mid(Stringa,18,6) con la macro "cardati()" non c' entra.
Se vuoi importare solo la terza colonna del file csv hai due opzioni:
1) segui le istruzioni date qui viewtopic.php?f=26&t=84338&p=480072#p480067 per fare una "importazione selettiva" del file csv.
Siccome ti serve il codice vba, devi avviare il registratore di una macro (Menu /Strumenti /Macro /Registra nuova macro), esegui le operazioni descritte fino alla completa importazione della colonna dati, fermi il registratore (Menu /Strumenti /Macro /Interrompi registrazione); poi posti il codice prodotto dalla registrazione e ti spiegheremo come modificarlo per renderlo generico o per inserirlo in un loop.

2) seguendo la falsariga della macro cardati() (corretta con le istruzioni che ti ho ripetuto prima), apri tutto il file csv (come gia' hai fatto nella macro cardati), e poi invece di lavorare sulla colonna A lavori sulla colonna C; in questo caso le istruzioni da inserire nella macro cardati diventano:
Codice: Seleziona tutto
PrR = Cells(Rows.Count, 3).End(xlUp).Row - 2000
If PrR < 1 Then PrR = 1
Range(Cells(PrR, 3), Cells(Rows.Count, 3).End(xlUp)).Copy _
  Destination:=Workbooks("Il tuo File").Sheets("IlTuoFoglio").Range("A1")
Vale ancora l' ipotesi "Il tuo File"="prova_dati.xls", "IlTuoFoglio"="a".

Questa opzione la reputo meno attraente perche' non risolve subito il problema del separatore decimale; quindi il mio suggerimento e' di procedere con l' ipotesi 1.

Quindi riepilogando:
-fai l' importazione selettiva del file csv su colonna A di un foglio di servizio del tuo file, e registri una macro mentre fai l' operazione; posti il codice prodotto
-spiega se ti interessa personalizzare il codice per lavorare su un file che scegli volta per volta, o su un elenco di file contenuto in un' area del tuo foglio di lavoro.
-per copiare le ultime 2000 righe di col A usa le istruzioni
Codice: Seleziona tutto
PrR = Cells(Rows.Count, 1).End(xlUp).Row - 2000
If PrR < 1 Then PrR = 1
Range(Cells(PrR, 1), Cells(Rows.Count, 1).End(xlUp)).Copy _
  Destination:=Workbooks("Il tuo File").Sheets("IlTuoFoglio").Range("A1")


Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selezionare ultime n celle di serie dati

Postdi Flash30005 » 10/01/10 19:06

prova questa macro
copia e incolla in un modulo
Codice: Seleziona tutto
Public virg As Integer, riga, campo As String
Sub cercaCampo()
Open "C:\csv\prova.csv" For Input As #1
Do Until EOF(1)
contaV = 0
     Line Input #1, riga
     MsgBox riga
For virg = 1 To Len(riga)
    If Mid(riga, virg, 1) = "," Then
        contaV = contaV + 1
        If contaV = 2 Then
            Call Prelevacampo
            InsR = Range("A1").CurrentRegion.Rows.Count + 1
            Range("A" & InsR).Value = Replace(campo, ".", ",")
            GoTo esci
        End If
    End If
Next virg
esci:
Loop

Close #1
End Sub
Sub Prelevacampo()
campo = ""
For virg2 = virg + 1 To Len(riga)
    If Mid(riga, virg2, 1) = "," Then GoTo esci2
    campo = campo + Mid(riga, virg2, 1)
Next virg2
esci2:
MsgBox campo
End Sub


Avvia "cercaCampo"
il file.csv deve chiamarsi prova.csv ed essere posizionato nella directory C:\csv\
altrimenti adatta la macro al nome e al percorso del file

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Selezionare ultime n celle di serie dati

Postdi pippovba » 11/01/10 14:59

Sono riuscito a far funzionare la sub, ho apportato qualche piccola modifica e ora funziona, Vi ringrazio tutti per la collaborazione, pero' ho ancora un piccolo problema!
La sub funziona e mi importa i dati, pero' dopo aver importato i dati mi compare un quadratino verde, il numero resta scritto sulla parte sx della cella e mi dice che il numero non è considerato come numero ma come testo e bisogna convertirlo in numero.
Ho provato a registrare una macro che converte "il numero" in numero ma senza risultati.
Non so' se mi sono spiegato bene!?
Grazie
pippovba
Utente Junior
 
Post: 18
Iscritto il: 08/01/10 16:52

Re: Selezionare ultime n celle di serie dati

Postdi Flash30005 » 11/01/10 17:00

Ok sostituisci 2 righe nella macro con queste
Codice: Seleziona tutto
            InsR = Range("A1").CurrentRegion.Rows.Count + 1 '<<<< esistente
            campo = Replace(campo, ".", ",")        '<<<<sostituire con questa
            Range("A" & InsR).Value = Val(campo)        '<<<<sostituire con questa
            GoTo esci     '<<<< esistente

e alla fine
Codice: Seleziona tutto
esci:     '<<<< esistente
Loop     '<<<< esistente
Columns("A:A").NumberFormat = "0.0"           '<<<< Inserire questa
Close #1       '<<<< esistente
End Sub     '<<<< esistente


Fai sapere
Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Selezionare ultime n celle di serie dati

Postdi pippovba » 12/01/10 00:23

Vi ringrazio per la vostra grossa collaborazione, ho sperato che funzionasse ma ho un'altro errore!
La correzzione che mi hai proposto nel post precedente funziona e vengono copiati i numeri in formato numero. ok

Pero'.... quando cambio il file csv con i dati da importare mi compare un messaggio di errore dice solo ERRORE 400 oppure mi importa i dati pero' non sono corretti sembrano approssimati alla stessa cifra (per esempio con un file csv mi importa tutta la serie uguale a 1,0 oppure a 129,0)
E poi non riesco a capire dove specificare la posizione del numero da importare.
Questo è il file csv dove la macro funziona:

2009.11.05,21:45,5481.0,5491.0,5477.0,5489.5,194 >>>> il numero da prelevare è 5481,0
2009.11.06,08:00,5482.0,5492.5,5479.5,5491.5,133
2009.11.06,08:15,5491.0,5498.5,5491.0,5497.0,136
2009.11.06,08:30,5496.5,5498.5,5494.0,5495.5,76
.....
.....

Questo è un altro file csv ma con dati differenti:

2009.10.30,15:15,1.6519,1.6519,1.6486,1.6507,654 >>>>il numero da prelevare è 1,6519
2009.10.30,15:30,1.6506,1.6521,1.6500,1.6520,458
2009.10.30,15:30,1.6506,1.6521,1.6500,1.6520,458
.....
.....

Altro file csv:

2009.03.05,04:45,125.16,125.22,125.10,125.12,160 >>>>il numero da prelevare è 125,16
2009.03.05,04:45,125.16,125.22,125.10,125.12,160
....
....


Praticamente ho circa 15 file csv dove devo prelevare la prima cifra utile dopo la data e l'ora.
Io credevo che bastava copiare la formula in un nuovo file xls cambiando la posizione delle cifre da prelevare invece non funziona proprio così!
Mi spiegate? Grazie
pippovba
Utente Junior
 
Post: 18
Iscritto il: 08/01/10 16:52

Re: Selezionare ultime n celle di serie dati

Postdi Flash30005 » 12/01/10 09:25

Ok adesso la macro dovrebbe fare quanto desideri
(quando ti dicevo di inviare uno stralcio del tuo file .csv
Flash30005 ha scritto:..Prova a inviare un file csv con alcuni dati e proverò a realizzare una macro...
non era una richiesta a caso e senza un motivo...) :aaah

il problema è che tu non vuoi un testo ma numero e i numeri vanno formattati o come generici o con decimali fissi, quindi avrai
Codice: Seleziona tutto
1,6506
1,6506
125,16
125,16
5481
5482

(e non 5481,0) perché il numero generico non prevede lo 0 dopo la virgola oppure obblighi ad una formattazione con decimali fissi da 1 a 5 e oltre (n zeri dopo la virgola) e in quel caso avresti
Codice: Seleziona tutto
5481,0000
5482,0000
5491,0000
5496,5000
1,6519
1,6506
1,6506
125,1600
125,1600

quindi sta a te decidere
Codice: Seleziona tutto
Public virg As Integer, riga, campo As String
Sub cercaCampo()
Open "C:\csv\prova.csv" For Input As #1
Do Until EOF(1)
contaV = 0
     Line Input #1, riga
     'MsgBox riga
For virg = 1 To Len(riga)
    If Mid(riga, virg, 1) = "," Then
        contaV = contaV + 1
        If contaV = 2 Then
            Call Prelevacampo
            InsR = Range("A1").CurrentRegion.Rows.Count + 1
            Range("A" & InsR).Value = Val(campo)
            GoTo esci
        End If
    End If
Next virg
esci:
Loop
Columns("A:A").NumberFormat = "0.0000"    '<<<<< decimali fissi - commenta questa e togli commento a quella succesiva
'Columns("A:A").NumberFormat = "General"   '<<<<<< se vuoi la quantità dei valori oltre la virgola variabili
Close #1
End Sub
Sub Prelevacampo()
campo = ""
For virg2 = virg + 1 To Len(riga)
    If Mid(riga, virg2, 1) = "," Then GoTo esci2
    campo = campo + Mid(riga, virg2, 1)
Next virg2
esci2:
End Sub


Fai sapere
Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Selezionare ultime n celle di serie dati

Postdi pippovba » 14/01/10 08:45

Ciao Flash ho fatto molti tentativi prima di riscriverti, ma non sono riuscito a risolvere il problema, praticamente la Sub importa i dati dal file csv ma pero' importa solo il numero prima del punto ( il . o la , sono intesi come separatore di decimali) e non tutto il numero ti faccio un esempio:

Se ho il file csv in questo modo:

2009.11.05,21:45,5481.0,5491.0,5477.0,5489.5,194 >> mi importa il numero 5481 invece di 5481,0

se il file csv è così:

2009.11.05,21:45,5481.5,5491.0,5477.0,5489.5,194 >> mi importa il numero 5481 e non il numero 5481,5

se il file è così:

2009.05.21,23:00,1.3890,1.3902,1.3889,1.3899,114 >> mi importa il numero 1, e non il numero 1,3890

praticamente tralascia di importare la cifra che sono dopo il . nel fil csv
pippovba
Utente Junior
 
Post: 18
Iscritto il: 08/01/10 16:52

Re: Selezionare ultime n celle di serie dati

Postdi Flash30005 » 14/01/10 08:58

Beh non credo proprio che sia così con l'ultima macro inviata
a questo punto è meglio "tagliare la testa al toro"
ti invio direttamente i due file .xls e .csv che metterai nella cartella C:\csv\
poi avvii pippo.xls e la macro "CercaCampo" contenuta nel file
download file

Fai sapere
Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-


Torna a Applicazioni Office Windows


Topic correlati a "Selezionare ultime n celle di serie dati":


Chi c’è in linea

Visitano il forum: Nessuno e 43 ospiti