Newsgroup: it.comp.appl.access
Titolo: Codice di Maurizio Borrelli per trasferire dati da excel ad access

ho usato questo codice di Maurizio per trasferire i dati da excel in una
tabella di access
Option Compare Database
Option Explicit
Option Base 0
Public Function XL2AC_xy() As Boolean
  On Error GoTo erh
  Const c_sWbk$ = "C:\XL2AC.xy.xls"
  Const c_sRng$ = "TabellaValori"
  Const c_sTbl$ = "XL2AC xy"
  Const c_sFldSerie$ = "Serie"
  Const c_sFldAsse$ = "Asse"
  Const c_sFldValore$ = "Valore"
  Dim oXlApp      As Excel.Application
  Dim oXlWbk      As Excel.Workbook
  Dim oXlRngVals  As Excel.Range
  Dim oXlRngIRow  As Excel.Range
  Dim oXlRngICol  As Excel.Range
  Dim oXlRng      As Excel.Range
  Dim lRow        As Long
  Dim lCol        As Long
  Dim oAcApp        As Access.Application
  Dim oDaoDbs       As DAO.Database
  Dim oDaoRst       As DAO.Recordset
  Dim oDaoFldSerie  As DAO.Field
  Dim oDaoFldAsse   As DAO.Field
  Dim oDaoFldValore As DAO.Field
  Set oXlApp = New Excel.Application
  Set oXlWbk = oXlApp.Workbooks.Open(c_sWbk)
  Set oXlRngVals = oXlWbk.Names(c_sRng).RefersToRange
  Set oAcApp = Access.Application
  Set oDaoDbs = oAcApp.CurrentDb
  Set oDaoRst _
    = oDaoDbs.OpenRecordset( _
          c_sTbl _
        , DAO.dbOpenTable _
        , DAO.dbFailOnError)
  With oDaoRst.Fields
    Set oDaoFldSerie = .Item(c_sFldSerie)
    Set oDaoFldAsse = .Item(c_sFldAsse)
    Set oDaoFldValore = .Item(c_sFldValore)
  End With
  With oXlRngVals
    For lRow = 2 To .Rows.Count
      Set oXlRngIRow = .Cells(lRow, 1)
      For lCol = 2 To .Columns.Count
        Set oXlRngICol = .Cells(1, lCol)
        Set oXlRng = .Cells(lRow, lCol)
        With oXlRng
          Debug.Print _
              oXlRngICol.Value & ";" _
            ; oXlRngIRow.Value & ";" _
            ; .Value
          oDaoRst.AddNew
          oDaoFldSerie.Value = oXlRngICol.Value
          oDaoFldAsse.Value = oXlRngIRow.Value
          oDaoFldValore.Value = oXlRng.Value
          oDaoRst.Update
        End With
      Next
    Next
  End With
  XL2AC_xy = True
ext:
  On Error Resume Next
  oDaoRst.Close
  oXlApp.DisplayAlerts = False
  oXlApp.Quit
  Set oDaoFldValore = Nothing
  Set oDaoFldAsse = Nothing
  Set oDaoFldSerie = Nothing
  Set oDaoRst = Nothing
  Set oDaoDbs = Nothing
  Set oAcApp = Nothing
  Set oXlRng = Nothing
  Set oXlRngICol = Nothing
  Set oXlRngIRow = Nothing
  Set oXlRngVals = Nothing
  Set oXlWbk = Nothing
  Set oXlApp = Nothing
  Exit Function
erh:
  XL2AC_xy = False
  With Err
    MsgBox .Description, vbCritical, "ERR#" & CStr(.Number)
  End With
  Resume ext
End Function
***************************************
Sicuramente non ho capito come funziona perchè mi da questo errore:
ERRORE DEFINITO DALL'APPLICAZIONE O DALL'OGGETTO
Spiego cosa ho fatto:
Ho creato un file.xls di nome XL2AC.xy.xls salvandolo in C
Ho creato il modulo
ho creato una maschera con un bottone, associato al quale su clic ho scritto
=XL2AC_xy()
Ho creato una tabella TabellaValori con i campi Serie,Asse,Valore
Che Ca...ta faccio?
grazie
ciao

   Const c_sFldValore$ = "Valore"
[...]
    Verifica le seguenti due cose:
        "TabellaValori" e' il nome dell'intervallo dei dati nel foglio
Excel. Hai presente come si assegnano tali nomi? Inserisci > Nome ...
        "XL2AC xy" e' il nome della tabella nel file mdb.
    Risolto?
--
Ciao :o)
Maurizio
--------
?SPQR(C)
 X
--------

     Risolto?
Come pensavo, non impostavo correttamente la TabellaValori.
grazie  Maurizio
ciao

rompo ancora !!!!!!!!!
Se dovessi portare in tabella di access i valori di excel:
      B                  C               D    F
___________________________________
2|  M9  | 03/10/2003 08:09 | 5 |  9|
3|  M8  | 03/10/2003 08:03 | 7 |  3|
4|  M7  | 03/10/2003 07:58 | 4 |  2|
il valore M9 č nella cella B2 m8->b3 m9->b4
la data+ora č nella cella  c2  c3  c4
il valore 5 č nella cella  d2  7->d3  4->d4
colonna E vuota
il valore 9 č nella cella  f2  3->f3  2->f4
la tabella č cosě:
id              chiave primaria
descrizione     testo             per i valori della colonna B
datamisurazione  data/ora   per i valori della colonna C
A               numerico          per i valori della colonna D
B               numerico          per i valori della colonna F
come cambierebbe il codice?
grazie
ciao

 news:dnuba.4445$Lr4.1...@twister2.libero.it...
[...]

    Dovrei andare a vedere l'altro codice ma sono un po' scansafatiche.
Perche' non ci pensi tu e nel quesito proponi le due situazioni (dati
del primo esempio, dati del secondo esempio, codice del primo esempio)
in modo che io (noi) si possa avere sott'occhio in un unico post tutti i
termini della questione senza saltabeccare da un post all'altro? Grazie.


 C   Y   6
Option Compare Database
Option Explicit
Option Base 0
Public Function XL2AC_xy( _
) As Boolean
  On Error GoTo erh
  Const c_sWbk$ = "C:\Progetti\mso\09\XL2AC.xy.xls"
  Const c_sRng$ = "TabellaValori"
  Const c_sTbl$ = "XL2AC xy"
  Const c_sFldSerie$ = "Serie"
  Const c_sFldAsse$ = "Asse"
  Const c_sFldValore$ = "Valore"
  Dim oXlApp      As Excel.Application

  Dim oAcApp        As Access.Application



********************************************
  With oXlRngVals
    For lRow = 2 To .Rows.Count
      Set oXlRngIRow = .Cells(lRow, 1)
      For lCol = 2 To .Columns.Count
        Set oXlRngICol = .Cells(1, lCol)
        Set oXlRng = .Cells(lRow, lCol)
        With oXlRng
          Debug.Print _                                              č
questa la parte da cambiare?
              oXlRngICol.Value & ";" _
            ; oXlRngIRow.Value & ";" _
            ; .Value
          oDaoRst.AddNew
          oDaoFldSerie.Value = oXlRngICol.Value
          oDaoFldAsse.Value = oXlRngIRow.Value
          oDaoFldValore.Value = oXlRng.Value
          oDaoRst.Update
        End With
*********************************************
      Next


  oXlApp.DisplayAlerts = False
  oXlApp.Quit

  Set oAcApp = Nothing

  Exit Function

End Function
Questo č quello che dovrebbe fare:
Se dovessi portare in tabella di access i valori di excel:
      B                  C               D    F
___________________________________
2|  M9  | 03/10/2003 08:09 | 5 |  9|
3|  M8  | 03/10/2003 08:03 | 7 |  3|
4|  M7  | 03/10/2003 07:58 | 4 |  2|
il valore M9 č nella cella B2 m8->b3 m9->b4
la data+ora č nella cella  c2  c3  c4
il valore 5 č nella cella  d2  7->d3  4->d4
colonna E vuota
il valore 9 č nella cella  f2  3->f3  2->f4
la tabella č cosě:
id              chiave primaria
descrizione     testo             per i valori della colonna B
datamisurazione  data/ora   per i valori della colonna C
A               numerico          per i valori della colonna D
B               numerico          per i valori della colonna F
come cambierebbe il codice?
potrebbe andare una cosa del genere
es:
Riga = 2: Colonna = 1
Do While Not oRecSet.EOF
    .Cells(Riga, Colonna) = oRecSet("Destinazione")
   .Cells(Riga, Colonna + 1) = oRecSet("datamisurazione")
   .Cells(Riga, Colonna + 2) = oRecSet("A  ")
    .Cells(Riga, Colonna + 3) = oRecSet("B")
    Riga = Riga + 1
    oRecSet.MoveNext
Loop
oRecSet.Close