如果我删除错误处理程序,则会收到有关插入类图片的运行时错误“ 1004”。
我在下一行上有一个错误恢复履历,但是这也无济于事,如果ppath(pictures path)<>“”也可以继续。我虽然可以帮上忙,但有一段时间它却无法正常工作。
Sub insert_foto()
Dim i As Long
Dim ppath As String
Dim lastrow As Long
Dim ws As Worksheet
Application.ScreenUpdating = False
Set ws = ThisWorkbook.Worksheets("RS")
lastrow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
With ws
ws.Range("A6:A" & lastrow).RowHeight = 90
End With
On Error Resume Next
For i = 6 To lastrow
'photo in column A
ppath = "http://aa/bb/" & CStr(Cells(i, 2).Value & "-F1.jpg")
If ppath <> "" Then
With ActiveSheet.Pictures.Insert(ppath)
With .ShapeRange
.LockAspectRatio = msoFalse
.Width = 50
.Height = 85
End With
.Left = ActiveSheet.Cells(i, 1).Left + (ActiveSheet.Cells(i, 1).Width - .Width) / 2
.Top = ActiveSheet.Cells(i, 1).Top + (ActiveSheet.Cells(i, 1).Height - .Height) / 2
.Placement = 1
.PrintObject = True
End With
End If
Next
Application.ScreenUpdating = True
End Sub
答案 0 :(得分:0)
您可以使用“目录”检查文件是否存在。 如果返回空字符串,则该字符串不存在。 所以我会这样做:
If ppath <> "" and Dir(ppath) <> "" Then
如果即使文件存在也崩溃,则可能需要在插入之前计算图纸上的图片数量,然后尝试插入新的图片,直到图片数量大于实际数量为止。 (Doevents可帮助您从代码中转义,以防万一插入后多次插入无法正常工作。)
NrOfPicsBeforeInsert = ActiveSheet.Pictures.Count
On Error Resume Next
Do While NrOfPicsBeforeInsert = ActiveSheet.Pictures.Count
ActiveSheet.Pictures.Insert ppath
DoEvents
Loop
On Error GoTo 0
此方法可能需要引用以另一种方式添加的最后一张图片:
With ActiveSheet.Pictures(ActiveSheet.Pictures.Count)
With .ShapeRange
.LockAspectRatio = msoFalse
.Width = 50
.Height = 85
End With
.Left = ActiveSheet.Cells(i, 1).Left + (ActiveSheet.Cells(i, 1).Width - .Width) / 2
.Top = ActiveSheet.Cells(i, 1).Top + (ActiveSheet.Cells(i, 1).Height - .Height) / 2
.Placement = 1
.PrintObject = True
End With
答案 1 :(得分:0)
On Error Resume Next
是一个非常愚蠢的命令。如果失败,它将强制VBA
运行时继续下一条语句。
On Error Goto 0
,将范围限制为仅可能失败的单个语句。否则,您将隐藏所有运行时错误,最后,您感到惊讶的是为什么您的程序无法运行,也不知道发生了什么。
在下面的代码中,我将范围限制为将图像插入到工作表的语句,并检查它是否成功。否则,我的变量将为Nothing
,并且我知道某些操作失败。
通常,在处理文件时,可以使用Dir
命令检查文件是否存在,但是在您的情况下,您想使用http
来读取图像,但这不起作用与Dir
。无论如何,无论图像来自何处,除了找不到文件之外,可能还有其他原因为什么无法加载图像(访问权限,文件不是有效的图像...)。 / p>
您的代码还有另一个问题。您正在声明工作表变量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