实用VBA:10.用VBA向Excel文件中自动插入图片

1.需求场景

上次介绍了“使用Excel批量套模板,一键输出多个工作表”的内容,可以通过VBA对大批量的数据进行模板化输出,类似于Word中的邮件合并的效果,在Excel中使用更灵活,可以自定义输出范围,便于修改调整模板格式。实际工作中,套模板输出的时候常常需要插入图片,例如人员简历中的证件照,工作日志中的现场照片等。如果原始照片大小不一,还需要按比例进行缩放。同样可以使用VBA进行批量处理,而且可以和数据一并处理。

例如数据还是上次的数据,只是模板中多了照片的位置。

  1. 2.解决思路

按照手工插入图片的步骤,需要插入图片到表格——对齐边缘到单元格——缩放图片到表格大小。用VBA处理时,可以考虑事先将图片存储在统一目录下,文件名与基础数据建立关联,例如证件照以人员姓名命名或以人员编号命名,工作现场照片等以基础数据表中具有唯一性的字段命名,如果一个表中要插入多个照片(即每行数据对应多个图片),可以加上规律的后缀-1、-2……等。通过拼接出文件完整路径的方式进行调用。

调用工作表Shapes对象的AddPicture()方法,再和调整图片位置、大小属性的操作封装到一起,构建为自定义的插入图片的方法。

3.VBA实现

只需要在上次的代码基础上进行少量的改进即可实现。

'定义工作簿变量

Dim wb As Workbook

'定义工作表变量

Dim ws, sh As Worksheet

'定义临时存储基本信息数据各字段的变量

Dim pName, pSex, pBirthday, pJob, pLocation, pSchool, pLevel, pUnit, pWorkYear, pPhone, pCareer, pAwards, myPath As String

'循环变量

Dim i As Integer

'定义图形对象变量

Dim sp As Shape


Public Sub 按模板输出工作表()

    '设置工作簿为当前工作簿

    Set wb = Workbooks(1)

    '设置基础数据表、填表模板到表变量

    Set ws = Worksheets("数据")

    Set sh = Worksheets("模板")

    '关闭屏幕刷新

    'Application.ScreenUpdating = False

    '逐行读取人员基本信息,每行信息(即每个人的信息)填入表格后另存为单独文件

    For i = 2 To 3

        '设置数据表为当前激活的表格

        ws.Activate

        '将当前行各列单元格信息存至临时变量

        pName = Cells(i, 1).value

        pSex = Cells(i, 2).value

        pBirthday = Cells(i, 3).value

        pJob = Cells(i, 4).value

        pLocation = Cells(i, 5).value

        pSchool = Cells(i, 6).value

        pLevel = Cells(i, 7).value

        pUnit = Cells(i, 8).value

        pWorkYear = Cells(i, 9).value

        pPhone = Cells(i, 10).value

        pCareer = Cells(i, 11).value

        pAwards = Cells(i, 12).value

        '设置模板表格为当前激活的工作表

        sh.Activate

        '将临时变量信息写入模板对应单元格

        Cells(2, 2).value = pName

        Cells(2, 4).value = pSex

        Cells(2, 6).value = pBirthday

        Cells(3, 2).value = pJob

        Cells(3, 4).value = pLocation

        Cells(4, 2).value = pLevel

        Cells(4, 4).value = pSchool

        Cells(5, 2).value = pWorkYear

        Cells(5, 4).value = pUnit

        Cells(5, 6).value = pPhone

        Cells(6, 2).value = pCareer

        Cells(7, 2).value = pAwards

        '删除旧图片

        For Each sp In ActiveSheet.Shapes

            sp.Select

            '如果图形类别为13则是图片,删除,否则不删除,以免合并单元格被误删除

            If sp.Type = 13 Then

                sp.Delete

            End If

        Next

        '以当前文件所在目录为根目录,拼接文件完整路径

        myPath = imgPath & "证件照\" & pName & ".JPG"

        '调用插入图片的自定义方法

        insertPicture filename:=myPath, picCell:=Cells(2, 7), picLoc:="照片"

        '填好表信息的模板工作表复制为新工作表

        sh.Copy

        '活动工作表名以人员姓名命名

        ActiveSheet.Name = pName

        '文件另存至当前文件夹“\人员信息表\”子目录下

        ActiveWorkbook.SaveAs filename:=ThisWorkbook.Path & "\人员信息表\" & i - 1 & ".人员信息表(" & pName & ").xlsx"

        '关闭保存过的文件

        ActiveWorkbook.Close

    Next i

    '释放工作表和工作簿变量

    Set sh = Nothing

    Set ws = Nothing

    Set wb = Nothing

    '开启屏幕刷新

    'Application.ScreenUpdating = True

    '显示提示信息

    MsgBox "生成完毕,请到“人员信息表”目录下查看。"

End Sub


'自定义插入图片的方法

Sub insertPicture(ByRef filename As String, ByRef picCell As Range, ByRef picLoc As String)

    '判断指定路径下文件是否存在

    If Dir(filename) <> "" Then

        '插入图片

        ActiveSheet.Shapes.AddPicture(filename, msoFalse, msoTrue, picCell.Left, picCell.Top, -1, -1).Select

        '调整图片大小和位置

        With Selection.ShapeRange

            '锁定图片纵横比,避免变形

            .LockAspectRatio = msoTrue

            '上边缘比单元格上边缘多1个像素,避免遮盖边框线

            .Top = picCell.Top + 1

            '高度为单元格高度4倍减2像素,让出上下边缘线

            .Height = picCell.Height * 4 - 2

            '左边缘对齐位置

            .Left = picCell.Left + (picCell.Width - .Width) / 2

            '如果图片比例超宽,则宽度缩小到单元格宽,调整顶端对齐位置

            If .Width > picCell.Width Then

                '宽度调整为单元格宽减2像素

                .Width = picCell.Width - 2

                '左对齐到单元格左边缘加1像素

                .Left = picCell.Left + 1

                '上对齐向下调到居中位置

                .Top = picCell.Top + (picCell.Height * 4 - .Height) / 2

            End If

        End With

    Else

        Debug.Print pName & picLoc & "文件未找到。"

    End If

End Sub

4.运行效果

生成出的文档中证件照自动插入到模板规定位置。

#一次学一个小技巧,下班就数我最早#

如果对你有帮助,欢迎点赞、关注或转发。如果有其他更好的实现方法,欢迎回复与大家分享。

以前用Excel2003做了些宏,在网上还有不少粉丝,因一些功能在Excel2010中无法使用,故重新整理,欢迎指正; 本Excel中的宏在Excel2010中测试表现出色; 运行宏前,要保证EXCEL没有禁用宏。 Michael Ho QQ: 9900060 ----------------------- 本Excel有以下功能: 插入图片1 1.点击执行后,会出现文件夹选择窗,请选择你JPG图片所在文件夹(选择“文件夹”而不是选择文件); 2.宏会自动复制Sheet2到新工作簿,并插入你所选文件夹中的全部JPG图片到B列,对应的图片自动填到C列; 3.图片的大小会自动适应Sheet2的B3单元格,因此可以在点击执行前调整Sheet2的B3单元格的大小来控制插入图片的大小。 -------- 插入图片2 1.点击执行后,会出现文件夹选择窗,请选择你JPG图片所在文件夹(选择“文件夹”而不是选择文件); 2.宏会自动复制Sheet3到新工作簿,并插入你所选文件夹中的全部JPG图片制作图册,对应的图片自动填到图片下方; -------- 插入图片3 如果用户自己的Excel文件中有一列是型号,该宏可以插入指定文件夹里以型号命名的JPG图片到另一列; 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件中按Ctrl+I (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏InsertPic3); 4.然后会出现文件夹选择窗,请选择你JPG图片所在文件夹(选择“文件夹”而不是选择文件); 5.在弹出的对话框中指定型号在第几列,图片插入到第几列,以及从哪一行开始; 6.图片的大小会自动适应你设定的第一行要插入图片的单元格,因此提前调整那个单元格的大小可以控制插入图片的大小。 ------------- 删除活动工作表中所有图片 Ctrl+d 删除活动工作表里所有的JPG图片,(不一定是本工作簿中的工作表); 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件中按Ctrl+d (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏DelPic); ------------- 导出活动工作表中被选中的一张JPG图片 Ctrl+e 导出活动工作表中被选中的一张JPG图片,(不一定是本工作簿中的工作表); 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.请选中一张要导出的图片; 4.在你的文件中按Ctrl+e (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏OutputOnePic); 5.在弹出的对话框中指定图片要保存的名字; 1.不管图片Excel中是否被缩放过,导出的图片是按图片的原始尺寸进行保存。 2.在桌面上会自动新建一个"OutputPic"的文件夹,导出的图片将会存在那个文夹里; 3.如果文件夹中已有相同名字的文件,则后面导出的文件自动加上(v1), (v2), (v3)... ------------- 导出活动工作表中所有JPG图片 Ctrl+f 导出活动工作表中所有JPG图片,并且图片自动使用指定列中的图片名; 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件中按Ctrl+f (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏OutputAllPic); 4.在弹出的对话框中指定图片所在列,图片名所在的列; 1.不管图片Excel中是否被缩放过,导出的图片是按图片的原始尺寸进行保存; 2.在桌面上会自动新建一个"OutputPic"的文件夹,所有导出的图片将会存在那个文夹里; 3.如果文件夹中已有相同名字的文件,则后面导出的文件自动加上(v1), (v2), (v3)... ---------------- 对指定文件夹中的JPG图片进行重命名 Ctrl+r 利用活动工作表中的所有图片的旧名与新名的对照,对指定文件夹中JPG图片进行重命名; 1.打开本Excel文件,不要关闭; 2.再另外打开你自己需要操作的另一个Excel文件,并保持你要操作的工作表做为当前活动工作表; 3.在你的文件中按Ctrl+r (或在你的文件中手动执行宏,然后选择本EXCEL文件中的宏RenamePic); 4.在弹出的对话框中指定图片旧名所在列和图片新名所在的列; 1.可以结合插入图片的宏,将所有图片的旧名输入到Excel中,再在另一列中填上新图片名,然后使用该宏。 2.如果顺利运行,会在原来那个文件夹下面新建一个叫“New”的子文件夹,所有重命好名的图片自动放入子文件夹里; 3.如果文件夹中已有相同名字的文件,则后面的文件会覆盖原来的文件
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值