On Error Resume Next
довольно глупая команда. Это заставит среду выполнения VBA
продолжить выполнение следующего оператора, если что-то не получится Вы должны использовать его, только если
- вы знаете, что делаете (вы знаете, что конкретное утверждение может
не в состоянии),
- Вы справляетесь с ошибкой самостоятельно
- вы ограничиваете область действия только одним оператором, который может завершиться ошибкой, выполнив оператор
On Error Goto 0
, который активирует обычную обработку ошибок VBA.
В противном случае вы будете скрывать все ошибки времени выполнения, и в конце вы будете удивлены, почему ваша программа не работает, и понятия не имеете, что происходит.
В следующем коде я ограничиваю область утверждением, где изображение вставляется в лист, и проверяю, было ли оно успешным. Если нет, моя переменная будет Nothing
, и я знаю, что что-то не получилось.
Обычно при работе с файлами вы можете проверить его наличие с помощью Dir
-команды, но в вашем случае вы хотите прочитать изображения, используя http
, а это не работает с Dir
, В любом случае, независимо от того, откуда исходит изображение, могут быть и другие причины, чем файл не найден , почему изображение не может быть загружено (права доступа, файл не является допустимым изображением ...).
Есть еще одна проблема с вашим кодом. Вы объявляете переменную листа ws
(что хорошо), но вы ее не используете (это плохо). Вы не должны работать с ActiveSheet
- это часто приводит к ошибкам, и нет необходимости, чтобы лист был active . Я добавил использование переменной ws
. Часто вместо того, чтобы писать что-то вроде ws.Cells
, используется выражение With
(в этом случае вы можете написать .Cells
, но не забывайте начальную точку!), Но в этом примере у нас уже есть 2 вложенный With
, а введение другого приведет к путанице.
Итак, вот код. Как видите, я сохраняю результат Insert
в промежуточной переменной и проверяю, установлен ли он.
For row = 6 To lastrow
Dim ppath As String
'photo in column A
ppath = "http://aa/bb/" & CStr(ws.Cells(row, 2).Value & "-F1.jpg")
If ppath <> "" Then
Dim pic As Picture
On Error Resume Next ' The next statement may fail
Set pic = ws.Pictures.Insert(ppath) ' Try to insert image
On Error GoTo 0 ' Back to default error handling
If pic Is Nothing Then
ws.Cells(row, 1) = "Could not load " & ppath
Else
With pic
With .ShapeRange
.LockAspectRatio = msoFalse
.Width = 50
.Height = 85
.Left = ws.Cells(row, 1).Left + (ws.Cells(row, 1).Width - .Width) / 2
.Top = ws.Cells(row, 1).Top + (ws.Cells(row, 1).Height - .Height) / 2
End With
.PrintObject = True
.Placement = 1
End With
Set pic = Nothing
End If
End If
Next