如何使用VBA识别Excel中的“单元格中的图片”(1/2)

Excel 365升级了新功能,支持两种不同的插入图片方式:

  • 放置在单元格中(Place in cell),新功能,此操作插入的图片下文中简称为单元格中的图片
  • 放置在单元格上(Place over cell),悬浮图片,Excel以前版本一直支持的功能

两种方式在Excel中的展示效果如下图所示。

如果希望使用VBA操作单元格中的图片,非常遗憾的是对象模型中并未提供相应的对象,并且该对象不隶属与Shapes或者Pictures对象集合。这就带来的一个棘手的问题,如何使用VBA代码判断一个单元格中是否包含单元格中的图片

示例代码如下:

vb 复制代码
Function HasPicInCell(rCell As Range) As Boolean
    Dim ShpCnt As Long, Sht As Worksheet
    Set Sht = rCell.Parent
    ShpCnt = Sht.Shapes.Count
    rCell.PlacePictureOverCells
    If Sht.Shapes.Count = 0 Then
        HasPicInCell = False
    Else
        HasPicInCell = (ShpCnt < Sht.Shapes.Count)
        Dim Shp: Set Shp = Sht.Shapes(Sht.Shapes.Count)
        ActiveCell.Select
        Shp.Select
        Shp.PlacePictureInCell
    End If
End Function

【代码解析】

第3行代码获取单元格所在工作表对象。

第4行代码获取Shapes对象个数。

第5行代码将单元格中的图片转换为单元格上的图片(Shape对象),如果不存在单元格中的图片,此行代码并不产生运行时错误,因此无法使用错误捕获方式来实现此功能。

第6行代码判断工作表的Shapes对象个数是否为零,如果满足条件,第7行代码返回False,即不存在单元格中的图片

否则,第9行代码设置返回值,如果第5行代码执行后,Shapes对象个数增加,说明存在单元格中的图片

第10行代码获取最后一个Shape对象,即被转换单元格中的图片

第11行代码看到多余,笔者使用Excel 365 Version 2411 (Build 18210.20000),如果不增加此行代码,将导致Excel崩溃,估计是Excel的Bug。

第12行代码选中Shape对象。

第13行代码将Shaped对象转换为单元格中的图片

使用如下代码核查A1单元格是否存在单元格中的图片

复制代码
Sub Demo()
    Dim c As Range
    Set c = Range("A1")
    Debug.Print IIf(HasPicInCell(c), "", "不") & "存在单元格中的图片"
End Sub
相关推荐
Non-existent9879 小时前
WPS批量清理单元格空白字符的4种方法-异常数字格式处理-实战
excel·wps
Channing Lewis13 小时前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel
jarreyer15 小时前
【数据分析绘图】excel绘图和bi工具区别
数据挖掘·数据分析·excel
chatexcel16 小时前
ChatExcel Max使用教程:图片、PDF、网页与复杂Excel的一站式数据分析
数据分析·pdf·excel
cngkqy16 小时前
excel从某一列中用match筛选匹配的数据
excel
qq_5469372716 小时前
Excel批量转PDF_Word_图片,支持自动合并报表,效率翻倍。
pdf·word·excel
ai_coder_ai16 小时前
在自动化脚本中操作excel文件
运维·自动化·excel
三千花灯17 小时前
【Playwright】 自动化测试之参数化登录(Excel/CSV 数据源)
人工智能·机器学习·excel
罗政17 小时前
AI工作流实现Excel全自动化(支持SQL)-案例:医院门诊排班表
人工智能·自动化·excel
小妖66617 小时前
excel 怎么在单元格内容自动加上一段文字不能用公式
excel·vba