Newsgroup: it.comp.appl.access
Titolo: Lentezza con automaz. OLE verso Excel

Sto sfrugugliando una routine sviluppata chissà quanti anni fa che trasferisce dati da Forms di Access, anche filtrate, ad un foglio di Excel (poi crea su di esso formule, grafici, etc.).
L'ho semplificata al massimo lasciando solo l'essenziale (il trasfert dati):
 
---------------------------------------------------------------------------------------------------------------------
  Dim Rst As Recordset
 
  'Variabli Oggetto per Automazione verso Excel
  Dim objExcel As Object
  Dim objWorkbook As Object
  Dim objSheet As Object
 
  Const IDRigaInizio = 1, IDColonnaInizio = 1  'Riga e Colonna di partenza per creazione Dati
  Dim IDRiga As Long, J As Long
 
  On Error GoTo Errore
 
  DoCmd.Hourglass True
 
  '---------------------- Inizializza Automazione OLE verso Excel ----------------------
 
  'Crea Oggetto Excel
  Set objExcel = CreateObject("Excel.Application")
 
  'Crea Oggetto WorkBook
  Set objWorkbook = objExcel.Workbooks.Add
 
  'Crea nuovo Oggetto foglio di lavoro
  Set objSheet = objWorkbook.WorkSheets(1)
  objSheet.Name = Frm.Name
 
  '---------------------- Trasferisce dati in Foglio Excel ----------------------
 
  Set Rst = Frm.RecordsetClone
 
  'Memorizza i dati nel Foglio a partire da cella (IDRigaInizio, IDColonnaInizio)
  IDRiga = IDRigaInizio
 
  'Crea intestazioni con in Nomi dei Campi (in grassetto)
  For J = 0 To Rst.Fields.Count - 1
         objSheet.Cells(IDRiga, IDColonnaInizio + J) = Rst.Fields(J).Name
         objSheet.Cells(IDRiga, IDColonnaInizio + J).Font.Bold = True
  Next J
 
  'Crea dati sottostanti
  Rst.MoveLast: Rst.MoveFirst
 
  While Rst.EOF = False
         IDRiga = IDRiga + 1
 
         For J = 0 To Rst.Fields.Count - 1
                'Se necessario imposta Formato Testo in Cella Excel per prevenire perdite d'informazioni
                If Rst.Fields(J).Type = dbText Then
                       objSheet.Cells(IDRiga, IDColonnaInizio + J).NumberFormat = "@"
                End If
 
                objSheet.Cells(IDRiga, IDColonnaInizio + J) = Rst.Fields(J).Value
         Next J
 
         Rst.MoveNext
  Wend
 
  'Visualizza sessione OLE di Excel
  objExcel.Visible = True
 
  'Chiusura variabili Oggetto
  Rst.Close
  Set Rst = Nothing
  Set objSheet = Nothing
  Set objExcel = Nothing
  Set objWorkbook = Nothing
 
  DoCmd.Hourglass False
  ......
 
------------------------------------------------------------------------------------------------------------------
 
 
Questa roba è stata pensata per piccoli set di Dati (poche migliaia di records al massimo) e ha fatto il suo.
Ma ora opera con volumi di dati assai superiori e le prestazioni sono estramente lente: pare sia .Cells() il responsabile, ma non conosco alternative.
Idee?
 
Saluti pre-natalizi
 
 

Ciao Simone,
io quando uso Automazione per trasferire attuo anche:
 
xlsAPP.ScreenUpdating = False
xlsAPP.Calculation = xlCalculationManual
xlsAPP.EnableEvents = False
 '... (tutto quello che devi fare...)
 xlsAPP.ScreenUpdating = True
 xlsAPP.Calculation = xlCalculationAutomatic
 xlsAPP.EnableEvents = True
 
Non so se è il tuo caso.
@Alex


Ciao Alessandro  ;-)
 
Purtroppo non cambia nulla inibendo l'aggiornamento schermo+gestore eventi, etc.
 
.Cells(x,y)  risulta assai lento nel recepire i valori all'interno del ciclo che vedi, anche in foglio di lavoro vuoto e privo di formule.
 
Personalmente (ma non faccio testo avendo sempre usato Excel in forme elementari) non conosco alternative per ottenere egual risultato in tempi accettabili.
 
Ciao!
 
 
 
 
 


se incolli in una botta sola tutto il tuo recordset
 
Call objExcel.Range("A2").CopyFromRecordset(sql)
 
dove sql è stringa sql
 
e poi le formattazioni delle colonne le fai alla fine in un colpo solo 
per l'intere colonne
 
BFS
 

 per l'intere colonne 
 
Eh, in origine era proprio così (tra l'altro come argomento si passa direttamente il Recordset, che è meglio) ... il fatto è che pure in quel modo le prestazioni sono deludenti, con l'aggravante di non poter inserire una ProgressBar per l'utente in attesa. 
Nel codice che ho postato ho rimosso le righe di gestione della barra di progresso, ma ci sono.
 
Dai feedbacks con @Alex e te deduco che non esistono scappatoie per migliorare la situazione: porteranno pazienza.
 
Saluti da Simone
 

 Saluti da Simone
 
Hai per caso un sw antivirus o simili attivo...?
Prova a verificare ed eventualmente a disabilitarlo per prova a conferma.
 
Lo dico in quanto io ho un problema.molto simile con il sistema CheckPoint... ed ho appurato essere proprio lui.
Purtroppo non ho trovato soluzioni non potendolo disabilitare all'atto pratico.
 
Ciao
@Alex

 Purtroppo non ho trovato soluzioni non potendolo disabilitare all'atto pratico. 
 
Mah, in realtà l'inefficienza del transfert si manifesta su tutti i PC, anche quello che sto usando ora (solo Win-Antivirus a bordo).
Magari è la volta buona che li convinco ad abbandonare accrocchi con Excel, integrando tutto nell'applicativo principale...
 
Saluti da Simone

 Mah, in realtà l'inefficienza del transfert si manifesta su tutti i PC, anche quello che sto usando ora (solo Win-Antivirus a bordo). 
 
Comunque è impressionante la differenza di velocità con l'esportazione tramite DoCmd.OutpuTo 
Una vera scheggia, evidentemente non utilizza Automazione!