ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

使用VBA如何把WORD中的图片另存为文件?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-2-22 07:56 | 显示全部楼层

TO 守柔:

现在的代码有的时候可以生成图片了,有的时候还不行,甚至把WORD中的图片都给删掉了!不怎么稳定!

TO button:

请楼上给个连接好吗?

TA的精华主题

TA的得分主题

发表于 2005-2-22 13:16 | 显示全部楼层

chijanzen先生的例子:

http://www.vba.com.tw/VBAFILE/Shape/C0008.htm

TA的精华主题

TA的得分主题

发表于 2005-2-22 15:05 | 显示全部楼层

TO button:

谢谢!已经可以完成这个保存图片的工作了

TO 守柔:

谢谢斑竹这段时间一直关心这个帖子,帮忙解决问题!

代码如下:

声明: Private Declare Function OpenClipboard Lib "User32" (ByVal hWnd As Long) As Long Private Declare Function CloseClipboard Lib "User32" () As Long Private Declare Function GetClipboardData Lib "User32" (ByVal uFormat As Long) As Long Private Declare Function CopyEnhMetaFileA Lib "Gdi32" (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long Private Declare Function DeleteEnhMetaFile Lib "Gdi32" (ByVal hdc As Long) As Long

过程:

public sub SavePic()

Application.ScreenUpdating = False Dim WordFilePath WordFilePath = ActiveDocument.Path & "\" & ActiveDocument.Name Dim WordFileName WordFileName = Left(ActiveDocument.Name, InStr(ActiveDocument.Name, ".") - 1) Dim aShape As InlineShape, I As Integer, PicName As String For Each aShape In ActiveDocument.InlineShapes I = I + 1 PicName = ActiveDocument.Path & "\" & WordFileName & I & ".jpg" aShape.Select Selection.Copy OpenClipboard 0 DeleteEnhMetaFile CopyEnhMetaFileA(GetClipboardData(14), PicName) CloseClipboard Next aShape

Application.ScreenUpdating = True

end sub

[此贴子已经被作者于2005-2-22 15:05:53编辑过]

TA的精华主题

TA的得分主题

发表于 2005-2-22 17:12 | 显示全部楼层

这个图片是生成了

但是使用PHOTOSHOP无法编辑,不认可这种图片格式

我修改成BMP,GIF都不行!

nKPPXDLb.rar (44.04 KB, 下载次数: 91)
[此贴子已经被作者于2005-2-22 17:15:43编辑过]

TA的精华主题

TA的得分主题

发表于 2005-12-7 21:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

厉害!

反复调试守柔版主的代码,我知道是什么原因会引起出错了。

原来,画图程序MSPAINT.exe是没有焦点的,在用shell调用时是异步运行的,VBA代码不会等待mspaint.exe启动就继续向下运行,结果可想而知,由于mspaint.exe尚未完全启动,却试图用“AppActivate MyApp“激活画图程序当然就会出错了。解决办法,就是在适当的位置插入一段延时代码。测试代码如下:

Sub test()
Dim pauseTime#, MyApp
MyApp = Shell("mspaint.exe", 1) '运行指定绘图程序MSPAINT.exe,这里的参数1实际上不起作用
pauseTime = Timer + 1
Do While Timer < pauseTime '延时1秒,等待画图程序启动完毕
DoEvents '将控制让给其它程序
Loop
AppActivate MyApp '激活画图程序
End Sub

TA的精华主题

TA的得分主题

发表于 2011-3-31 17:20 | 显示全部楼层

这个可以的

ub SheetOutJpg()
Dim Newshape As Shape
ActiveSheet.UsedRange.Select
    Selection.CopyPicture Appearance:=xlScreen, Format:=xlPicture
    ActiveSheet.Paste
     Set Newshape = ActiveSheet.Shapes(ActiveSheet.Shapes.Count)
     With ActiveSheet.ChartObjects.Add(1, 1, 1, 1)
         .Width = Newshape.Width
         .Height = Newshape.Height
          Newshape.Copy
         .Chart.Paste
         .Chart.Export ActiveWorkbook.Path & "\Myjpg.jpg"
         .Delete
     End With
     Newshape.Delete
'   MsgBox "恭喜!图片已生成并存放在" & ActiveWorkbook.Path
End Sub

TA的精华主题

TA的得分主题

发表于 2012-4-27 09:55 | 显示全部楼层
本帖最后由 FENGJUN 于 2012-4-27 09:58 编辑
守柔 发表于 2005-2-20 07:57
这是我在单位机器上运行上述代码后的截图,请看:
也就是说,我家中的电脑与单位的电脑中,运行全部正 ...

Sub xlf()
    Dim MyApp As Integer, aShape As InlineShape, I As Integer, PicName As String
    'On Error Resume Next
    Application.ScreenUpdating = False
    MyApp = Shell("C:\WINDOWS\system32\MSPAINT.EXE", 1)  '运行指定绘图程序
    For Each aShape In ActiveDocument.InlineShapes
        I = I + 1
        PicName = ActiveDocument.Path & "i" & ".jpg"    '设置一个路径和文件名
        aShape.Select  '选中
        Selection.Copy  '复制
        Selection.TypeText Text:="(图片" & I & ")"
        AppActivate MyApp  '激活该应用程序
        SendKeys "^V{Enter}", True    '发送CTRL+V键,对出现的对话框进行确定
        SendKeys "%FS", True   '打开另存为
        SendKeys "{del}", True    '清空,此处还起到一个缓冲作用
        SendKeys PicName & "{enter}", True    '保存为*.jpg格式
    Next
    SendKeys "%{F4}", True    '退出画图程序
    Application.ScreenUpdating = True
End Sub


'我又重新调试了几次,感觉这次的测试与初次测试差异甚大,重新修改了代码,在四个嵌入式图片中运行了六次,全部正常,请楼主继续测试,如有问题,请及时交流.
'* +++++++++++++++++++++++++++++ '* Created By 守柔(ShouRou)@ExcelHome 2005-2-18 4:37:21 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '^The Code CopyIn [标准模块-模块2]^' '* -----------------------------
Sub Example()
    Dim MyApp As Long, aShape As InlineShape, I As Integer, PicName As String
    ' On Error Resume Next
    Application.ScreenUpdating = False
    MyApp = Shell("MSPAINT.exe", 1)    '运行指定绘图程序
    Debug.Print MyApp
    For Each aShape In ActiveDocument.InlineShapes
        I = I + 1    '累计
        PicName = ActiveDocument.Path & "\" & I & ".JPG"    '设置一个路径和文件名
        aShape.Select    '选中
        Selection.Copy    '复制
        AppActivate MyApp    '激活该应用程序
        SendKeys "^n", True    '新建
        SendKeys "^v{Enter}", True    '发送CTRL+v(粘贴快捷键),对出现的对话框进行确认
        SendKeys "%fa", True    '打开另存为
        SendKeys PicName & "{Enter}", True    '保存为*.JPG格式
    Next
    SendKeys "%{F4}", True    '关闭画图程序
    Application.ScreenUpdating = True
End Sub   

守柔兄:上面两段代码确如“龙族”所说,出现错误。我的环境:win server 2003 + Office 2007

TA的精华主题

TA的得分主题

发表于 2013-8-8 21:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub aaExample()
    Dim MyApp As Integer, aShape As InlineShape, i As Integer, PicName As String
    Application.ScreenUpdating = False
    If Dir("D:\YinZhang\", vbDirectory) = "" Then MkDir "D:\YinZhang\"
    If Dir("D:\YinZhang\*.*") <> "" Then Kill "D:\YinZhang\*.*"
    MyApp = Shell("C:\windows\system32\MSPAINT.exe", 1) '运行指定绘图程序
    For Each aShape In ActiveDocument.InlineShapes
        i = i + 1 '累计
        PicName = "D:\YinZhang\Pt00" & i & ".JPG" '设置一个路径和文件名
        aShape.Select '选中
        Selection.Copy '复制
        pauseTime = Timer + 0.3
        Do While Timer < pauseTime '延时,等待画图程序启动完毕
        DoEvents '将控制让给其它程序
        Loop
        AppActivate MyApp '激活该应用程序
        SendKeys "^v{Enter}", True '发送CTRL+V(粘贴快捷键),对出现的对话框进行确认
        SendKeys "%FA", True '打开另存为
        SendKeys "{Del}", True '清空(此处还起到一个缓冲作用)
        SendKeys PicName & "{Enter}", True '保存为*.JPG格式
    Next
    SendKeys "%{F4}", True '退出画图程序
    Application.ScreenUpdating = True
End Sub

补充内容 (2013-8-11 14:33):
Sub aaExample()
    Dim MyApp As Integer, iShape As InlineShape, aShape As Shape, i As Integer, PicName As String
    Application.ScreenUpdating = False
    If Dir("D:\YinZhang\", vbDirectory) = "" Then MkDir "D:\YinZhang\"
    If Dir("D:\YinZhang\*.*") <> "" Then Kill "D:\YinZhang\*.*"
    MyApp = Shell("C:\windows\system32\MSPAINT.exe", 1) '运行指定绘图程序
    For Each iShape In ActiveDocument.InlineShapes
        i = i + 1 '累计
        PicName = "D:\YinZhang\Pt00" & i & ".JPG" '设置一个路径和文件名
        iShape.Select '选中
        Selection.Copy '复制
        pauseTime = Timer + 0.3
        Do While Timer < pauseTime '延时,等待画图程序启动完毕
        DoEvents '将控制让给其它程序
        Loop
        AppActivate MyApp '激活该应用程序
        SendKeys "^v{Enter}", True '发送CTRL+V(粘贴快捷键),对出现的对话框进行确认
        SendKeys "%FA", True '打开另存为
        SendKeys "{Del}", True '清空(此处还起到一个缓冲作用)
        SendKeys PicName & "{Enter}", True '保存为*.JPG格式
    Next
    For Each aShape In ActiveDocument.Shapes
        i = i + 1 '累计
        PicName = "D:\YinZhang\Pt00" & i & ".JPG" '设置一个路径和文件名
        aShape.Select '选中
        Selection.Copy '复制
        pauseTime = Timer + 0.3
        Do While Timer < pauseTime '延时,等待画图程序启动完毕
        DoEvents '将控制让给其它程序
        Loop
        AppActivate MyApp '激活该应用程序
        SendKeys "^v{Enter}", True '发送CTRL+V(粘贴快捷键),对出现的对话框进行确认
        SendKeys "%FA", True '打开另存为
        SendKeys "{Del}", True '清空(此处还起到一个缓冲作用)
        SendKeys PicName & "{Enter}", True '保存为*.JPG格式
    Next
    SendKeys "%{F4}", True '退出画图程序
    Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

发表于 2014-3-25 18:57 | 显示全部楼层
非常感谢各位,最后的wfc0537的代码稍微修改了一下,存为没有白边的真实jpg格式。

…………
        Loop
        AppActivate MyApp '激活该应用程序
        SendKeys "^e1{Tab}1{Enter}" '设置图板原始大小为1x1
        SendKeys "^v{Enter}", True '发送CTRL+V(粘贴快捷键),对出现的对话框进行确认
        SendKeys "%FA", True '打开另存为
        SendKeys "{Del}", True '清空(此处还起到一个缓冲作用)
       SendKeys PicName & "{Tab}j{Enter}", True '保存为真正的*.JPG格式
    Next
…………

TA的精华主题

TA的得分主题

发表于 2020-8-1 23:17 | 显示全部楼层
还要注意
1.picname里面不要包含有中文字符,或者说不要包含有键盘上没有的字符。
2.还有通过sendkeys 把输入法变成英文状态。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 05:58 , Processed in 0.037709 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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