Discussione:
[ot] esportare da access in excel
(troppo vecchio per rispondere)
Marco
2006-11-03 22:52:28 UTC
Permalink
Esporto una tabella da access ad excel con
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, _
"nometabella", CurrentProject.Path & "\nomefilexls", True, ""

La tabella contiene anche un campo data con date antecedenti al 1900 es
03/04/1886.

in access c'è una tabella di errore ed in excel la cella che dovrebbe
contenere la data è vuota.
E' un problema di access o di excel?
C'è un artificio per risolvere la questione?

grazie
eliano
2006-11-03 23:18:02 UTC
Permalink
Post by Marco
Esporto una tabella da access ad excel con
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, _
"nometabella", CurrentProject.Path & "\nomefilexls", True, ""
La tabella contiene anche un campo data con date antecedenti al 1900 es
03/04/1886.
in access c'è una tabella di errore ed in excel la cella che dovrebbe
contenere la data è vuota.
E' un problema di access o di excel?
C'è un artificio per risolvere la questione?
grazie
Ciao Marco.
Forse è meglio se ti rivolgi al NG che tratta access; comunque excel
dovrebbe considerare quella data come testo.
Ricordo comunque che era una bella giornata. :-))
Non credo che ti possa servire, ma questo è stato segnalato qualche tempo
fa' da Fernando (credo):
http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b245104

eliano
elby
2006-11-04 01:30:28 UTC
Permalink
Post by Marco
Esporto una tabella da access ad excel con
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, _
"nometabella", CurrentProject.Path & "\nomefilexls", True, ""
La tabella contiene anche un campo data con date antecedenti al 1900 es
03/04/1886.
in access c'è una tabella di errore ed in excel la cella che dovrebbe
contenere la data è vuota.
E' un problema di access o di excel?
C'è un artificio per risolvere la questione?
grazie
Ciao Marco
In excel si può importare con ADO oppure con Microsoft Query una
tabella di Access . In tal caso le date antecedenti al 1/1/1900 vengono
importate come date negative ( rappresentate da una serie di # ). Nella
barra della formula si legge il numero seriale negativo. Per esempio
l'importazione di 01/02/1836 sarà rappresentato da -23343. In questo
modo si possono fare calcoli tra date. Poichè VBA ( non Excel )
riconosce i numeri seriali negativi corrispondenti fino al 01/01/0100 (
-657434) si può trasformare in testo le date.
Io mi sono creato una UDF:

Public Function DataPrima1900InTesto(NumeroSeriale As Long) As String
If NumeroSeriale > -657435 Then
DataPrima1900InTesto = CStr(Format(NumeroSeriale, "dd-mmm-yyyy"))
End If
End Function

Ovviamente con le date, così rappresentate, non ci puoi fare dei
conti.
Comunque, vi sono add-inn che risolvono questi problemi
http://j-walk.com/ss/excel/usertips/tip028.htm

Tornando alle vie usuali:
Dipende dalla tua dimestichezza nell'uso del VBA di Excel oppure di
Access, la scelta se esportare i dati da Access con Automation via ADO
opp DAO oppure importarli in Excel via ADO / DAO (VBA obbligatorio )
opp con Microsoft Query ( VBA opzionale ).
Fammi sapere se hai risolto
Ciao elio
Marco
2006-11-06 11:17:01 UTC
Permalink
Post by eliano
Ciao Marco
Ciao Elio
Post by eliano
In excel si può importare con ADO oppure con Microsoft Query una
tabella di Access . In tal caso le date antecedenti al 1/1/1900 vengono
importate come date negative ( rappresentate da una serie di # ). Nella
barra della formula si legge il numero seriale negativo. Per esempio
l'importazione di 01/02/1836 sarà rappresentato da -23343. In questo
modo si possono fare calcoli tra date. Poichè VBA ( non Excel )
riconosce i numeri seriali negativi corrispondenti fino al 01/01/0100 (
-657434) si può trasformare in testo le date.
Public Function DataPrima1900InTesto(NumeroSeriale As Long) As String
If NumeroSeriale > -657435 Then
DataPrima1900InTesto = CStr(Format(NumeroSeriale, "dd-mmm-yyyy"))
End If
End Function
Non ho capito come si usa
Post by eliano
Dipende dalla tua dimestichezza nell'uso del VBA di Excel oppure di
Access, la scelta se esportare i dati da Access con Automation via ADO
opp DAO oppure importarli in Excel via ADO / DAO (VBA obbligatorio )
opp con Microsoft Query ( VBA opzionale ).
Sarebbe interessante vedere come funziona una esportazione aprendo un
recorset... ma non la so scrivere.
Post by eliano
Fammi sapere se hai risolto
Una soluzione proposta nel newsgroup di access è di trasformare le date in
testo ed esportarle con il TransferSpreadsheet
Post by eliano
Ciao elio
ciao
elby
2006-11-07 00:50:05 UTC
Permalink
Post by Marco
[Cut...]
Public Function DataPrima1900InTesto(NumeroSeriale As Long) As String
If NumeroSeriale > -657435 Then
DataPrima1900InTesto = CStr(Format(NumeroSeriale, "dd-mmm-yyyy"))
End If
End Function
Non ho capito come si usa
Copia la Public Function....End Function in un modulo standard di una
cartella di lavoro di Excel. Ora la funzione è disponibile con
scrittura diretta nella barra della formula o con il comando Inserisci
Funzione ( categoria Definite dall' Utente ). Basta scrivere per es in
D2:
= DataPrima1900InTesto(B2) posto che in B2 vi sia un numero negativo
tra -1 e - 657434
ovviamente al posto del riferimento di cella ci può essere un numero
negativo.
Post by Marco
Dipende dalla tua dimestichezza nell'uso del VBA di Excel oppure di
Access, la scelta se esportare i dati da Access con Automation via ADO
opp DAO oppure importarli in Excel via ADO / DAO (VBA obbligatorio )
opp con Microsoft Query ( VBA opzionale ).
Sarebbe interessante vedere come funziona una esportazione aprendo un
recorset... ma non la so scrivere.
Una delle possibili soluzioni ( esportazione da Access a Excel via
Automation con accesso ai Dati con DAO; assicurarsi che sia caricata la
libreria di Excel e di DAO ):

Option Compare Database
Option Explicit
Sub EsportaAdExcelViaDAO()
Dim iCols As Integer
Dim appExcel As Object
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim WB As Object
Set db = CurrentDb
Set rst = db.OpenRecordset("tabella1") ' << da cambiare
On Error Resume Next
Set appExcel = GetObject(, "Excel.Application")
If Err.Number = 429 Then
On Error GoTo 0
Set appExcel = CreateObject("Excel.Application")
End If
On Error GoTo 0
Set WB = appExcel.Workbooks.Add
With WB.Sheets(1)

For iCols = 0 To rst.Fields.Count - 1
.Cells(1, iCols + 1).Value = rst.Fields(iCols).Name
Next
.Range("A2").CopyFromRecordset rst

.Range(.Cells(1, 1), _
.Cells(1, rst.Fields.Count)).Font.Bold = True
.Range(.Cells(1, 1), _
.Cells(1, rst.Fields.Count)).EntireColumn.AutoFit
End With

Workbooks(WB.Name).SaveAs Filename:="Tabella2.xls" '<< da cambiare
appExcel.Visible = True

rst.Close
Set rst = Nothing
Set appExcel = Nothing
End Sub

N.B. ho potuto verificare che anche un semplice copia della tabella in
Access con un copia in Excel trasferisce anche le date antecedenti al
1900 come numeri seriali negativi
Post by Marco
Fammi sapere se hai risolto
Una soluzione proposta nel newsgroup di access è di trasformare le date in
testo ed esportarle con il TransferSpreadsheet
In tal caso non potrai fare conti tra le date perchè avresti bisogno
di una conversione inversa che ti restituisce il numero seriale
negativo tipo Clng(#01-feb-1836#). Se non ti aggrada l'esportazione con
il codice precedente potresti farti una query con una colonna calcolata
che converte le date in numeri seriali e solo dopo applicare a questa
il metodo TransferSpreadsheet.
Post by Marco
ciao
Ciao Elio

Continua a leggere su narkive:
Loading...