03 图形

一键插入多张图片到指定单元格位置(设置图片宽高度)

  用Excel做产品库,很多行业的伙伴并不会陌生。

  比如:某列是产品序号、之后是它的相关介绍(包含但不限于FABE话术)。在鞋服零售行业时,简直是背它背到吐!每年新款上市前的订货会,大量的培训等基础工作要做。

  Excel整理产品库下发,需要把图片内容对应到每个款式、贴到产品之后(有些公司可能直接就PPT上了,但是对于品牌方来说,不同系列、上市时间、材料属性且SKU多多的产品,PPT远不如Excel更为直观)。

  这就牵扯到产品和图片对应和逐一插入、调整大小适应单元格的问题!已知产品是按规则编码命名的、图片也是相同的命名,在摄影师批量提交图片后,如何快速且优雅的把它们插入到对应的产品库表格中?

  如同了解过分享过的基础课程和一些VBA实例,这时会想到:超控图片对象、用图片名称查找、和Range单元格内容匹配一致后、.Insert插入图片到指定单元格的过程!

  对于图形对象,我们了解的不多。在基础篇中关于对象的介绍,每个章节开篇的“对象的层级结构图”中,知道它们是和Range单元格对象处于一个层级。既然是对象,也会有它的属性和方法,用本章的实例,来看下图形对象的一些常规操作。

  其它的实现细节,什么方法可以识别图片?名字如何获取和匹配?循环的使用等等,这些会在示例代码逐行说明,它并不复杂,了解过基础知识的一眼明了。

运行视频:

源码下载:

描述:

  一键批量插入多张图片到表格中,要求:指定插入在单元格位置的右侧列、图片和单元格内容匹配、允许调整图片的宽和高度,单元格的行高和列宽和图片吻合。

样本示例:
点击放大的图片
需求分析:
  • 1、选择"产品名称"(指定插入的位置);
  • 2、选择需要插入的产品图片;
  • 3、指定图片的宽和高;
  • 4、在"产品名称"所在列的右侧列,插入对应的产品图片且单元格的行高和列宽自动适应图片。
VBA实现过程:
  • 1.Application.InputBox方法,让用户自定义选择"产品序号"所在单元格区域;
  • 2.Application.GetOpenFilename方法,打开对话框,FileFilter参数,指定文件筛选条件,这里必须是所有的、常见图形文件的后缀有:(*.bmp;*.gif;*.tif;*.jpg;*.jpeg;*.png);
  • 3.获取图形的名字很有意思,正常我们通过"打开对话框"批量选择图片后,里面的单个元素是该图片的完整路径,比如"C:\文件\图片\Pic.jpg",我们该如何获取"Pic"呢?我们知道它的前面必定是"\"后面必定是".",但是前面有几个"\"就不清楚了,它取决于路径,但是如果把路径这个字符串反过来,它必定是第一个"\",我们用了两个StrReverse内置的反转函数,先把字符串反转过来,mid截取后,再反转回来,就得到了"图形名字Pic";
  • 4.Application.InputBox方法,可以让用户选择单元格,也可以让他们指定图片的宽和高;
  • 5.接着就是图片的插入工作:
  • ①:一个for循环,遍历选择的图片,获取图片名称;
  • ②嵌套一个Do Loop...While循环,查找所有与图片名字匹配的单元格值;
  • ③Pictures.Insert方法,图片插入;
  • ④.Left、.Top,图形的属性值设置,决定图形的左上角在表格中的左边、顶部位置;
  • ⑤.Height、.Width,图形的属性值设置,决定这图形的高度和宽度;
  • ⑥.RowHeight、.ColumnWidth,单元格的属性值设置,单元格的高度和宽度。
  • 5、完成!
示例代码
复制成功!
1

Sub 批量插入图片到工作表()
    '-----------------------------------------------------------------------
    '自定义数据类型
    Dim ImgFileFormat, FirstAddress As String
    Dim Pic As Variant, Pic_name As String, Sizes As String, Choose_sht_name As String
    Dim Choose_rng, rng As Range
    Dim i As Integer
    Dim C As Range
    Dim Shp As Shape  '声明图形对象变量


    '选择需要插入区域
    On Error Resume Next
    Set Choose_rng = Application.InputBox("选择需要插入的单元格或单元格区域", Type:=8)
    If Err.Number > 0 Then MsgBox "未选择内容": Exit Sub
    If WorksheetFunction.CountA(Choose_rng) = 0 Then MsgBox "选择单元格区域为空": Exit Sub
    Choose_sht_name = Choose_rng.Parent.Name
    On Error GoTo 0

    '选择需要插入的图片及自定义图片的高度与宽度
    ImgFileFormat = "Image files (*.bmp;*.gif;*.tif;*.jpg;*.jpeg;*.png)," & "*.bmp;*.gif;*.tif;*.jpg;*.jpeg;*.png" '指定图片格式
    Pic = Application.GetOpenFilename(ImgFileFormat, , "选择多张图片", , True) '打开一个图片选择对话框
    If VBA.TypeName(Pic) = "Boolean" Then
        MsgBox "没有选择文件": Exit Sub
    End If


Star:
    Sizes = Application.InputBox("请指定图片的高度与宽度,中间用半角逗号隔开" & Chr(10) & "例如“30,260”或者“80,100”", "指定图片大小", "100,120", , , , , 2)
    If InStr(Replace(Sizes, ", ", ","), ",") = 0 Then GoTo Star '如果没有输入","则返回重新输入

   Application.ScreenUpdating = False
   Application.DisplayAlerts = False

    For i = 1 To UBound(Pic)
        '获取图片名字
        Pic_name = StrReverse(Mid(StrReverse(Pic(i)), WorksheetFunction.Find(".", StrReverse(Pic(i))) + 1, WorksheetFunction.Find("\", StrReverse(Pic(i))) - 1 - WorksheetFunction.Find(".", StrReverse(Pic(i)))))

        '添加图片批注
        With Choose_rng
            Set C = .Find(Pic_name, LookIn:=xlValues)
            If Not C Is Nothing Then
                FirstAddress = C.Address
                Do
                    Sheets(Choose_sht_name).Activate
                    Sheets(Choose_sht_name).Pictures.Insert(Pic(i)).Select  '插入图片

                    With Selection
                        .Left = C.Offset(0, 1).Left '使图片的左边距等于其左上单元格的左边距
                        .Top = C.Offset(0, 1).Top    '使图片的上边距等于其左上单元格的上边距
                        .Height = Split(Replace(Sizes, ", ", ","), ",")(1) '调整图片高度
                        .Width = Split(Replace(Sizes, ", ", ","), ",")(0)  '调整图片宽

                        C.Offset(0, 1).RowHeight = .Height '调整行宽度
                        C.Offset(0, 1).ColumnWidth = .Width / 5.5 '调整列宽度,模糊调整

                    End With
                    Set C = .FindNext(C)
                Loop While Not C Is Nothing And C.Address <> FirstAddress
            End If
        End With
    Next i

   Application.ScreenUpdating = True
   Application.DisplayAlerts = True
   MsgBox "插入图片完成"
End Sub

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