Excel - 删除行时删除图像

时间:2011-05-13 11:08:33

标签: excel excel-vba vba

我有一个宏从目录中导入图像并将它们放在excel单元格中,这些单元格大小足以适合图像

宏的片段如下: -

'Set the Row Height and Column Width of the thumbnail

Range("A" & CStr(currRow)).RowHeight = ThumbnailSizeRef + 2 

Columns("A").ColumnWidth = (ThumbnailSizeRef - 5) / 5 'Column Width uses a font width setting, this is the formula to convert to pixels

'Add the thumbnail
Set sShape = ActiveSheet.Shapes.AddPicture(Filename:=sFilename, LinktoFile:=msoFalse, SaveWithDocument:=msoTrue, Left:=0, Top:=0, Width:=ThumbnailSizeRef, Height:=ThumbnailSizeRef)

'Set the Left and Top position of the Shape
sShape.Left = Range("A" & CStr(currRow)).Left + ((Range("A" & CStr(currRow)).Width - sShape.Width) / 2)

sShape.Top = Range("A" & CStr(currRow)).Top + ((Range("A" & CStr(currRow)).Height - sShape.Height) / 2)

一切正常。根据需要,图像只在单元格中正确显示。我也可以成功地对单元格进行排序,并且图像可以正确移动。

我遇到的问题是当我删除整行时(右键单击行并删除)...在这种情况下,行删除的图像会向下跳跃并隐藏在下一行的图像后面。

当我删除行时,有没有办法删除图像?

3 个答案:

答案 0 :(得分:5)

您可以将图片属性更改为“使用单元格移动和调整大小”。因此,当您删除行时,您的图像也将被删除。 在Excel 2007中测试。

另一种解决方案是添加评论并在后台填写图片(请参阅此处的详细信息:http://www.excelforum.com/excel-general/569566-embed-image-in-cell.html

答案 1 :(得分:3)

可能有更好的方法,但我可以想到2个解决方法。

  1. 将形状导入单元格时,请使用命名约定命名形状以标识行/列(例如.Name =“ImageX-RowY-ColumnZ”)。然后使用工作表更改事件和此链接Capture Deleted Rows来循环遍历形状并根据已删除的内容删除所需的形状。

  2. 或者,在您的图片中填写评论框,当该行被删除时,评论&图像也消失了

  3. 例如

     Sub test()
     ThumbnailSizeRef = 100
     currRow = 5
     sFilename = "C:\Users\....\Desktop\Untitled.png"
    
     Range("A" & CStr(currRow)).RowHeight = ThumbnailSizeRef + 2
    
     Columns("A").ColumnWidth = (ThumbnailSizeRef - 5) / 5
    
     With Sheet1
        With .Range("A" & currRow)
            .ClearComments
            .AddComment
    
            With .Comment
            .Visible = True
            .Text Text:=""
            .Shape.Left = Sheet1.Range("A" & currRow).Left
            .Shape.Top = Sheet1.Range("A" & currRow).Top
            .Shape.Width = Sheet1.Range("A" & currRow).Offset(0, 1).Left - Sheet1.Range("A" & currRow).Left
            .Shape.Height = Sheet1.Range("A" & currRow).Offset(1, 0).Top - Sheet1.Range("A" & currRow).Top
            .Shape.Fill.UserPicture sFilename
            .Shape.Line.ForeColor.RGB = RGB(255, 255, 255) 'hides connector arrow
    
            End With
    
        End With
    End With
    
    End Sub
    

答案 2 :(得分:1)

这并不完美,但它可能会满足您的需求,或至少让您朝着正确的方向前进。

将此代码放在工作表模块中。当事件更改整行时,它将删除找到的左上角单元格在该行中的第一个形状。如果你要删除一行,这是有效的,但如果你剪切了一行,它也会被触发,这是不希望的。如果你不打算剪切和粘贴行,那么这不是问题。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim pic As Shape
    If Union(Target, Target.EntireRow).Address = Target.Address Then
        For Each pic In ActiveSheet.Shapes
            If pic.TopLeftCell.Row = Target.Row Then
                pic.Delete
                Exit For
            End If
        Next pic
    End If
End Sub