03 图形

一键导出Excel中的图形到当前路径

  关于Excel和图形(Shape),之前都是说如何插入的!插入到单元格/插入到批注,如果Excel已经存在的图片,是不是也可以导出来到本地呢?

当然是可以的!

  这里会接触到两个之前没有介绍过的文件系统操作语句:Kill 和MkDir,Kill语句删除系统指定路径的文件,MkDir语句创建新文件夹。

  它的整个运行过程的逻辑很简单,简述就是三个步骤:

  • 1、本地新建一个文件夹;
  • 2、遍历工作簿中所有工作表内的Shapes图形;
  • 3、保存下来。

  从中会用到几个之前从没用到的语句,在VBA的实现过程的步骤中,来一 一了解它!

运行视频:

源码下载:

描述:

  一键导出工作簿中的所有工作表的图像(图形和图片),并保存到当前路径。

需求分析:
  • 1、当前路径新建文件夹;
  • 2、导出代码所在的工作簿内所有工作表内的图形。
VBA实现过程:
  • 1.ThisWorkbook.path属性,当前工作簿的完整路径;
  • 2.MkDir (path + 新文件夹名),MkDir语句创建新文件夹;
  • 3.注意这里增加一个判断,符合代码调试和优化里"减少交互和避免重复",即如果当前已经有了用来保存图形的"新文件夹",执行Kill ((path + 新文件夹名 + "*"),清除文件夹内的所有文件后跳转到执行导出的语句即可,不必"在新建文件夹";
  • 4.两个嵌套循环,对工作表循环、嵌套一个对工作表内的所有图形循环,执行保存;
  • 5.图形的保存:
  • ①.Sheet.Shapes:工作表内的所有图形;
  • ②.ChartObjects.Add:创建一个新的嵌入式图表, Shp.Width, Shp.Height,位置和尺寸与原形状相同;
  • ③.Paste:将复制的剪贴板中的形状粘贴到图表中。如果说有疑问:“复制的不就是图吗,为什么还有新建一个,然后粘贴呢?”,可以把它理解成:“工作表中嵌入的图片是依附在Excel这一载体上,当保存在本地时,需要新建一个”相框“载体,把图片放置到新的载体上。”
  • ④.Export:将图表导出为路径 + 表名 + 图形名(Shp.Name) + .jpg的图片文件,图形名(Shp.Name) 是根据图片插入的顺序默认:图片1 、图片2、....图片n;
  • Shp.Name如图所示:
点击放大的图片
  • ⑤.Parent.Delete:删除临时创建的图表对象,避免残留。
示例代码
复制成功!
1

Sub 导出工作表中的图片()
    '-----------------------------------------------------------------------
    '自定义数据类型
    Dim path As String
    Dim Shp, Sht
    Dim n As Long

    Application.ScreenUpdating = False

    '在当前路径下增加一个文件夹,名称为“导出图片”,赋值给path
    path = ThisWorkbook.path & "\导出图片\"

    '在当前路径是否存在文件夹,存在则清空,不存在则新建
    If Len(Dir(path, vbDirectory)) Then
        Kill (path & "*")
        GoTo A:
    Else
        MkDir (path)
        GoTo A:
    End If


'便利工作薄的每个工作表,如果表中存在图片,则导出
A:
    For Each Sht In ThisWorkbook.Sheets
        Sht.Activate
        If ActiveSheet.Shapes.Count > 0 Then
            n = 0
            For Each Shp In ActiveSheet.Shapes
                n = n + 1
                Shp.Copy
                '创建新的嵌入式图表,保存到当前路径的新建文件夹中
                With ActiveSheet.ChartObjects.Add(0, 0, Shp.Width, Shp.Height).Chart
                    .Paste
                    .Export path & Sht.Name & "-" & Shp.Name & ".jpg"
                    .Parent.Delete
                End With
            Next
        End If
    Next Sht
    Application.ScreenUpdating = True
MsgBox "导出完成"
End Sub

补充内容:如果图片和sheet工作表内的某列有关系呢?

  比如实例:🔗一键插入多张图片到指定单元格位置,插入图片时,图片名称是和选择的列一 一 相对应的,那么导出时,也希望用对应的值作为图片名称保存下来!

  这时我们需要把Shp.Name做出调整。

复制成功!
1

'插入图片时,我们选择了单元格右侧相邻单元格保存图片
'且使图片的左边距等于其左上单元格的左边距
'图片上边距等于左上单元格上边距
.Left = C.Offset(0, 1).Left
.Top = C.Offset(0, 1).Top

'导出图片时,选择图片左侧相邻单元格的value值作为图片名称
'这里未避免非预知错误,如果图片左侧单元格有值就作为图片名称
'否则仍用图片在表格中的名称作为文件名称!
Dim oRng As Range
Set oRng = Shp.TopLeftCell.Offset(0, -1)
If oRng.Value = "" Then Shp_Name = Shp.Name Else Shp_Name = oRng.Value

请开发者喝杯咖啡 请开发者喝杯咖啡!