Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Utilizzare campi in array variant dopo split

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

Utilizzare campi in array variant dopo split

Postdi karug64 » 27/02/15 23:10

Salve a tutti.

Nel tentativo di leggere un file csv sto scrivendo questo codice:

Codice: Seleziona tutto
Dim campi As Variant

Open mypath For Input As #1
Do While Not EOF(1)

    Line Input #1, rigacsv

    campi = Split(rigacsv, ";")

... ecc ecc


Ovviamente, dopo questa istruzione mi ritrovo nell'array campi() i vari valori della riga letta. Ma i campi sono delimitati dai doppi apici "1", "CANE", la qual cosa potrebbe andar bene per le stringhe, ma per i numeri, ovviamente no.
Volendo testare il valore di un campo che contiene "12" o assegnare il valore "1234,89" ad un campo ottengo errore.

Ho provato ad utilizzare

if Cint(campi(1)) ma l'errore è "Tipo non corrispondente".

Come posso fare ? Grazie
Office 2010
karug64
Utente Senior
 
Post: 580
Iscritto il: 20/11/11 21:22

Sponsor
 

Re: Utilizzare campi in array variant dopo split

Postdi Flash30005 » 27/02/15 23:44

Si, ma il precedente Topic
http://www.pc-facile.com/forum/viewtopic.php?f=26&t=104127
è chiuso oppure no?
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Utilizzare campi in array variant dopo split

Postdi karug64 » 27/02/15 23:47

Flash30005 ha scritto:sima il precedente Topic
http://www.pc-facile.com/forum/viewtopic.php?f=26&t=104127
è chiuso oppure no?


Ancora no, Flash. (E' mio uso chiudere sempre i post risolti permettendo cosi', sia a chi legge che a chi ha contribuito, di avere contezza della risoluzione del problema proposto).

Ci sto lavorando su, ma non mi sembra sia la soluzione giusta per il problema esposto ....
Sto cercando di inserire il tuo codice (per la compilazione) all'interno di un ciclo di lettura del file csv, ma come vedi mi sono arenato ....

Grazie
Office 2010
karug64
Utente Senior
 
Post: 580
Iscritto il: 20/11/11 21:22

Re: Utilizzare campi in array variant dopo split

Postdi Flash30005 » 27/02/15 23:50

La macro precedente funziona perfettamente con il file che hai inviato
se questa discussione è inerente allo stesso problema avresti dovuto continuare quel topic altrimenti, spezzettando così il problema, non si ha un quadro della situazione
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Utilizzare campi in array variant dopo split

Postdi karug64 » 28/02/15 00:00

Flash30005 ha scritto:La macro precedente funziona perfettamente con il file che hai inviato
se questa discussione è inerente allo stesso problema avresti dovuto continuare quel topic altrimenti, spezzettando così il problema, non si ha un quadro della situazione


Lo so che funziona perfettamente col file inviato.
Purtroppo non mi so spiegare ....
Ci riprovo.

Ho un foglio excel che "funge" da programma e da "contenitore" di una elaborazione.
Poi ho un file csv con oltre 140.000 righe.

Devo leggere questo file ed elaborarlo per come mi hai giustamente suggerito.

Il problema è che l'utilizzo del programma avverrà su un pc con excel 2003 e quindi, volendo aprire il file csv per importalo avrei il limite delle 65000 righe.

L'esempio postato era per fare vedere come doveva essere composta la tabella riassuntiva.
Considera che le righe a sinistra (quelle da cui aggreghi i risultati), che nell'esempio sono poche, dovrebbero essere 145.780 ....

Questo avevo cercato di spiegarlo nel post precedente

Il problema della lettura delle righe sta nel fatto che nel mio oc c'e' office 2010 ma il programma lavorerà su pc con office 2003. Quindi sul mio potrei lasciare l'apertura (open) del file query.xlsx, ma così facendo sul pc da lavoro il programma non funzionerebbe.
Necessito, quindi, di leggere il file di origine csv in maniera sequenziale estrapolandone i singoli campi.


Cosi' stavo cercando di :

leggere il file csv
in base a delle condizioni ridurne le righe (che generalmente scendono sotto le 7000)
creare la "parte sinistra"
e poi applicare il tuo codice

Spero di essermi spiegato.
Se hai ancora dubbi posso cercare di chiare ulteriormente.
grazie
Office 2010
karug64
Utente Senior
 
Post: 580
Iscritto il: 20/11/11 21:22

Re: Utilizzare campi in array variant dopo split

Postdi karug64 » 28/02/15 00:00

Flash30005 ha scritto:La macro precedente funziona perfettamente con il file che hai inviato
se questa discussione è inerente allo stesso problema avresti dovuto continuare quel topic altrimenti, spezzettando così il problema, non si ha un quadro della situazione


Lo so che funziona perfettamente col file inviato.
Purtroppo non mi so spiegare ....
Ci riprovo.

Ho un foglio excel che "funge" da programma e da "contenitore" di una elaborazione.
Poi ho un file csv con oltre 140.000 righe.

Devo leggere questo file ed elaborarlo per come mi hai giustamente suggerito.

Il problema è che l'utilizzo del programma avverrà su un pc con excel 2003 e quindi, volendo aprire il file csv per importalo avrei il limite delle 65000 righe.

L'esempio postato era per fare vedere come doveva essere composta la tabella riassuntiva.
Considera che le righe a sinistra (quelle da cui aggreghi i risultati), che nell'esempio sono poche, dovrebbero essere 145.780 ....

Questo avevo cercato di spiegarlo nel post precedente

Il problema della lettura delle righe sta nel fatto che nel mio oc c'e' office 2010 ma il programma lavorerà su pc con office 2003. Quindi sul mio potrei lasciare l'apertura (open) del file query.xlsx, ma così facendo sul pc da lavoro il programma non funzionerebbe.
Necessito, quindi, di leggere il file di origine csv in maniera sequenziale estrapolandone i singoli campi.


Cosi' stavo cercando di :

leggere il file csv
in base a delle condizioni ridurne le righe (che generalmente scendono sotto le 7000)
creare la "parte sinistra"
e poi applicare il tuo codice

Spero di essermi spiegato.
Se hai ancora dubbi posso cercare di chiare ulteriormente.
grazie
Office 2010
karug64
Utente Senior
 
Post: 580
Iscritto il: 20/11/11 21:22

Re: Utilizzare campi in array variant dopo split

Postdi Anthony47 » 28/02/15 00:02

Quella della lettura di riga e successivi split e' il metodo che avrei usato anche io per risolvere "l'altro" quesito.
Per eliminare le virgolette potresti provare con
Codice: Seleziona tutto
campi = Split(Replace(rigacsv, """", "", , , vbTextCompare), ";")

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Utilizzare campi in array variant dopo split

Postdi karug64 » 28/02/15 00:15

Anthony47 ha scritto:Quella della lettura di riga e successivi split e' il metodo che avrei usato anche io per risolvere "l'altro" quesito.
Per eliminare le virgolette potresti provare con
Codice: Seleziona tutto
campi = Split(Replace(rigacsv, """", "", , , vbTextCompare), ";")

Ciao


Ok grazie.
Risolto.
Non avrei mai e poi mai saputo arrivare a questa soluzione !!
Office 2010
karug64
Utente Senior
 
Post: 580
Iscritto il: 20/11/11 21:22

Re: Utilizzare campi in array variant dopo split

Postdi karug64 » 28/02/15 10:08

Continuo il post, per chiedere di risolvere questo problema di carattere logico.

Questo, in blocchi, il codice che ho scritto per risolvere il problema di questo trend

Codice: Seleziona tutto
Do While Not EOF(1)

    Line Input #1, rigacsv
   
    campi = Split(Replace(rigacsv, """", "", , , vbTextCompare), ";")
    r = r + 1
        If r = 1 Then
        ' controllo se il file è quello giusto leggendo la prima riga del file csv che ha l'intestazione
            If campi(0) <> "Filiale inseriment" Then
                ' NO OK file errato
                MsgBox "Hai selezionato il file ERRATO !!", vbCritical, "Errore"
                Sheets(1).Select
                Close #1
                Exit Sub
            Else
                GoTo fine_loop
            End If
        End If
       
        id_csv = campi(1)
        If id_rep = 0 Then id_rep = id_csv

        'id diversi, aggiorno il foglio report con i valori sommati     
        If id_rep <> id_csv Then
       
            riga_rep = riga_rep + 1
            sh_report.Cells(riga_rep, 1).Value = id_rep
            sh_report.Cells(riga_rep, 2).Value = tmp_set
            sh_report.Cells(riga_rep, 3).Value = tmp_des
            sh_report.Cells(riga_rep, 4).Value = tmp_att
            sh_report.Cells(riga_rep, 5).Value = tmp_cc
           
                    sh_report.Cells(riga_rep, 6).Value = n_1
                    sh_report.Cells(riga_rep, 7).Value = t_1
                    sh_report.Cells(riga_rep, 8).Value = n_2
                    sh_report.Cells(riga_rep, 9).Value = t_2
                    sh_report.Cells(riga_rep, 10).Value = n_3
                    sh_report.Cells(riga_rep, 11).Value = t_3
                    sh_report.Cells(riga_rep, 12).Value = n_4
                    sh_report.Cells(riga_rep, 13).Value = t_4
                    sh_report.Cells(riga_rep, 15).Value = n_5
                    sh_report.Cells(riga_rep, 16).Value = t_5
                    sh_report.Cells(riga_rep, 17).Value = n_6
                    sh_report.Cells(riga_rep, 18).Value = t_6
                    sh_report.Cells(riga_rep, 19).Value = n_7
                    sh_report.Cells(riga_rep, 20).Value = t_7
                    sh_report.Cells(riga_rep, 21).Value = n_8
                    sh_report.Cells(riga_rep, 22).Value = t_8
               
                   tmp_id = 0
                   tmp_set = 0
                   tmp_des = ""
           
                   n_1 = 0
                   n_2 = 0
                   n_3 = 0
                   n_4 = 0
                   n_5 = 0
                   n_6 = 0
                   n_7 = 0
                   n_8 = 0
           
                   t_1 = 0
                   t_2 = 0
                   t_3 = 0
                   t_4 = 0
                   t_5 = 0
                   t_6 = 0
                   t_7 = 0
                   t_8 = 0
               
                   id_rep = id_csv
       
        Else
       
            'calcolo
           
            tmp_id = campi(1)
            tmp_set = campi(2)
            tmp_des = campi(3)
       
            If Val(campi(9)) = 2 Or Val(campi(9)) = 11 Or Val(campi(9)) = 12 Or Val(campi(9)) = 15 Or Val(campi(9)) = 21 Then
                n_1 = n_1 + 1
                t_1 = t_1 + Val(campi(11))
            End If
           
            If Val(campi(9)) = 7  Then
                n_2 = n_2 + 1
                t_2 = t_2 + Val(campi(11))
            End If
       
            If Val(campi(9)) = 4 Then
                n_3 = n_3 + 1
                t_3 = t_3 + Val(campi(11))
            End If
       
            If campi(9) = "Z" Then
                n_4 = n_4 + 1
                t_4 = t_4 + Val(campi(11))
            End If
       
            If Val(campi(9)) = 13 Then
                n_5 = n_5 + 1
                t_5 = t_5 + Val(campi(11))
            End If
       
            If Val(campi(9)) = 5 Then
                n_6 = n_6 + 1
                t_6 = t_6 + Val(campi(11))
            End If
       
            If Val(campi(9)) = 31 Then
                n_7 = n_7 + 1
                t_7 = t_7 + Val(campi(11))
            End If
       
            If Val(campi(9)) = 6 Then
                n_8 = n_8 + 1
                t_8 = t_8 + Val(campi(11))
            End If
       
        End If
       
fine_loop:
For x = 0 To 11
    campi(x) = ""
Next x

Loop

Close #1


tutto funziona perfettamente ad eccezione del fatto che si verifica quando nel file csv è presente UNA sola riga per un id
esempio

53
53
53
100
100
100
200
300
300
300
ecc
ecc

In questo caso nel foglio di riepilogo ottengo tutte le informazioni di 53,100,300, ecc ecc
ma la riga di 200 è vuota essendo scritto solo l'id.
Questo avviene perche la condizione

If id_rep <> id_csv Then

viene subito soddisfatta prima di avere aggiornato i dati ,,,,,

Potreste aiutarmi a strutturare meglio ?

Grazie
Office 2010
karug64
Utente Senior
 
Post: 580
Iscritto il: 20/11/11 21:22

Postdi archimede » 28/02/15 13:56

karug64 ha scritto:tutto funziona perfettamente
Sei sicuro? A prima vista quell'Else prima della sezione "calcolo" non mi pare corretto.

Non ho Office per verificare, ma io proverei una cosa di questo tipo:
Codice: Seleziona tutto
    Do While Not EOF(1)

        Line Input #1, rigacsv

        campi = Split(Replace(rigacsv, """", "", , , vbTextCompare), ";")
        r = r + 1
        If r = 1 Then
        ' controllo se il file è quello giusto leggendo la prima riga del file csv che ha l'intestazione
            If campi(0) <> "Filiale inseriment" Then
                ' NO OK file errato
                MsgBox "Hai selezionato il file ERRATO !!", vbCritical, "Errore"
                Sheets(1).Select
                Close #1
                Exit Sub
            Else
                GoTo fine_loop
            End If
        End If

        id_csv = campi(1)
        If id_rep = 0 Then id_rep = id_csv

        'id diversi, aggiorno il foglio report con i valori sommati
        If id_rep <> id_csv Then

            riga_rep = riga_rep + 1
            sh_report.Cells(riga_rep, 1).Value = id_rep
            sh_report.Cells(riga_rep, 2).Value = tmp_set
            sh_report.Cells(riga_rep, 3).Value = tmp_des
            sh_report.Cells(riga_rep, 4).Value = tmp_att
            sh_report.Cells(riga_rep, 5).Value = tmp_cc
            sh_report.Cells(riga_rep, 6).Value = n_1
            sh_report.Cells(riga_rep, 7).Value = t_1
            sh_report.Cells(riga_rep, 8).Value = n_2
            sh_report.Cells(riga_rep, 9).Value = t_2
            sh_report.Cells(riga_rep, 10).Value = n_3
            sh_report.Cells(riga_rep, 11).Value = t_3
            sh_report.Cells(riga_rep, 12).Value = n_4
            sh_report.Cells(riga_rep, 13).Value = t_4
            sh_report.Cells(riga_rep, 15).Value = n_5
            sh_report.Cells(riga_rep, 16).Value = t_5
            sh_report.Cells(riga_rep, 17).Value = n_6
            sh_report.Cells(riga_rep, 18).Value = t_6
            sh_report.Cells(riga_rep, 19).Value = n_7
            sh_report.Cells(riga_rep, 20).Value = t_7
            sh_report.Cells(riga_rep, 21).Value = n_8
            sh_report.Cells(riga_rep, 22).Value = t_8
            tmp_id = 0
            tmp_set = 0
            tmp_des = ""
            n_1 = 0
            n_2 = 0
            n_3 = 0
            n_4 = 0
            n_5 = 0
            n_6 = 0
            n_7 = 0
            n_8 = 0
            t_1 = 0
            t_2 = 0
            t_3 = 0
            t_4 = 0
            t_5 = 0
            t_6 = 0
            t_7 = 0
            t_8 = 0
            id_rep = id_csv
        End If

        'calcolo
        tmp_id = campi(1)
        tmp_set = campi(2)
        tmp_des = campi(3)

        Select Case Val(campi(9))
            Case 2, 11, 12, 15, 21
                n_1 = n_1 + 1
                t_1 = t_1 + Val(campi(11))
            Case 4
                n_3 = n_3 + 1
                t_3 = t_3 + Val(campi(11))
            Case 5
                n_6 = n_6 + 1
                t_6 = t_6 + Val(campi(11))
            Case 6
                n_8 = n_8 + 1
                t_8 = t_8 + Val(campi(11))
            Case 7
                n_2 = n_2 + 1
                t_2 = t_2 + Val(campi(11))
            Case 13
                n_5 = n_5 + 1
                t_5 = t_5 + Val(campi(11))
            Case 31
                n_7 = n_7 + 1
                t_7 = t_7 + Val(campi(11))
        End Select

        If campi(9) = "Z" Then
            n_4 = n_4 + 1
            t_4 = t_4 + Val(campi(11))
        End If

        fine_loop:
        For x = 0 To 11
            campi(x) = ""
        Next x
    Loop

    Close #1
HTH.

Alessandro

PS: inoltre ho il sospetto che l'ultimo id_csv che leggi non finisca sul report.
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Re: Utilizzare campi in array variant dopo split

Postdi karug64 » 28/02/15 18:41

Ok, Alessandro.

La tua soluzione funziona.
Ora sto controllando a campione i risultati, ma per il momento sembra tutto ok.
Grazie a tutti.
Office 2010
karug64
Utente Senior
 
Post: 580
Iscritto il: 20/11/11 21:22


Torna a Applicazioni Office Windows


Topic correlati a "Utilizzare campi in array variant dopo split":


Chi c’è in linea

Visitano il forum: Maury170419 e 18 ospiti