ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1691|回复: 7

[求助] 真奇妙!为什么这个“批量转换为内嵌图片”的代码运行一次只能转换一个图片呢?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-5-12 14:36 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
为什么运行一次只能转换一个图片呢?

Sub Shapes2oInlineShapes()
'批量转换为内嵌图片
    Dim oshap As Shape

    '转换前
    Debug.Print ActiveDocument.Shapes.Count

    For Each oShape In ActiveDocument.Shapes
        oShape.ConvertToInlineShape
    Next

    '转换后
    Debug.Print ActiveDocument.InlineShapes.Count

End Sub

行政管理中心-张敬B023.rar

68.26 KB, 下载次数: 16

TA的精华主题

TA的得分主题

发表于 2017-5-12 19:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub Shapes2oInlineShapes()
    With ActiveDocument
        For i = .Shapes.Count To 1 Step -1
            .Shapes(i).ConvertToInlineShape
        Next
    End With
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-5-13 10:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
多谢,可以解决问题。但我的语句我的语句不成功的原因是什么呢?还有如下写法也不行:
Sub Shapes2InlineShapes()
'批量转换为内嵌图片
    Dim oshap As Shape
    '转换前
    Debug.Print ActiveDocument.Shapes.Count
    With ActiveDocument
        For i = 1 To .Shapes.Count
            .Shapes(i).ConvertToInlineShape
        Next
    End With

    '转换后
    Debug.Print ActiveDocument.InlineShapes.Count
End Sub

TA的精华主题

TA的得分主题

发表于 2017-5-13 11:52 | 显示全部楼层
word的问题,具体什么原因说不上,但是倒序处理是经典解决方案。

TA的精华主题

TA的得分主题

发表于 2017-5-13 23:38 | 显示全部楼层
本帖最后由 dafanshu1 于 2017-5-13 23:55 编辑
FENGJUN 发表于 2017-5-13 10:26
多谢,可以解决问题。但我的语句我的语句不成功的原因是什么呢?还有如下写法也不行:
Sub Shapes2InlineS ...


楼主可以试试在在 .Shapes(i).ConvertToInlineShape前面加多句.Shapes(i).Select,再按F8逐句执行,就可清楚地看到每次循环VBA是怎样执行的。在此我做了一个简单附件,以便观察研究。

对于for循环,其实可以这样理解:当执行了第1次后进入第2次,i 就由1变成2了,因原Shapes(1)已变成嵌入型,所以现时文档中的Shapes(1)就是执行前原文档的Shapes(2),但此时是对当前文档的第2个对象Shapes(2)执行,从而就把现时文档的Shapes(1)落下了,再到下次循环就依此类推,因此最终 i 会超出当前文档的Shapes数量而出错。

对于for each循环,也可以在oShape.ConvertToInlineShape前加一句oShape.Select,按F8逐句执行来观察,发现其执行规律与for循环完全一样,只不过是不会像for循环那样死板地循环至出错,一超出范围就自动跳出循环。

Doc1.rar

11.81 KB, 下载次数: 12

TA的精华主题

TA的得分主题

发表于 2017-5-14 10:19 | 显示全部楼层
dafanshu1 发表于 2017-5-13 23:38
楼主可以试试在在 .Shapes(i).ConvertToInlineShape前面加多句.Shapes(i).Select,再按F8逐句执行,就 ...

你解释很到位!用do循环和倒序for循环就能解决此类问题:

Sub do1()
    With ActiveDocument
        Do While .Shapes.Count <> 0
            .Shapes(1).ConvertToInlineShape
        Loop
    End With
End Sub
Sub for1()
    With ActiveDocument
        For i = .Shapes.Count To 1 Step -1
            .Shapes(i).ConvertToInlineShape
        Next
    End With
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-5-15 09:38 | 显示全部楼层
dafanshu1 发表于 2017-5-13 23:38
楼主可以试试在在 .Shapes(i).ConvertToInlineShape前面加多句.Shapes(i).Select,再按F8逐句执行,就 ...

多谢解答。只是个坑,很多人还不知道

TA的精华主题

TA的得分主题

发表于 2017-5-15 23:31 | 显示全部楼层
duquancai 发表于 2017-5-14 10:19
你解释很到位!用do循环和倒序for循环就能解决此类问题:

Sub do1()

谢谢杜兄!
我在工作中常用到的却是对所选中的多个图形转换为嵌入型,利用杜兄的宏,本想只是将ActiveDocument改成Selection,将Shapes改成ShapeRange就行了,但实际发生了意外:

执行do1宏,对doc文档可行,而对docx文档却只能转换第1个图形。

执行for1宏,对doc文档,会将其他未选中的图形转换成嵌入型,已选中的却未转换,但按F8逐语句执行反而达到正确效果,真奇怪!对docx文档就直接弹出错误了。

不知杜兄有何高见?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-13 02:34 , Processed in 0.029601 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表