Aiutamici Forum
Benvenuto Ospite Cerca | Topic Attivi | Utenti | | Log In | Registra

Importazione dati da file excel su mdb Opzioni
Misonsan
Inviato: Friday, December 19, 2008 11:26:36 AM
Rank: AiutAmico

Iscritto dal : 7/8/2007
Posts: 77
Grazie a tutti gli amici della Community

Penso che il problema sia hgià stato affrontato da altri, ma mi ripropongo avendo un immediato problema da risolvere.
In breve
Devo effettuare il caricamento di dati da file excel a mdb access.
Il file excel contiene n fogli contrassegnati da nome del tipo

fornitore bianchi, fornitore Rossi, Fornitore Neri, ecc
La struttura di ogni singola riga di ogni foglio è fatto dai seguenti campi
N.riga codice descrizione u.m. qta prezzo valore

i campi in Rosso sono bloccati, mentre il camo in Blu è l'unico campo libero a disposizione dell'utente per aggiornare l'ordine.
Inserendo la quantità viene ricalvolato, sulla singola riga il valore in base al prezzo.


quindi riassumendo
Le righe di ogni singolo foglio sono bloccati dando infatti all'utente che deve aggiornare il file excel la possibilità di inserire solo il campo quantitò, mentre i rimanenti campi sono bloccati

a fine compilazione dei singoli fogli del file excel, ho la necessità di importare in access le righe di tutti i fogli excel conteneti un valore > 0 sul campo quantità.

Vi chiederei una mano per poter risolvere il problema.
resto a disposizione per ogni eventuale chiarimento si ritenesse opportuno.

ciao

Moreno


Misonsan@libero.it

Brick wall
Sponsor
Inviato: Friday, December 19, 2008 11:26:36 AM

 
a10n11
Inviato: Friday, December 19, 2008 7:07:43 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
hai tre possibilità:
1) elaborare il file excel filtrando i dati che non vuoi importare
una volta filtrati i dati del foglio in ambiente Access devi solo Importare i dati da Menù File>Importa dati scegliendo il tuo file Excel

2) importare in access con la stessa procedura tutto il contenuto del file excel salvo poi eseguire una query di annullamento per eliminare i records con il campo Valore =0

3) importare sempre tutto il contenuto del file excel su una tabella provvisoria e con una query di selezione accodare i dati alla tabella principale.

in base alle tue conoscenze di access scegli la strada che ti è più congeniale.
saluti
Andrea

Misonsan
Inviato: Saturday, December 20, 2008 12:41:43 AM
Rank: AiutAmico

Iscritto dal : 7/8/2007
Posts: 77
grazie a10n11

ti ringrazio per la logica, ma su quella avevo fatto anchio le tue stesse valutazioni.
La mia richiesta d'aiuto era inerente al formalismo da usare per elaborare il file excel.
hai qualche esempio da darmi ?
grazie ancora

Moreno
a10n11
Inviato: Saturday, December 20, 2008 11:28:41 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
la soluzione che ti posso suggerire senza ricorrere a macro per preparare i dati da riversare in ambiente Access è quella di usare un Filtro Avanzato che ti crea una nuova tabella in un area vuota del foglio.
Il metodo per applicare il filtro avanzato puoi trovarlo in questa discussione:
http://forum.aiutamici.com/Default.aspx?g=posts&t=48657
devi solo cambiare la formula del criterio di selezione inserito nella cella I2 dell'immagine come segue:
=G2<>0

una volta estratti idati che sono rappresentati dalla'area in giallo,
assegna una nome es: "Filtro" a tutta l'area in giallo

salva e chiudi Excel
apri Access Menù File >Carica Dati esterni
e segui tutti i passi richiesti, facendo attenzione che nella finestra "Importazione guidata foglio di calcolo" dovrai selezionare il foglio e spuntare "Mostra Intervalli definiti" e scegliere il nome assegnato all'area filtrata "Filtro" nella finestra dove viene chiesto dove riversare i dati scegli "Tabella esistente"

E' più difficle da spiegare che a farsi.

Se poi mastichi un po' di Vba utilizzando il modello ADO potreti affidare tutto ad una macro esempi eccellenti nel sito Erlandsen Data Consulting.

saluti
Andrea

Misonsan
Inviato: Saturday, December 20, 2008 10:19:28 PM
Rank: AiutAmico

Iscritto dal : 7/8/2007
Posts: 77
grazie a10n11

credo di non aver la dote della chiarezza, anche se i miei sforzi per esserlo sono molti.
Ti ringrazio per la dritta, ma devo risolvere il problema utilizzando proprio visual basic.
Deve elaborare centinaia di file excel tutti uguali come struttura e quindi devo poter fare una elaborazione via codice.
devo leggere il primo file excel che contiene gli ordini del primo cliente.
una volta letti, tramite codice, devo caricarli in access
il ciclo si ripete per il secondo e via discorrendo per tutti.

alla fine devo aver caricato in access, su una tabella di lavoro tutti gli ordini.
Questa sarà la tabella da cui eseguire il caricamento generale degli ordini.
spero di essermi espresso + chiaramente.
Avrei bisogno quindi di alcuni esempi, se poi ci fosse un progetto su cui fare delle considerazioni andrebbe ancora meglio, per poter risolvere via codice il problema.
grazie ancora per la cortese disponibilità.
ciao

Moreno

Brick wall
a10n11
Inviato: Sunday, December 21, 2008 11:47:06 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
nel post preeceente ti avevo segnalato un sito dove poter trovare delle routine già pronte per lo scopo.
devi solo cambiare i parametri relativi ai file e al percorso di essi.
questo è l'indirizzo:
http://www.erlandsendata.no/english/index.php?d=envbadacexportado
quello che a te interessa è questo:
"Below is an extended example that shows how you can export data from multiple workbooks:"
saluti
Andrea

Misonsan
Inviato: Monday, December 22, 2008 5:05:37 PM
Rank: AiutAmico

Iscritto dal : 7/8/2007
Posts: 77
grazie a10n11


verificando il comando, ho scritto il codice per poter eseguire l'importazione dei fogli da .xls a mdb access.
Mi sembra abbastanza coerente e rispettoso della posizionalità e del formalismo del comando, ma non viene eseguito dandomi un errore che mi sembra incomprensibile.
Qualcuno ha qualche idea ?

Function importa()
' importa i dati da tutti i fogli excel ------------------------------------------------
Set DBCorrente = CurrentDb
Set tabella = DBCorrente.OpenRecordset("WrkordiniExcel", dbOpenDynaset)


Dim SQL_Text As String
Set xl = CreateObject("Excel.Application")
sSource = "c:\Ordini_Prova.xls"
With xl
.Workbooks.Add
.Workbooks.Open sSource
sheetcount = .worksheets.Count
For x = 1 To sheetcount
strname = .worksheets(x).Name
.Sheets(strname).Select

DoCmd.TransferSpreadsheet acImport, 8, "WrkordiniExcel", "c:\Ordini_Prova.xls", False

Next x
End With
xl.Application.Quit

End Function

mi da l'errore
Errore di runtime '2391'
Campo 'F1' inesistente netta tabella 'WrkordiniExcel'



vorrei poter inserire come allegati i file, ma non so come fare
Posso garantire che nella tabella access non esiste il file F1

nel d.b. access i campi della tabella rispecchiamo i nomi presenti su excel

Nriga codice descrizione um qta prezzo valore



puoi crearti una tabella access e un file xls con 3 righe e provare ?

ciao e grazie


Moreno

Brick wall
a10n11
Inviato: Monday, December 22, 2008 6:29:30 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
perchè stai percorrendo la strada più complicata??
eppure il link che ti avevo postato aveva giù un codice bello e confezionato che necessitava solo di aggiustare i riferimenti.

L'istruzione "TransferSpreadsheet" trasferisce completamente il foglio di lavoro e come titoli di campo assegna F1.F2 ecc se come fai tu assegni una tabella esistente che contiene nomi di campo definiti, la routine trova discordanza nei nomi e restituisce un errore. Per vedere esattamente cosa fa la routine che hai postato, prova a modificare questa riga:

DoCmd.TransferSpreadsheet acImport, 8, "WrkordiniExcel", "c:\Ordini_Prova.xls", False
sostituendo alla voce segnata in rosso "TabellaProva" e vedi come importa i dati.

Da notare che l'istruzione che usi non filtra La colonna Valori per risultati > di zero.

Questo che segue invece è il codice adattato alle tue esigenze da eseguire dal file excel e che deve essere ulteiormente modificato nei riferimenti segnati in rosso.


Sub ADOFromExcelToAccess()
Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=C:\Db1.mdb;"
Set rs = New ADODB.Recordset
rs.Open "Tabella1", cn, adOpenKeyset, adLockOptimistic, adCmdTable
For x = 1 To Sheets.Count
r = 2 ' se i dati nei foglio iniziano da riga 2
Do While Range("A" & r).Value <> ""
If Range("E" & r).Value <> 0 Then
With rs
.AddNew
.Fields("Nriga") = Range("A" & r).Value
.Fields("Codice") = Range("B" & r).Value
.Fields("Descrizione") = Range("C" & r).Value
.Fields("UM") = Range("D" & r).Value
.Fields("qta") = Range("E" & r).Value
.Fields("Prezzo") = Range("F" & r).Value
.Fields("Valore") = Range("G" & r).Value
.Update
End With
End If
r = r + 1
Loop
Next x
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub

prova a fa sapere.
saluti
Andrea

Misonsan
Inviato: Monday, December 22, 2008 10:19:25 PM
Rank: AiutAmico

Iscritto dal : 7/8/2007
Posts: 77
grazie a10n11 o per meglio dire Andrea

ti ringrazio per la cortesia e la pazienza che dimostri.
Come ti sarai già reso conto, le mie cognizioni su excel vanno al solo uso operativo; mi sta affascinando la modalità di programmazione e ti ringrazio per i consigli che mi dai.
Con il suggerimento che mi hai dato

DoCmd.TransferSpreadsheet acImport, 8, "WrkordiniExcel", "c:\Ordini_Prova.xls", False
sostituendo alla voce segnata in rosso "TabellaProva" e vedi come importa i dati.


sono riuscito a migrare i due fogli nella tabella "TabellaProva"; ovviamente non era il risultato finale, ma è stato bello e importante vedere che qualcosa comincia a muoversi.

Vorrei provare la nuova soluzione che mi proponi e che certamente produce i risultati che tanto attengo, ma non so come eseguire dal file excel la sub che mi hai descritto.
Porta pazienza, ma dovresti indicarmi passo passo come inserire nel file excel il codice.
Nota comunque che sarebbe + importante che il codice fosse all'interno del mdb.
Ti vorrei chiedere poi una cosa abbastanza importante per il mio livello di conoscenza.
Posso inserire queste righe di codice in una pagina .asp ?

Grazie alla tua pazienza sento che riuscirò a risolvere questo forse banale problemino ma che mi risolve non pochi problemi.
ancora 1000 ringraziamenti per la pazienza.

se non ti crea disagio o fastidio, ogni tuo commento sul codice mi sarebbe oltremodo gradito.

ciao


Moreno
a10n11
Inviato: Tuesday, December 23, 2008 12:46:09 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
la macro che sopra indicata da inserire in un modulo standard nell'editor di Visual Basic, va inserita come segue:

Dal foglio excel del tuo file, ALT+F11 ti fa accedere all'editor di Vba, una volta aperta la finestra dell'editor, Menù Inserisci> Modulo. Nella pagina bianca che si apre nella finestra di destra incolla tutto il codice.
Per funzionare, devi attivare il riferimento all'oggetto Activex Menu Strumenti>Riferimenti, cerca la voce "Microsoft ActiveX Data Objects 2.0 Library" mettigli il segno di spunta e conferma con Ok
Con ALT+F11 torni al foglio. Ora puoi richiamare la macro in due modi:
1) Menù Strumenti>Macro seleziona la macro appena incollata e clicca su Esegui
2) inserire un pulsante sul foglio ed associargli la le detta macro.



Traduzione del codice:


Sub ADOFromExcelToAccess()
'dichiarazioni delle variabili
Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long

'Connessione al Database di access
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=C:\Db1.mdb;"

'apre il recordset Tabella1 per ricevere i dati
Set rs = New ADODB.Recordset
rs.Open "Tabella1", cn, adOpenKeyset, adLockOptimistic, adCmdTable

'conta i fogli
For x = 1 To Sheets.Count
'comincia a leggere i dati da riga 2
r = 2
'fino a quando non trova una cella vuota in colonna A
Do While Range("A" & r).Value <> ""
'con la condizione che il campo Valore sia diverso da zero
If Range("E" & r).Value <> 0 Then
'aggiunge i records alla tabella
With rs
.AddNew
'ATTENZIONE QUI AVEVO OMESSO IL RICHIAMO DEL FOGLIO


.Fields("Nriga") = Sheets("Foglio" & x).Range("A" & r).Value
.Fields("Codice") = Sheets("Foglio" & x).Range("B" & r).Value
.Fields("Descrizione") = Sheets("Foglio" & x).Range("C" & r).Value
.Fields("UM") = Sheets("Foglio" & x).Range("D" & r).Value
.Fields("qta") = Sheets("Foglio" & x).Range("E" & r).Value
.Fields("Prezzo") = Sheets("Foglio" & x).Range("F" & r).Value
.Fields("Valore") = Sheets("Foglio" & x).Range("G" & r).Value
.Update
End With
End If
'passa a leggere la riga successiva
r = r + 1
Loop
Next x
'chiude tutte le istanze
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub



SOLUZIONE CON MACRO IN AMBIENTE ACCESS:

questi sono i passi da eseguire:
Creazione della Tabella con intestazioni di campo identici al foglio Excel
Creazione di una maschera con un pulsante per richiamare la macro. Una volta creato il pulsante, click dx su di esso e scsegliere proprietà, nella scheda "Evento", alla voce "Click" troverai a fianco il simbolo di 3 puntini, clicca su di esso, selezionano la voce "Generatore di codice" e ti si aprirà l'editor di Visual Basic con le sguenti voci:
Private Sub Comando0_Click()
End Sub

copia tutto questo codice in mezzo a Private Sub.. e End Sub

Dim DBCOrrente As DAO.Database
Dim Tabella As DAO.Recordset
Dim I As Long
'Apre il file Excel
Workbooks.Open Filename:="c:\Prova.xls"

'Apre la tabella
Set DBCOrrente = CurrentDb
Set Tabella = DBCOrrente.OpenRecordset("Tabella1")

'conto il numero dei fogli del workbook
For x = 1 To Sheets.Count
r = 2 ' per ogni foglio inizio da riga 2
Do While Range("A" & r).Value <> ""
'escludo tutti quelli che hanno il campo "Valore" =0
If Range("E" & r).Value <> 0 Then
'Aggiorno la Tabella
With Tabella

.AddNew
.Fields("Nriga") = Worksheets("Foglio" & x).Range("A" & r)
.Fields("Codice") = Worksheets("Foglio" & x).Range("B" & r)
.Fields("Descrizione") = Worksheets("Foglio" & x).Range("C" & r)
.Fields("UM") = Worksheets("Foglio" & x).Range("D" & r)
.Fields("Qta") = Worksheets("Foglio" & x).Range("E" & r)
.Fields("Prezzo") = Worksheets("Foglio" & x).Range("F" & r)
.Fields("Valore") = Worksheets("Foglio" & x).Range("G" & r)
.Update
End With

End If
r = r + 1 ' passo alla lettura della riga successiva
Loop
Next x
Tabella.Close
DBCOrrente.Close
Workbooks("Prova.xls").Close


Anche questa macro (che come vedi è simile all'altra) per funzionare necessita che vengano attivate le librerie di riferimento.
Menù Strumenti>Riferimenti
cerca e spunta le seguenti voci: confermando con Ok
Microsoft DAO 3.6 Object Library
Microsoft Excel 11.0 Object Library
ALT+F11 ti ricondurrà alla finestra di access
non ti rimane altro che richiamare la Maschera e cliccare sul pulsante.
Spero di non aver fatto troppo casino.

per quanto riguarda ASP non ti so aiutare.
saluti
Andrea



Misonsan
Inviato: Tuesday, December 23, 2008 5:31:39 PM
Rank: AiutAmico

Iscritto dal : 7/8/2007
Posts: 77
Ciao Andrea

Grazie sempre per le continue pillole di sapienza e pazienza.
Le istruzioni per inserire il codice nel foglio excel sono fantastiche e chiare.
Le ho inserire, ma si ferma sull'istruzione in BLU

devo sostituire al campo "Foglio" con il nome vero del foglio ?
se si come mi comporto avendo da scandire n foglio con nomi diversi ? (Fornitore 1, Fornitore 2, ecc)

adesso mi cimento con la seconda soluzione in access.
Ti faccio sapere.

Sub ADOFromExcelToAccess()
'dichiarazioni delle variabili
Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long

'Connessione al Database di access
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=C:\Db1.mdb;"

'apre il recordset Tabella1 per ricevere i dati
Set rs = New ADODB.Recordset
rs.Open "Tabella1", cn, adOpenKeyset, adLockOptimistic, adCmdTable

'conta i fogli
For x = 1 To Sheets.Count
'comincia a leggere i dati da riga 2
r = 2
'fino a quando non trova una cella vuota in colonna A
Do While Range("A" & r).Value <> ""
'con la condizione che il campo Valore sia diverso da zero
If Range("E" & r).Value <> 0 Then
'aggiunge i records alla tabella
With rs
.AddNew
'ATTENZIONE QUI AVEVO OMESSO IL RICHIAMO DEL FOGLIO


.Fields("Nriga") = Sheets("Foglio" & x).Range("A" & r).Value
.Fields("Codice") = Sheets("Foglio" & x).Range("B" & r).Value
.Fields("Descrizione") = Sheets("Foglio" & x).Range("C" & r).Value
.Fields("UM") = Sheets("Foglio" & x).Range("D" & r).Value
.Fields("qta") = Sheets("Foglio" & x).Range("E" & r).Value
.Fields("Prezzo") = Sheets("Foglio" & x).Range("F" & r).Value
.Fields("Valore") = Sheets("Foglio" & x).Range("G" & r).Value
.Update
End With
End If
'passa a leggere la riga successiva
r = r + 1
Loop
Next x
'chiude tutte le istanze
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub



l'errore che viene evidenziato è: errore di runtime -2147352565 (8002000b)
si sono verificati errori in un'operazione in un'operazione OLD DB composta da più passaggi.
controllare i songoli valori di stato OLE DB, se disponibili.
Nessuna operazione seguita

Ciao

Moreno
Misonsan
Inviato: Tuesday, December 23, 2008 5:47:16 PM
Rank: AiutAmico

Iscritto dal : 7/8/2007
Posts: 77
Ciao Andrea

Ho appena finito di inserire il codice per access.
le librerie inserite sono

Microsoft DAO 3.6 Object Library
Microsoft Excel 11.0 Object Library

Sub FunzioneAndrea()

Dim DBCOrrente As DAO.Database
Dim Tabella As DAO.Recordset
Dim I As Long
'Apre il file Excel
Workbooks.Open Filename:="c:\Ordini_Prova.xls"

'Apre la tabella
Set DBCOrrente = CurrentDb
Set Tabella = DBCOrrente.OpenRecordset("Tabella1")

'conto il numero dei fogli del workbook
For x = 1 To Sheets.Count
r = 2 ' per ogni foglio inizio da riga 2
Do While Range("A" & r).Value <> ""
'escludo tutti quelli che hanno il campo "Valore" =0
If Range("E" & r).Value <> 0 Then
'Aggiorno la Tabella
With Tabella

.AddNew
.Fields("Nriga") = Worksheets("Foglio" & x).Range("A" & r)
.Fields("Codice") = Worksheets("Foglio" & x).Range("B" & r)
.Fields("Descrizione") = Worksheets("Foglio" & x).Range("C" & r)
.Fields("UM") = Worksheets("Foglio" & x).Range("D" & r)
.Fields("Qta") = Worksheets("Foglio" & x).Range("E" & r)
.Fields("Prezzo") = Worksheets("Foglio" & x).Range("F" & r)
.Fields("Valore") = Worksheets("Foglio" & x).Range("G" & r)
.Update
End With

End If
r = r + 1 ' passo alla lettura della riga successiva
Loop
Next x
Tabella.Close
DBCOrrente.Close
Workbooks("Ordini_Prova.xls").Close


End Sub


l'errore è

sub o function non definita.

grazie per la pazienza

ciao

Moreno

Brick wall Brick wall Brick wall Brick wall
a10n11
Inviato: Tuesday, December 23, 2008 6:21:32 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694

Misonsan ha scritto:


Grazie sempre per le continue pillole di sapienza e pazienza.
Le istruzioni per inserire il codice nel foglio excel sono fantastiche e chiare.
Le ho inserire, ma si ferma sull'istruzione in BLU

devo sostituire al campo "Foglio" con il nome vero del foglio ?
se si come mi comporto avendo da scandire n foglio con nomi diversi ? (Fornitore 1, Fornitore 2, ecc)

.Fields("Nriga") = Sheets("Foglio" & x).Range("A" & r).Value
.Fields("Codice") = Sheets("Foglio" & x).Range("B" & r).Value
.Fields("Descrizione") = Sheets("Foglio" & x).Range("C" & r).Value
.Fields("UM") = Sheets("Foglio" & x).Range("D" & r).Value
.Fields("qta") = Sheets("Foglio" & x).Range("E" & r).Value
.Fields("Prezzo") = Sheets("Foglio" & x).Range("F" & r).Value
.Fields("Valore") = Sheets("Foglio" & x).Range("G" & r).Value


Salve
L'errore ti dice che non trova concoranza nel nome del foglio. Errore mio perchè nel primo post avevi indicato come erano rinominati i fogli e mi era sfuggito.
Se deve riternersi che tutti i fogli presenti nel file devono essere elaborati, devi cambiare le righe seguenti come segue:

.Fields("Nriga") = Sheets(x).Range("A" & r).Value[/b][/color]
.Fields("Codice") = Sheets(x).Range("B" & r).Value
.Fields("Descrizione") = Sheets(x).Range("C" & r).Value
.Fields("UM") = Sheets(x).Range("D" & r).Value
.Fields("qta") = Sheets(x).Range("E" & r).Value
.Fields("Prezzo") = Sheets(x).Range("F" & r).Value
.Fields("Valore") = Sheets(x).Range("G" & r).Value


saluti
Andrea

a10n11
Inviato: Tuesday, December 23, 2008 6:25:18 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
Misonsan ha scritto:


Ho appena finito di inserire il codice per access.
le librerie inserite sono

Microsoft DAO 3.6 Object Library
Microsoft Excel 11.0 Object Library


salve l'errore ci dice che non è referenziata la libreria.
Sicuro di aver spuntato le due librerie e aver confermato con OK?
Controlla di nuovo dalla finestra dell'editor di Visual Basic Menù Strumenti> Riferimenti se le due librerie sono referenziate in modo particolare, per l'errore indicato, Microsoft Excel 11.0 Object Library
dovretsi avere una situazione di quiesto tipo

NB. la modifica fatta per la macro nel file excel che istanzia i nomi dei fogli va fatta anche qui.

Ps. che versione hai di Office??
saluti
Andrea


Misonsan
Inviato: Wednesday, December 24, 2008 10:10:56 AM
Rank: AiutAmico

Iscritto dal : 7/8/2007
Posts: 77
Ciao Andrea

Come al solito avevi ragione.
nei riferimenti mancava un riferimento.
Gira bene
Ho verificato un problema.
Mi spiace di non riuscire ad inseriti un file in allegato, ma cerco di docuemtarmi al meglio

Il file excel di input contiene 2 fogli
il primo chiamato "Fornitore 1" contiene i seguenti dati

nriga codice descrizione um qta prezzo valore
1 articolo 01 Mele kg 2 0,75 1,50
2 articolo 02 Pere Williams kg. 0 0,95 0,00
3 articolo 03 Uva Fragola kg 0 0,18 0,00
4 articolo 04 Patate Kg. 5 0,18 0,90
5 articolo 05 Melanzane Kg. 14 1,10 15,40
6 articolo 06 Carote Kg. 2 0,75 1,50
7 articolo 07 Uova N.ro 0 0,10 0,00
8 0 0,00
9 0 0,00
10 0 0,00

il secondo foglio chiamato "Fornitore 2" contiene i seguenti dati


nriga codice descrizione um qta prezzo valore
1 articolo 08 pane kg 0 1,50 0,00
2 articolo 09 vino lt 3 2,20 6,60
3 articolo 10 insalata kg 0 1,05 0,00
4 0 0,00
5 0 0,00


il risultato dell'elaborazione è


nriga codice descrizione um qta prezzo valore
4 0 0
5 0 0
6 0 0
1 articolo 01 Mele kg 2 0,75 1,5
4 articolo 04 Patate Kg. 5 0,18 0,9
5 articolo 05 Melanzane Kg. 14 1,1 15,4
6 articolo 06 Carote Kg. 2 0,75 1,5
1 articolo 08 pane kg 0 1,5 0



Considerazioni sull'elaborazione.


1) nel loop dei singoli fogli vengono scanditi tutte le righe del foglio
logica di trattamento del foglio/i
Per le righe con quantità 0 saltare l'importazione
Per le righe prive del codice articolo uscire dal foglio
2) creando nel d.b. access anche un campo "Nome Fornitore" vorrei potermi salvare il nome del foglio in analisi che corrispondel al nome del fornitore


Il codice che mi hai gentilmente fornito funziona bene, però mi estrae per il secondo foglio un campo con valore quantità a 0 (Evidenziato in blu) mentre omette di salvare il record evidenziato in verde.
probabilmente un erroe banalissimo.
se riesci a sistemarmi queste situazioni avrei risolto il problema.
grazie e buone feste

ciao

Moreno Brick wall


ps mi hai permesso di iniziare a capire come muovermi in excel (sei grande e ti ringrazio infinitamente) Boo hoo!
a10n11
Inviato: Wednesday, December 24, 2008 11:28:12 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
non mi dici quale delle due soluzioni hai adottato, pertanto ti rimando entrambe le routine.
Non funzionava bene perchè una parte del codice era rimasta solo nella mia testa. seguono i due codici modificati con l'aggiunta del nome del foglio per il quale dovrai aggiungere nella tabella di Access un campo con il nome "Fornitore"

1) In ambiente Excel: (in rosso le modifiche apportate)

Sub ADOFromExcelToAccess()
Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=C:\Db1.mdb;"
Set rs = New ADODB.Recordset
rs.Open "Tabella1", cn, adOpenKeyset, adLockOptimistic, adCmdTable
For x = 1 To Sheets.Count
fornitore = Sheets(x).Name
With Sheets(x)
r = 2
Do While .Range("B" & r).Value <> "" ' Punta il controllo sulla colonna B
'non più sulla A
If .Range("E" & r).Value <> 0 Then
With rs
.AddNew
.Fields("Nriga") = Sheets(x).Range("A" & r).Value
.Fields("Codice") = Sheets(x).Range("B" & r).Value
.Fields("Descrizione") = Sheets(x).Range("C" & r).Value
.Fields("UM") = Sheets(x).Range("D" & r).Value
.Fields("qta") = Sheets(x).Range("E" & r).Value
.Fields("Prezzo") = Sheets(x).Range("F" & r).Value
.Fields("Valore") = Sheets(x).Range("G" & r).Value
.Fields("Fornitore") = fornitore
.Update
End With

End If
r = r + 1
Loop
End With
Next x
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
Msgbox ("Importazione Terminata")
End Sub


2) in Ambiente Access (in rosso le modifiche)

Private Sub Comando0_Click()
Dim DBCOrrente As DAO.Database
Dim Tabella As DAO.Recordset
Dim I As Long
'Apre il file Excel
Workbooks.Open Filename:="c:\Prova.xls"

'Apre la tabella
Set DBCOrrente = CurrentDb
Set Tabella = DBCOrrente.OpenRecordset("Tabella1")

'conto il numero dei fogli del workbook
For x = 1 To Sheets.Count
fornitore = Sheets(x).Name
With Sheets(x)
r = 2 ' per ogni foglio inizio da riga 2
Do While .Range("B" & r).Value <> ""
'escludo tutti quelli che hanno il campo "Valore" =0
If .Range("E" & r).Value <> 0 Then

'Aggiorno la Tabella
With Tabella

.AddNew
.Fields("Nriga") = Sheets(x).Range("A" & r)
.Fields("Codice") = Sheets(x).Range("B" & r)
.Fields("Descrizione") = Sheets(x).Range("C" & r)
.Fields("UM") = Sheets(x).Range("D" & r)
.Fields("Qta") = Sheets(x).Range("E" & r)
.Fields("Prezzo") = Sheets(x).Range("F" & r)
.Fields("Valore") = Sheets(x).Range("G" & r)
.Fields("Fornitore") = fornitore
.Update
End With

End If
r = r + 1 ' passo alla lettura della riga successiva
Loop
End With
Next x
Tabella.Close
DBCOrrente.Close
Workbooks("Prova.xls").Close
MsgBox ("Importazione termina")
End Sub


Spero di non aver dimenticato nulla.
saluti
Andrea



Misonsan
Inviato: Wednesday, December 24, 2008 12:07:13 PM
Rank: AiutAmico

Iscritto dal : 7/8/2007
Posts: 77
Andrea sei GRANDE Boo hoo! Boo hoo!

Funziona alla grande, anzi alla grandissima.

Mi hai risolto un grosso problema e te ne sono grato.
Ho adottato la soluzione access, ma sono certemente sicuro che funziona alla grande anche quella excel, che proverò domani(Si fa per dire) a casa.
Vorrei chiederti un altro piccolo sforzo.

Volendo fare esattamente il contrario e cioè, partendo da una tabella access, vorrei poter creare una tabella excel dove la prima riga dovrebbe contenere i nomi dei campi del recordset letto dalla tabella access.
Sai darmi una mano ?

grazie ancora di tutta la pazienza e cortesia

BUON NATALE


Moreno


Applause Applause
a10n11
Inviato: Wednesday, December 24, 2008 5:55:53 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
prova con questo codice:

Sub CopiaRecordset()
Dim Miorange As Range
Dim db As Database, rs As Recordset
DBName = "c:\il nome del database.mdb"
TableName = "Tabella1" ' Il nome della tua tabella
Dim Ncol As Integer
Set Miorange = Range("a1")
Set db = OpenDatabase(DBName)
Set rs = db.OpenRecordset(TableName, dbOpenTable)
For Ncol = 0 To rs.Fields.Count - 1
Miorange.Offset(0, Ncol).Value = rs.Fields(Ncol).Name
Next
Miorange.Offset(1, 0).CopyFromRecordset rs
Set rs = Nothing
db.Close
Set db = Nothing
End Sub

da copiare in un modulo standard dell'editor VBa di excel

Ricordati di Attivare il riferimento "Microsoft DAO ... object Library"

Ora Vado a godermi la festa di Natale.

Cordiali e sinceri auguri
Andrea

Misonsan
Inviato: Thursday, December 25, 2008 10:45:01 AM
Rank: AiutAmico

Iscritto dal : 7/8/2007
Posts: 77
Grazie Andrea

contraccambio i draditissimi aguri
Ho inserito il codice e selezionato nei riferimenti la Microsoft DAO 3.6 Object Library

eseguendo la macro mi da il seguente errore
"le macro sono disabilitate perchè il livello di protezione è impostato su Elevato ...."
Il livello di protezione invece è impostato su bassa.
Quindi l'errore è forse per la mancanza di altri riferimenti.

quelli attuali sono
Visual Basic for application
Microsoft excel 11.0 object lubrary
Ole Automation
Microsoft office 11.0 object lubrary
Microsoft DAO 3.6 Object Library

il problrma comunque sta alla fonte

il mio problema comunque sarebbe quello di avere la funzione per gestire il ripopolamento del file excel dei vari fornitori partendo da Access.
Quindi, avendo una query su access che mi estragga tutti i record dei prodotti dei vari fornitori, creando un file excel nuovo, creare i singoli fogli, uno per fornitore, con i campi del recordset access
Il primo record ovviamente dovrebbe essere l'intestazione dei campi

questa logica ha il senso di lavorare sempre su un unico ambiente.
Creo su mdb access una maschera con 2 bottoni
Bottone 1 aggiorno tabella1 su mdb da file excel
Bottone 2 Creo il nuovo file excel da Tabellax

grazie

Moreno




Utenti presenti in questo topic
Guest


Salta al Forum
Aggiunta nuovi Topic disabilitata in questo forum.
Risposte disabilitate in questo forum.
Eliminazione tuoi Post disabilitata in questo forum.
Modifica dei tuoi post disabilitata in questo forum.
Creazione Sondaggi disabilitata in questo forum.
Voto ai sondaggi disabilitato in questo forum.

Main Forum RSS : RSS

Aiutamici Theme
Powered by Yet Another Forum.net versione 1.9.1.8 (NET v2.0) - 3/29/2008
Copyright © 2003-2008 Yet Another Forum.net. All rights reserved.