Некоторые указатели:
- Я не думаю, что
On Error Resume Next
служит какой-либо цели в вашем ErrHandle
- Поместите
Workbooks("SHARE PRICE CREATOR.xlsb").Sheets("links")
в переменная и квалифицируйте вызовы диапазона с помощью этой - Избегайте неявных
Activesheet
ссылок - Используйте
Err.Clear
, чтобы очистить ошибку - Вам понадобится
Exit Sub
для успешного завершения все задачи перед запуском в обработчик ошибок - Вам нужна стратегия выхода, чтобы избежать возможности бесконечного l oop. Я лично использовал бы go со стратегией максимального числа повторений перед переходом на следующий URL, а также ожидал бы каждые x запросов, чтобы быть хорошим пользователем сети
- Обычно избегайте эффекта спагетти-кода
GoTo
- Объявите все свои переменные с их типом. Удалите, если не используется. Используйте
Option Explicit
, чтобы применить
Обычно:
Мне не нравится GoTos
, так как это затрудняет чтение и отладку кода. См. Возможность переписывания с дальнейшими комментариями ниже:
TODO:
Рефакторинг кода, чтобы он был менее вложенным с использованием вспомогательных функций / подпрограмм, т.е. был более модульным.
Код:
Option Explicit 'Use Option Explicit
Public Sub RetrieveYahooData()
Const MAX_RETRIES As Long = 3
Dim i As Long, ws As Worksheet, lastRow As Long 'use Long
Dim wbMain As Workbook, wb As Workbook, xUrl As String 'declare xUrl
Dim xtable As String 'temp assignment.
Start 'what subs are these?
Set wbMain = Workbooks("SHARE PRICE CREATOR.xlsb") ''Put in a variable. This assumes is open.
Set ws = wbMain.Worksheets("links")
lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row 'You want to count from row 2 I think
If lastRow >= 2 Then
For i = 2 To lastRow
If i Mod 100 = 0 Then Application.Wait Now + TimeSerial(0, 0, 5) 'every n e.g. 100 requests have a pause
numberOfTries = 0
With ws
xtable = .Cells(i, 5).Value '?What is xTable and its datatype? _
Declare it and use Option Explicit at top of code. _
Also, where will it be used?
xUrl = .Cells(i, 4).Value
If xUrl <> vbNullString Then
Do
DoEvents
On Error Resume Next
Set wb = Workbooks.Open(xUrl, Format:=6, DELIMITER:=",") 'add other tests for valid url?
On Error GoTo 0
If Not wb Is Nothing Then 'remember to save and exit do
wb.SaveAs wbMain.Path & "\" & wb.Name, AccessMode:=xlExclusive, ConflictResolution:=Excel.XlSaveConflictResolution.xlLocalSessionChanges 'Credit to @Sorceri https://stackoverflow.com/a/14634781/6241235
wb.Close True
Exit Do
Else
Application.Wait Now + TimeSerial(0, 0, 5)
End If
Loop While numberOfTries < MAX_RETRIES
End If
End With
ws.Cells(i, 6) = IIf(wb Is Nothing, "FAIL", "OK")
Set wb = Nothing
Next
End If
ENDING
End Sub