插入图片崩溃Excel

时间:2019-06-07 08:43:20

标签: excel vba

我有一个循环代码,可将图片插入A列单元格中。但是,当目录中没有图片时,我无法解决问题。如果没有图片,我的宏崩溃全都不错,请退出程序。

如果我删除错误处理程序,则会收到有关插入类图片的运行时错误“ 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

2 个答案:

答案 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运行时继续下一条语句。

  • 您知道自己在做什么(您知道特定的陈述可以 失败),
  • 您自己处理失败
  • 通过发出激活常规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