A seguir estão as funções vba IsPictureInCell e CopyCellPictureToClipboard. Eu apreciaria suas modificações sugeridas para essas duas funções para que elas funcionem corretamente com imagens bloqueadas em células.
' Checks if a picture exists in the specified cell
Function IsPictureInCell(Cell As Range) As Boolean
Dim shp As Shape, shpRange As Range
For Each shp In Cell.Parent.Shapes
Set shpRange = Cell.Parent.Range(shp.TopLeftCell, shp.BottomRightCell)
If Not Intersect(shpRange, Cell) Is Nothing Then
IsPictureInCell = True
Exit Function
End If
Next
End Function
' Copies pic to clipboard if the Cell contains a picture
Function CopyCellPictureToClipboard(Cell As Range) As Boolean
On Error Resume Next
Dim shp As Shape
For Each shp In Cell.Parent.Shapes
If Not Intersect(shp.TopLeftCell, Cell) Is Nothing Then
shp.Copy
CopyCellPictureToClipboard = True
Exit Function
End If
Next
CopyCellPictureToClipboard = False
End Function
Até onde eu sei, não há nenhuma propriedade especial que determine se uma célula contém uma imagem como conteúdo (na célula, não um objeto de forma). Você só pode usar a propriedade Range.HasRichDataType , que neste caso é igual a True . Mas essa propriedade foi criada principalmente para identificar tipos de dados vinculados, portanto, os dados vinculados também devem ser excluídos. No total, obteremos a função:
Function HasImage(rng As Range) As Boolean
HasImage = rng.HasRichDataType And rng.LinkedDataTypeState = 0
End Function
Enquanto isso, ela pode ser usada até que os criadores do Excel criem algo novo.
Ao converter uma imagem em uma célula em uma imagem sobre células (um objeto), essa função reage imediatamente, enquanto a função IsPictureInCell , que verifica a existência de um objeto em uma célula, requer um recálculo da planilha ( Ctrl+Alt+F9 ).
Explicação da imagem: PRAWDA = TRUE , FAŁSZ = FALSE