2017-07-17 4 views
1

J'ai un sous qui ouvre Excel, crée une connexion à ma feuille Google, puis utilise une instruction d'insertion pour ajouter les données à ma base de données Access.
Cela fonctionne, mais est incroyablement lent (prend ~ 30sec pour obtenir 6 disques)Lents téléchargements à l'aide de MS Access

Private Sub ImportFromGoogleSheet() 
On Error GoTo ErrHandler 

Dim appXL As Object 'Excel.Application 
Dim wbk As Object 'Excel.Workbook 
Dim wst As Object 'Excel.Worksheet 
Dim Timer As Integer 

Set appXL = CreateObject("Excel.Application") 
appXL.Visible = True 'If you want to see the excel sheet - enable this row (good for debugging) 
Set wbk = appXL.Workbooks.Add 
Set wst = wbk.Worksheets(1) 

With wst 
    .QueryTables.Add Connection:= _ 
    "URL;https://connection to site here ", Destination:=.Range("$A$1") 
    .Name = "Worksheet1" 

    .QueryTables(1).Refresh 
End With 

'Wait for google-doc data to be downloaded. 
Timer = 0 
Do While Left(wst.cells(1, 1), 12) = "ExternalData" And Timer < 40 
    'Sleep 250 ' Wait 0.25 sec before re-checking data 
    'Timer = Timer + 1 
Loop 

Dim rownum As Integer 
rownum = 4 
wst.cells(rownum, 2).Select 
Do While (wst.cells(rownum, 2).Value <> "") 
    Dim sqlStr As String 
    Dim ts, dol As Date 
    Dim sn, lt As String 
    Dim nod As Integer 
    ts = wst.cells(rownum, 2).Value 
    dol = wst.cells(rownum, 5).Value 
    sn = wst.cells(rownum, 3).Value 
    lt = wst.cells(rownum, 4).Value 
    nod = wst.cells(rownum, 6).Value 

    sqlStr = "INSERT INTO table VALUES" 
    DoCmd.SetWarnings False 
    DoCmd.RunSQL sqlStr 
    DoCmd.SetWarnings True 

    rownum = rownum + 1 
Loop 

wbk.Close SaveChanges:=False 'Don't save excel sheet 
appXL.Quit 
Exit Sub 

ErrHandler: 
If (Err.Number = 3022) Then 
    Debug.Print "Record Already Exists" 
    Resume 
End If 
Debug.Print Err.Description & Err.Number 

wbk.Close SaveChanges:=False 'Don't save excel sheet 
appXL.Quit 
End Sub 

J'ai essayé d'enlever la première boucle while mais rien importé

Y at-il quelque chose dans le code ralentir ou est-ce juste un processus lent?

* Je sais que cela pourrait être approprié pour l'examen du code, mais je suis plus intéressé à savoir pourquoi sa lente que si son mauvais code de

** Modifier pour ajouter la sortie de débogage et de nouveau tout

Debug.Print "before wait while " & Now 
'Wait for google-doc data to be downloaded. 
lTimer = 0 
Do While Left(wst.cells(1, 1), 12) = "ExternalData" And lTimer < 40 
    Debug.Print "Wait loop " & lTimer 
    Debug.Print "during wait while " & Now 
    Sleep 250 ' Wait 0.25 sec before re-checking data 
    DoEvents 
    lTimer = lTimer + 1 
Loop 

Debug.Print "after wait while" & Now 

code fin

start time 18/07/2017 9:06:58 a.m. 
before connect 18/07/2017 9:06:58 a.m. 
before wait while 18/07/2017 9:07:00 a.m. 
Wait loop 0 
during wait while 18/07/2017 9:07:00 a.m. 
Wait loop 1 
during wait while 18/07/2017 9:07:00 a.m. 
Wait loop 2 
during wait while 18/07/2017 9:07:01 a.m. 
Wait loop 3 
during wait while 18/07/2017 9:07:01 a.m. 
Wait loop 4 
during wait while 18/07/2017 9:07:01 a.m. 
Wait loop 5 
during wait while 18/07/2017 9:07:01 a.m. 
Wait loop 6 
during wait while 18/07/2017 9:07:02 a.m. 
Wait loop 7 
during wait while 18/07/2017 9:07:02 a.m. 
Wait loop 8 
during wait while 18/07/2017 9:07:02 a.m. 
Wait loop 9 
during wait while 18/07/2017 9:07:02 a.m. 
Wait loop 10 
during wait while 18/07/2017 9:07:03 a.m. 
Wait loop 11 
during wait while 18/07/2017 9:07:03 a.m. 
after wait while 18/07/2017 9:07:28 a.m. 
+0

Avez-vous essayé chronométrer la différentes sections? Combien de temps faut-il pour terminer le téléchargement ou effectuer l'insertion? –

+0

Pas exactement, mais j'ai mis un point d'arrêt avant la boucle d'insertion et presque toute l'attente s'est produite avant ce point d'arrêt – Liamck27

+0

Donc, il semble que le problème est le web fetch de Google: difficile de dire comment accélérer cela. –

Répondre

1

J'ai trouvé un autre problème où seulement 100 enregistrements ont été téléchargés et la solution pour cela a également résolu le problème de vitesse.

J'ai trouvé la solution here.

Il dit que vous avez besoin de changer le format du lien de
https://docs.google.com/spreadsheets/d/YOURSPREADSHEET/edit?usp=sharing
à
https://spreadsheets.google.com/tq?tqx=out:html&tq=&key=YOURSPREADSHEET&gid=1

qui il change d'une vue modifiable à une vue plus fondamental

0

Utilisez pour connaître les pièces qui prennent réellement du temps. How to debug VBA code

Timer est une fonction dans Access, ne l'utilisez pas comme nom de variable.

Votre boucle en attente doit avoir un appel Sleep et un appel DoEvents pour éviter d'accaparer votre CPU.

Private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long) 

'Wait for google-doc data to be downloaded. 
lTimer = 0 
Do While Left(wst.cells(1, 1), 12) = "ExternalData" And lTimer < 40 
    Debug.Print "Wait loop " & lTimer ' Ctrl+g shows output 
    Sleep 250 ' Wait 0.25 sec before re-checking data 
    DoEvents 
    lTimer = lTimer + 1 
Loop 

Si cela ne vous aide pas, vous allez probablement devoir vivre avec.