Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

[Excel-VBA] Importazione ed aggiornamento dati da .csv

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

[Excel-VBA] Importazione ed aggiornamento dati da .csv

Postdi Michell » 14/06/11 10:12

Salve a tutti, dopo svariati anni passati ad usufruire di questo forum grazie ai vostri preziosi interventi mi ritrovo in un angolo morto e costretto a chiedere il vostro aiuto.
Ho un file .csv che importo senza nessun problema in un file Excel.
Purtroppo il file .csv è soggetto a cambiamenti poiché è un listino prezzi e di conseguenza periodicamente ci saranno articoli cancellati, variazioni prezzi ed articoli nuovi.
Usando la semplice funzione aggiorna riesco solo ad ottenere la cancellazione della riga e l'inserimento delle nuove righe che mi complica di non poco la vita!
Avrei bisogno di una macro che:
- formatti il testo degli articoli non più presenti con il barrato.
- formatti in un modo visibile (un colore, un grassetto o altro) le celle che hanno subito variazione.
- Inserisca gli eventuali nuovi articoli dalla prima riga disponibile vuota.

Attualmente il listino prende 7 colonne.
Dalla 8ava in poi ci sono delle formule ed ecco il motivo per cui il semplice aggiorna di Excel non basta.

Spero tanto qualcuno di voi possa aiutarmi.

Michell
Michell
Utente Junior
 
Post: 19
Iscritto il: 17/11/05 20:04

Sponsor
 

Re: [Excel-VBA] Importazione ed aggiornamento dati da .csv

Postdi Flash30005 » 14/06/11 13:01

Innanzitutto benvenuto

Vedo dall'altro tuo post che hai letto molto sia in questo forum che in altri e ti ringrazio a nome di utenti che potranno utilizzare quanto da te postato

per quanto riguarda il quesito di questo topic ti consiglio di leggere questa discussione
che, secondo me, è molto simile alla tua richiesta e riuscirai ad adattarla alle tue esigenze, altrimenti posta ancora.

Ciao
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: [Excel-VBA] Importazione ed aggiornamento dati da .csv

Postdi Michell » 14/06/11 14:28

Grazie mille per la segnalazione.
Da un primo sguardo direi che può fare al caso mio.
Purtroppo tra la miriade di pagine viste mi è sfuggita questa....non mi piace aprire topic quando ne esistono di già!
Adesso vedo cosa riesco a tirare fuori da quella discussione.

Michell
Michell
Utente Junior
 
Post: 19
Iscritto il: 17/11/05 20:04

Re: [Excel-VBA] Importazione ed aggiornamento dati da .csv

Postdi Michell » 14/06/11 15:38

Purtroppo il topic che mi hai segnalato non fa al mio caso seppur molto interessante ed utile.
Lì (sul topic che mi hai segnalato) si lavora su 4 fogli e sui fogli 3 e 4 si mostrano i cambiamenti escludendo tutto il resto.
A me, purtroppo e da questo non posso muovermi (sigh), serve che il tutto rimanga sempre sullo stesso foglio poiché il foglio stesso è un listino sul quale sono presenti altre formule e ad altre colonne.
Al limite potrei lavorare su due fogli e quindi avrò:
Foglio1 su cui importo il nuovo listino.
Foglio2 su cui c'è il listino lavorato e su cui vanno inseriti i nuovi dati processati.

Altro problema è che al momento ho più di 700 righe ed a brevissimo supererò le 2000 righe! Una macro che lavora su 4 fogli con questa mole di dati immagino richieda non poco tempo!

Pensi che sia fattibile una cosa del genere? O mi sto cacciando in un buco senza fondo?

Michell
Michell
Utente Junior
 
Post: 19
Iscritto il: 17/11/05 20:04

Re: [Excel-VBA] Importazione ed aggiornamento dati da .csv

Postdi Flash30005 » 14/06/11 17:03

L'esigenza di quell'utente era di avere quelle differenziazioni
1) Listino vecchio
2) Listino nuovo
3) Articoli che sul nuovo non ci sono più
4) Articoli nuovi

Ora capisco che non può essere questa la tua esigenza ma sinceramente vedo una soluzione soluzione con 3 fogli
1) L vecchio
2) L Nuovo
3) L Aggiornato

Forse anche con 2 soli fogli ma con uno credo non sia possibile fare un confronto articoli

2000/3000 righe non sono un problema con excel, occorreranno circa 40 secondi o meno per l'elaborazione

E' opportuno, in ogni caso, che allegassi un file con esempi

Ciao
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: [Excel-VBA] Importazione ed aggiornamento dati da .csv

Postdi Anthony47 » 14/06/11 23:36

Ciao, benvenuto anche da parte mia
Guarda anche le considerazioni di Flash sopra.

dopo svariati anni passati ad usufruire di questo forum grazie ai vostri preziosi interventi mi ritrovo in un angolo morto e costretto a chiedere il vostro aiuto
Mi spiace, se vuoi ti indico un paio di forum che ti avrebbero lasciato al punto di partenza... :D :D

Un po' piu' seriamente:
-in Foglio1 hai il listino "precedente"
-importi il nuovo listino su Foglio2
-su una colonna libera di Foglio1, tramite Cerca.Vert controlli se quel codice e' presente in Foglio2; avrai #N/D se non presente
-usi l' esito in questa colonna per formattare il testo della riga con effetto barrato; per questo dovrai usare la formattazione condizionale, condizione=La formula e', come formula userai ad esempio =Val.Errore($Z1), come Formato, nel tab Carattere imposterai l' effetto barrato. La formula ipotizza che hai usato la col Z
-in ulteriori N colonne libere di Foglio1 controlli, per ogni Codice di Foglio1 e per ognuna delle N colonne di tuo interesse se il dato e' cambiato; per questo calcolo userai una formula del tipo
=LaCellaDiInteresse<>Cerca.vert(IlCodice;Foglio2!Tabella;IndiceDellaCellaDiInteresse;0)
La formula ti restituira' Vero, Falso, #N/D
-usi l' esito di queste colonne per impostare il grassetto in caso di valore Vero; usando la formattazione condizionale, userai quindi una formula tipo =AA1 (se Vero /Falso /#N/D l' hai calcolato in AA1) e come formato lo stile grassetto.

Su Foglio2,
-in una colonna libera tramite Cerca.Vert controlli se quel codice e' presente in Foglio1; avrai #N/D se non presente.
-imposti su quella colonna il Filtro automatico

A questo punto registri una macro mentre, partendo da Foglio1:
-selezioni Foglio2
-nella freccina del filtro automatico scegli #N/D, in modo da visualizzare solo le righe nuove
-selezioni le celle visualizzate e copi
-vai su Foglio1, selezioni la prima cella libera, incolli
-premi Esc e poi interrompi la registrazione macro.

Sulla macro cosi' prodotta dovrai variare un paio di istruzioni
1) prima della ".Copy" avrai qualcosa come Range("A21:H333").Select
-modifica in
Intersect(Range("A:H"), ActiveSheet.UsedRange.Offset(1, 0)).Select
(questo nell' ipotesi che I dati partano da Riga2 e in riga1 hai le intestazioni e la freccina del filtro automatico)

2)Dopo Sheets("Foglio1").Select avrai ad esempio una Range("A123").Select
-modifica in Cells(Rows.Count,1).End(Xlup).offset(1,0).Select
In questo modo selezionerai la prima cella libera di col A, e non una cella specifica.

Eventualmente inserisci un pulsante (trovi questo simbolo nella barra degli strumenti Moduli) e gli assegni questa macro.

L' ho fatta lunga per (cercare di) farla chiara; se non ci sono riuscito, e se non ti arrivano altre proposte, posta ancora magari chiarendo quale e' il layout dei tuoi dati.

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: 13885
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel-VBA] Importazione ed aggiornamento dati da .csv

Postdi Michell » 15/06/11 13:50

Ciao, benvenuto anche da parte mia
Guarda anche le considerazioni di Flash sopra.

dopo svariati anni passati ad usufruire di questo forum grazie ai vostri preziosi interventi mi ritrovo in un angolo morto e costretto a chiedere il vostro aiuto


Mi spiace, se vuoi ti indico un paio di forum che ti avrebbero lasciato al punto di partenza... :D :D


Non riesco a capire il tuo messaggio, ma rileggendo il mio mi rendo conto che per come è composto fa capire il contrario di quello che intendevo...alcuine volte la fretta fa brutti scherzi. Mi scuso per l'inconveniente e riscrivo la frase.

Dopo svariati anni passati ad usufruire di questo forum grazie ai vostri preziosi interventi ho risolto più di un problema, ma ora mi ritrovo in un angolo morto e sono costretto a chiedere il vostro aiuto.

Ecco qual'era il mio pensiero!

Adesso leggo per benino il resto del tuo messaggio.

Grazie comunque ad entrambi per essere intervenuti.

Michell
Michell
Utente Junior
 
Post: 19
Iscritto il: 17/11/05 20:04

Re: [Excel-VBA] Importazione ed aggiornamento dati da .csv

Postdi Michell » 15/06/11 13:55

@Anthony47

Questa sera provo la tua soluzione che sembra essere più che valida.

Il tempo di metterla in pratica e vi farò sapere.

Grazie ancora.

Michell
Michell
Utente Junior
 
Post: 19
Iscritto il: 17/11/05 20:04

Re: [Excel-VBA] Importazione ed aggiornamento dati da .csv

Postdi Avatar3 » 15/06/11 18:13

Una macro possibile con due fogli ("Vecchio" e "Nuovo") è questa
Codice: Seleziona tutto
Sub Listino()
Application.ScreenUpdating = False
Application.Calculation = xlManual
Dim Ws1, Ws2 As Worksheet
Set Ws1 = Sheets("Vecchio")
Set Ws2 = Sheets("Nuovo")
URV = Ws1.Range("A" & Rows.Count).End(xlUp).Row
Ws1.Range("A2:G" & URV).Font.Bold = False
Ws1.Range("A2:G" & URV).Font.Strikethrough = False
URN = Ws2.Range("A" & Rows.Count).End(xlUp).Row
For RRV = 2 To URV
    Tr = 0
    CodV = Ws1.Range("A" & RRV).Value
    For RRN = 2 To URN
        CodN = Ws2.Range("A" & RRN).Value
        If CodV = CodN Then
            Tr = 1
            For CC = 2 To 7
                VarV = Ws1.Cells(RRV, CC).Value
                VarN = Ws2.Cells(RRN, CC).Value
                If VarV <> VarN Then Ws1.Range("A" & RRV & ":G" & RRV).Font.Bold = True
            Next CC
        End If
    Next RRN
    If Tr = 0 Then Ws1.Range("A" & RRV & ":G" & RRV).Font.Strikethrough = True
Next RRV

For RRN = 2 To URN
    Tr = 0
    CodN = Ws2.Range("A" & RRN).Value
    For RRV = 2 To URV
        CodV = Ws1.Range("A" & RRV).Value
        If CodV = CodN Then
        Tr = 1
        End If
    Next RRV
    If Tr = 0 Then
    URV = Ws1.Range("A" & Rows.Count).End(xlUp).Row + 1
    Ws2.Range("A" & RRN & ":G" & RRN).Copy Destination:=Ws1.Range("A" & URV)
    End If
Next RRN
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub


Allego file test
https://rapidshare.com/files/1894615691/ListinoVecchioNuovo.xls

Allego il file
Per il funzionamento delle macro si deve impostare la protezione a Bassa o Media.
Menu Strumenti -> Macro -> Protezione...
Avatar utente
Avatar3
Utente Senior
 
Post: 569
Iscritto il: 04/04/11 09:04

Re: [Excel-VBA] Importazione ed aggiornamento dati da .csv

Postdi Michell » 16/06/11 11:07

@Avatar
Grazie mille per la Macro...funziona alla grande!
Avrei una richiesta di modifica, se possibile.
Ho provato da solo, ma la macro è talmente complessa, almeno per me, che non sono riuscito nella modifica.
Ecco come ho impostato le cose sul file di excel:
- Il primo foglio l'ho chiamato "Nuovo" ed è il fogloio sul quale importo i dati dal .csv. Per fare questo ho registrato una macro e tutto funziona.
- Il secondo foglio l'ho chiamato "Vecchio" e contiene il listino con le modifiche e le mie formule.

Per una serie di motivi mi capita di avere articoli senza codice (quello che tu nel tuo file hai chiamato "Cod") e quindi la cella è vuota.
Lanciando la macro nel foglio "vecchio" quelle righe vengono evidenziate con il bold anche se affettivamente non ci sono state variazioni.
Ho provato sul tuo file a cancellare un codice e succede, invece, che la riga viene barrata come se il prodotto non fosse più presente.
Onde evitare sbattimenti vari ho pensato, sempre se possibile, di limitare il controllo ad eventuali cambiamenti solo alle colonne che contengono i prezzi, ossia la colonna E, la F, e la G e non su tutta la riga.
Inserisco qui di seguito il testo dei due file csv

Listino vecchio.csv
Codice: Seleziona tutto
"Codice","Nome","Produttore","Fornitore","Prezzo","Costo","Stato"
655,"prodotto1","","Tizio","9.0000","","Abilitato"
671,"prodotto2","","Caio","8.0000","","Abilitato"
054 ,"prodotto3","","Caio","28.0000","","Disabilitato"
106,"prodotto4","","Tizio","7.5000","","Disabilitato"
327 ,"prodotto5","","Caio","9.0000","","Abilitato"
521,"prodotto6","","Tizio","9.5000","","Disabilitato"
110,"prodotto7","","Caio","15.9000","","Abilitato"
"","prodotto8","","Caio","7.5000","","Abilitato"
620,"prodotto9","","Tizio","8.0000","","Abilitato"
553,"prodotto10","","Caio","5.0000","","Abilitato"
150,"prodotto11","","Tizio","10.0000","","Abilitato"
250,"prodotto12","","Caio","4.8000","","Abilitato"
380 ,"prodotto13","","Tizio","17.5000","","Abilitato"
592,"prodotto14","","Tizio","8.5000","","Abilitato"
"","prodotto15","","Caio","4.8000","","Abilitato"
206 ,"prodotto16","","Tizio","7.8000","","Disabilitato"
116 ,"prodotto17","","Tizio","7.8000","","Abilitato"

Listino nuovo.csv
Codice: Seleziona tutto
"Codice","Nome","Produttore","Fornitore","Prezzo","Costo","Stato"
655,prodotto1,"",Tizio,"9.0000","","Abilitato"
671,prodotto2,"",Caio,"8.0000","","Abilitato"
054,prodotto3,"",Caio,"28.0000","","Disabilitato"
001,"prodotto18","","Tizio","36.5000","","Disabilitato"
106,prodotto4,"",Tizio,8.0000,"","Disabilitato"
327,prodotto5,"",Caio,"9.0000","","Abilitato"
521,prodotto6,"",Tizio,"9.5000","","Disabilitato"
110,prodotto7,"",Caio,"15.9000","","Abilitato"
"",prodotto8,"",Caio,"7.5000","","Abilitato"
620,prodotto9,"",Tizio,8.5000,"","Abilitato"
553,prodotto10,"",Caio,5.5000,"","Abilitato"
148,"prodotto19","","Tizio","6.6000","","Disabilitato"
150,prodotto11,"",Tizio,10.5000,"","Abilitato"
250,prodotto12,"",Caio,"4.8000","","Abilitato"
380,prodotto13,"",Tizio,"17.5000","","Abilitato"
592,prodotto14,"",Tizio,"8.5000","","Abilitato"
134,"prodotto20","","Caio","8.8000","","Abilitato"
"",prodotto15,"",Caio,"4.8000","","Abilitato"
206,prodotto16,"",Tizio,8.8000,"","Disabilitato"
116,prodotto17,"",Tizio,"7.8000","","Abilitato"
Michell
Utente Junior
 
Post: 19
Iscritto il: 17/11/05 20:04

Re: [Excel-VBA] Importazione ed aggiornamento dati da .csv

Postdi Avatar3 » 16/06/11 11:35

Limitare il controllo alle colonne E,F,G senza considerare il codice penso che sia un grave errore
Credo che si possa considerare la colonna B invece della colonna A
Nella colonna B (dai tuoi dati) vedo che c'è il nome del prodotto in tutte le righe
pertanto, secondo me, confrontando questo campo e poi limitare alle sole colonne E,F,G è molto più corretto
Ti invio la macro modificata
Codice: Seleziona tutto
Sub Listino()
Application.ScreenUpdating = False
Application.Calculation = xlManual
Dim Ws1, Ws2 As Worksheet
Set Ws1 = Sheets("Vecchio")
Set Ws2 = Sheets("Nuovo")
URV = Ws1.Range("B" & Rows.Count).End(xlUp).Row
Ws1.Range("A2:G" & URV).Font.Bold = False
Ws1.Range("A2:G" & URV).Font.Strikethrough = False
URN = Ws2.Range("B" & Rows.Count).End(xlUp).Row
For RRV = 2 To URV
    Tr = 0
    CodV = Ws1.Range("B" & RRV).Value
    For RRN = 2 To URN
        CodN = Ws2.Range("B" & RRN).Value
        If CodV = CodN Then
            Tr = 1
            For CC = 5 To 7
                VarV = Ws1.Cells(RRV, CC).Value
                VarN = Ws2.Cells(RRN, CC).Value
                If VarV <> VarN Then Ws1.Range("A" & RRV & ":G" & RRV).Font.Bold = True
            Next CC
        End If
    Next RRN
    If Tr = 0 Then Ws1.Range("A" & RRV & ":G" & RRV).Font.Strikethrough = True
Next RRV

For RRN = 2 To URN
    Tr = 0
    CodN = Ws2.Range("B" & RRN).Value
    For RRV = 2 To URV
        CodV = Ws1.Range("B" & RRV).Value
        If CodV = CodN Then
        Tr = 1
        End If
    Next RRV
    If Tr = 0 Then
    URV = Ws1.Range("B" & Rows.Count).End(xlUp).Row + 1
    Ws2.Range("A" & RRN & ":G" & RRN).Copy Destination:=Ws1.Range("A" & URV)
    End If
Next RRN
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

Per il funzionamento delle macro si deve impostare la protezione a Bassa o Media.
Menu Strumenti -> Macro -> Protezione...
Avatar utente
Avatar3
Utente Senior
 
Post: 569
Iscritto il: 04/04/11 09:04

Re: [Excel-VBA] Importazione ed aggiornamento dati da .csv

Postdi Michell » 16/06/11 14:16

Nulla da fare.
La presenza di articoli con lo stesso nome, ma con codice diverso incasina le cose e non di poco.

Rimane più che valida la tua prima macro di cui ti ringrazio davvero tanto.

Vedrò io di risolvere il problema del codice. Per fortuna la momento sono pochi articoli.
Mi inventerò qualcosa sul listino principale.
Grazie mille ancora a tutti voi per l'aiuto.

Michell
Michell
Utente Junior
 
Post: 19
Iscritto il: 17/11/05 20:04


Torna a Applicazioni Office Windows


Topic correlati a "[Excel-VBA] Importazione ed aggiornamento dati da .csv":


Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti