Una precisazione su DocmdTrasferSpreadSheet
Hai un problema con Excel? 
Una precisazione su Docmd.TrasferSpreadSheet
di Lelè22 data: 11/04/2014 14:13:31
Come da titolo volevo informare chiunque utilizzi questa funzione di un comportamento che ho osservato. Spero che questa info possa evitare ad altri di perdere del tempo.
A seguire da quanto scritto nella discussione "Excel/Access Problemi Ole"!, messaggio iniziale DoCmd.TransferSpreadSheet è un metodo che permette di importare o esportare Dati da fogli Excel a tabelle Access e viceversa.
Tenete conto però che, nel caso di import da excel, la funzionalità importa il primo foglio della cartella di lavoro (e quindi non il Foglio(1) ma il primo ad essere visualizzato nella cartella).
Questo è quanto mi è capitato di osservare pur dando istruzioni per selezionare un foglio differente.
Infatti il metodo falliva o meglio dava degli import sbagliati e/o segnalava errori sulla tabella target in Access perchè strutturata in maniera differente da quanto lo fossero i dati di import.
Spero possa interessare e dessere utile a qualcuno.
Ciao a tutti
di Mauro data: 14/04/2014 06:21:48
Ciao Lele e grazie dell'informazione.
di scossa data: 14/04/2014 09:23:25
Se non sbaglio, per importare da uno specifico foglio lo devi indicare nel range:
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel3, "TCLIst", sXlsTargetFile, True, "Foglio2!A1:K1000"
o se hai un named-range (global):
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel3, "TCLIst", sXlsTargetFile, True, "DataToExport"
| scossa's web site |
Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw) |
di lelè22 (utente non iscritto) data: 14/04/2014 14:06:36
Beh scossa questo non lo so , ma lo verificherò.. è comunque un informazione in piu che mi verrò utile e non solo a me grazie
di lelè22 (utente non iscritto) data: 14/04/2014 14:09:14
per quanto possa vedere dall' help è possibile indicare un range da cui effettuare l' import, non so se si possa in dicare genericamente il foglio... il range essendo nella maggior parte dei casi variabile a quanto ne so io risulta di difficile scrittura nella forma èper es. "A:100"
di scossa data: 15/04/2014 20:23:11
cit.: "è possibile indicare un range da cui effettuare l' import, non so se si possa indicare genericamente il foglio...."
l'esempio l'avevo fatto:
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel3, "TCLIst", sXlsTargetFile, True, "Foglio2!A1:K1000"
poi sta a te provare e dirci se funziona.
| scossa's web site |
Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw) |
di lelè22 (utente non iscritto) data: 18/04/2014 16:23:25
Scossa cito una tua risposta:
cit " Se non sbaglio, per importare da uno specifico foglio lo devi indicare nel range:
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel3, "TCLIst", sXlsTargetFile, True, "Foglio2!A1:K1000"
o se hai un named-range (global):
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel3, "TCLIst", sXlsTargetFile, True, "DataToExport" ."
Posso chiederti cosa intendi con named-range (Global). Suppongo che tu intenda unà oggetto di tipo Range dichiarato come Pubblico.
Tuttavia questo oggetto esiste in ambiente Excel.. io ho la complicazione del fatto che Gestico il Transfer da Access e dovrei all' interno della istruzione VBA in Access fare riferimento a un oggetto creato e tipico di Excel. non ho idea di come riferirmi ad esso...
Ho provato a inserire genericamente il nome del foglio per indicare il range.. ma non gli è piaciuto per niente.
Ciao e Buona Pasqua a tutti
di scossa data: 18/04/2014 16:37:01
cit.: "Posso chiederti cosa intendi con named-range (Global)."
Intendo un nome definito a livello di cartella di lavoro e non di foglio.
Se tu selezioni sul Foglio1 le celle B5:D10 e nella casella degli indirizzi (quellain alto a sinistra dove appare l'indirizzo della cella) scrivi "Pippo", avrai definito un nome a livello di cartella e quindi con visibilità per tutta la cartella, cioè raggiungibile (ad esempio selezionandolo dalla casella suddetta) anche se sei in un altro foglio.
| scossa's web site |
Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw) |
di Lelè22 data: 23/04/2014 10:23:29
mmm ... Scossa ti sembrerà strano, ma ho qualche difficoltà a far funzionare la cosa.
Ho scritto due funzioncine di test, allegate, allo scopo di verificare la funzionalità di TransferSpreadSheet.
Mi pare che il succo della discussione sia diventata, in realtà, come passare una variabile pubblica di un modulo Excel a una routine Access ( o altro applicativo Office).
Testing è una routine Access scritta per verificare il funzionamento di DoCmd.TransferSpreadSheet.
RangeTester è una routine di EXCEL che calcola l' estensione della variabile rTarget di tipo range;
sFullAddress è una variabile pubblica di tipo stringa che contiene un' indicazione del range in forma letterale, dichiarata tale nel modulo ModDbFunctions del Workbook.
Ho Provato a passare il valore di sFullAddress a Testing in tuitti i modi... facendo o non riferimento al modulo in cui è riportato con o senza virgolette ma niente mi compare sempre il messggio di errore che
il modulo jet di Access non riesce a trovare la variabile...
D' altra parte la routine RangeTester dello stesso modulo viene eseguita senza difficoltà
Per questo dico che la questione si è in qualche modo spostata sul modo di passare le variabili fra applicativi office differenti... questo, forse, riveste interesse più generale che non l' applicazione di DoCmd.TransferSpreadSheet
"TCBACrossRef" è il nome del foglio in cui calcolo il range di interesse.
Sub testing()
Dim xlApp As Excel.Application
Dim wk As Excel.Workbook
Dim sXlsTargetFile As String
sXlsTargetFile = "C:Documents and Settings
ussoDesktopVBA_TOOLSReporting_Bench_for_Access.xls"
On Error Resume Next
Set xlApp = GetObject(, "Excel.Application") 'verifica se esiste un'istanza di excel aperta
Select Case Err.Number
Case 0 ' nessun errore
On Error GoTo 0 ' disabilita controllo degli errori
If xlApp Is Nothing Then Set xlApp = New Excel.Application ' No istanza di Excel
Case 429
On Error GoTo 0 ' disabilita controllo degli errori
Set xlApp = New Excel.Application
Case Else
MsgBox Err.Number
MsgBox Err.Description
On Error GoTo 0 ' disabilita controllo degli errori
End Select
Err.Clear
With xlApp
Set wk = .Workbooks.Open(sXlsTargetFile)
MsgBox wk.Name
.Visible = True
'.Run ("ModDbFunctions.PrepareSheetTCBAIntegrationLevel")
wk.Sheets("TCBACrossRef").Select
.Run ("ModDbFunctions.rangetester")
'wk.Sheets("TCBACrossRef").Select
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel3, "TCBACrossRef", sXlsTargetFile, True, "ModDbFunction!sFullAddress" ' "TCBACrossRef" 'comando di import!
.DisplayAlerts = False
' wk.Close
.DisplayAlerts = True
End With
xlApp.Quit
Set xlApp = Nothing
End Sub
Sub RangeTester()
Dim iNoRowsTargetSheet As Integer
iNoRowsTargetSheet = iRetrieveRowsNo("TCBACrossRef", 2, 2)
Set rTarget = Range(Cells(1, 1), Cells(1 + iNoRowsTargetSheet, 2))
sAddress = rTarget.Address
MsgBox sAddress
sFullAddress = "TCBACrossRef!" & sAddress
MsgBox sFullAddress
End Sub |
di scossa data: 28/04/2014 00:24:34
cit.: "mmm ... Scossa ti sembrerà strano, ma ho qualche difficoltà a far funzionare la cosa. "
Direi che dovresti allegare il file access ed il file excel (ovviamente copie "congruenti" dei file reali) per poter ragionare su qualcosa di concreto e parlare tutti di "mele" e non di "pere".
| scossa's web site |
Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw) |
Vuoi Approfondire?