Excel 2010 VBA 入门 103 利用VBA批量插入图片

目录

示例

代码:

 Shapes、Shape和 ShapeRange

Shapes对象插入图形的方法

Excel的坐标

图形大小的调整

获取图片的原始大小

将图片按比例缩放至单元格

图片批量插入的步骤

Pictures集合


示例

    如图所示,该表为员工档案表。现需要根据员工的姓名批量导入已经存在于该工作簿文件目录下“图片”子目录中员工的照片。

姓名年龄入职日期照片
张三3036559
李四4535856
王五3437656
Eric5240212

代码:

    使用循环遍历数据表中所有的记录,然后在相应的目录中找到该条记录所对应的图片文件的地址,再使用工作表中Pictures集合的Add方法插入图片,并调整其位置和大小。

Option Explicit

Sub 图片导入()
    '将图片导入。
    '每行行高设定为50,列宽不变。
    '图片按照原比例存储,按照原比例存储

    On Error Resume Next
    Dim rowN As Long
    Dim Pic As Object
    
    With Sheets("sheet1")
        For Each Pic In .Shapes
            If Pic.Name <> .Shapes("按钮 2").Name Then
                Pic.Delete
            End If
        Next Pic
        For rowN = 2 To .Range("A1").CurrentRegion.Rows.Count
            Set Pic = .Pictures.Insert(thiswookbook.Path & "\图片\" & Cells(rowN, 1) & ".jpg")
            Pic.shperange.LockAspectRatio = True
            With Pic.ShapeRange
                If .Height / .Width > Cells(rowN, 4).Height / Cells(rowN, 4).Width Then
                    .Height = Cells(rowN, 4).Height
                    .Top = Cells(rowN, 4).Top
                    .Left = Cells(rowN, 4).Left + (Cells(rowN, 4).Width - .Width) / 2
                Else
                    .Width = Cells(rowN, 4).Width
                    .Left = Cells(rowN, 4).Left
                    .Top = Cells(rowN, 4).Top + (Cells(rowN, 4).Height - .Height) / 2
                End If
            End With
        Next rowN
    End With
End Sub

 Shapes、Shape和 ShapeRange

    在Excel工作表中插入的任何图片、图表、图形和ActiveX控件,Excel都在该对象之外包上一层外壳,使之成为一个Shape(图形)对象,即Shapes集合的一员。

     图形对象隶属于工作表对象,是工作表对象的子对象,它有3种表现方式:Shapes、Shape和Shaperange。
    Shapes集合是工作表中全部图形对象(图片、图表、图形、控件等)的集合,即任何一个上述对象都是Shapes集合中的一员。
    Shape对象指的是单个的图形对象,可以使用以下表达式表示Shape对象,从而对其进行操作。

Shapes (index)

或者

Shapes(shapename )

其中,参数index为图形的序号(最小为1),shapename为图形的名称(文本类型)。
ShapeRange对象则是一个或多个Shape的集合,其表示方式可以为

Shapes.Range(indexarray)

 或者

Shapes.Range(shapenamearray)


    其中,indexarray和shapenamearray为图形序号和图形名称的数组,可以使用Array函数构造,比如一个序号为1和序号为3的图形集合可以表示为

Shapes.Range(Array(1,3))

若要访问ShapeRange中的某个Shape对象,则可以使用以下表达式:

ShapeRange(index)

或者

ShapeRange(shapename)

其中,ShapeRange表示一个ShapeRange对象。

     尽管Shapes、Shape和ShapeRange对象的关系显得错综复杂。而实际上操作图形对象总是以操作Shape对象为基础。只有当需要表示某个Shape对象或者插入某个Shape对象时才会
使用到Shapes对象,而ShapeRange对象基本很少用到。

Shapes对象插入图形的方法

    Shape对象几乎包括Excel中所包括的所有图形,并且Shapes集合提供了插入图形的各种方法,见表。

                Shapes集合插入图形的方法

    方  法

    说  明

AddCallout

  插入图形批注

AddChart

  插入图表

AddCorurectarl

  插入连接符号

AddCurve

  插入曲线

AddFormControl

  插入Excel窗体对象

AddLabel

  插入标签Label

AddLine

  插入直线

AddOLEObject;

  插入如OLE对象

AddPicture

  插入图片

AddPolyline

  插入多边形

AddShape

  插入自选图形

AddSmartArt

  插入SmartArt图形

AddTextbox

  插入文本框

AddTextEffect

  插入艺术字

    上述各种插入方法基本相同,大部分只需定义图形分类的子类别以及位置和尺寸即可。以插入图片AddPicture为例,其语法为

   

AddPicture(Filename,LinkToFile,SaveWithDocument, Left,Top,Width,Height)

    参数Filename为图片文件的完整路径,包括路径、文件名及扩展名。
    参数LinkToFile为逻辑值,当为True时,表示创建一个图片的链接,而为False时表示在Excel中插入一个图片的副本。
    参数SaveWithDocument为逻辑值,当为True时,表示与文件一起保存(当参数LinkToFile为False时,则该参数必须为True才能在Excel中保存文件),而为False时表示不与文件
一起保存。
    参数Left和Top表示插入图片的左端和上端的坐标。
    参数Width和Height表示插入图片的宽和高。

Excel的坐标

    在Excel中,图形的坐标是以A1单元格最左上点作为坐标原点建立的,某个图形的坐标是以其最左上点而定的,如图所示。在Excel中,只需定义其Left和Top属性,即可确
定图形的位置。

    单元格也具备坐标Top和Left属性,而单元格的坐标只能通过改变其左侧单元格的列宽或者上方单元格的行高而实现。对于某个单元格的Left属性,其值等于左侧所有的列宽度之和,其Top属性等于其上方所有单元格的高,如图所示。

     当需要在某个单元格内插入图形,只需将其Left和Top属性定义为该单元格的Left和Top属性即可。

图形大小的调整

    当需要调整图形的大小时,则需要更改其Width和Height属性。若需要将图片铺满某个单元格的整个格子,则可以将图形的Left、Top、Width和Height属性设置为与该单元格完全相等即可。
   当需要按比例缩放图片时,则可以使用ScaleWidth和ScaleHeight方法,其语法为

Shape.ScaleWidth(Factor,RelativeToOriginalSize,Scale )
Shape.ScaleHeight(Factor,RelativeToOriginalSize,Scale)

其中,Shape为一个Shape对象。
参数Factor为缩放的比例,可以为一个Single类型的小数。
参数RelativeToToriginaISize为一个逻辑值。当为True时,表示按照原始图片的大小进行缩放;当为False时,表示按照当前的尺寸进行缩放。
参数Scale表示进行图形缩放时图形的哪个位置保持不变,可以为msoScaleFromBottomRight(右下角)、msoScaleFromTopLeft(左上角)或者msoScaleFromR4iddle(中间)。
当使用ScaleWidth方法或ScaleHeight方法进行图形缩放时,若要保持图形的原始比例不变,可以将Shape对象的LockAspectRatio设置为True。

获取图片的原始大小

    使用Shapes的AddPicture方法插入图片时,必须指定其位置和大小。然而在插入图片之前,利用VBA获取该图片原始大小的困难较大;在插入图片后,即可以很方便地得到图片的原
始大小。

     在插入图片后,虽然其表象为一个Shape对象,但其内在的实质是一个嵌入式的对象(OLE对象)。因而可以使用Shape对象的OLEFormat. Object属性访问其原始的OLE对象,从中获取Width和Height的属性。如以下表达式可以获取Shape对象Shp的原始宽度:

Shp.OLEFormat.Object.Width

将图片按比例缩放至单元格

    图片按其原始比例缩放后放置到单元格,图片如何放置是由图片的宽(Width)和高(Height)的比(即宽除以高得到的结果),以及单元格的宽和高的比所决定的。可能会出现以下3种情
形:
   

    情形1 单元格恰好填满单元格,其图片的宽高比与单元格的宽高比相等。此时,图片的Top、Left、Width、Height属性与单元格的这4个属性完全一致。
    情形2 图片的高等于单元格的高,而宽小于单元格的宽。其图片的宽高比小于单元格的宽高比,此时图片的Top和Height属性与单元格一致,图片的Left属性满足以下表达式:

图片.Left=单元.Left+(单元格.Width-图片.Width)/2

    情形3 图片的宽等于单元格的宽,而高小于单元格的高。其图片的宽高比小于单元格的宽高比,此时图片的Left和Width属性与单元格一致,图片的Top属性满足以下表达式:

图片.Top=单元格.Top+(单元格.Height-图片.Height)/2

    根据上述规律得知,当图片导入后,只需将其原始图片的宽高比与单元格的宽高比进行比较,则可以得知图片的具体尺寸与放置的位置。根据其宽高比与单元格的宽高比进行比较,可以得出图片的高或者宽,此时,开发者可以由以下两种解决方案来调整图片的尺寸。

  • 将图片的高或者宽调整至单元格的高或者宽,然后根据图片的宽高比,计算出图片的另一个尺寸的属性,并进行调整。
  • 通过单元格的宽和高,计算图片目标尺寸与原始尺寸的比例,将LockAspectRatio设置为True,然后将图片按比例缩放。本例采用的是该方法。

图片批量插入的步骤

    本例实际上是一个相对较复杂的案例,因为解决该问题使用了许多知识点。而本例又是一个十分简单的问题,因为解决本题的代码并不多。当学习了以上各个知识点后,相信解决该问题十分容易。然而在不具备某些必备知识而要解决某些问题时,对初学者来说,其难度不小。但实际上,只需弄清楚其步骤,然后逐个解决,就会将问题简单化。
    对于初学者来说,应首先弄清楚代码执行的步骤。运行一般的思维逻辑就可以厘清步骤。对于本例而言,若不使用任何代码,而采取手动插入的做法,只需选取其中一幅图片执行以下步骤即可。

  (1)从文件夹中选择图片并插入。
   (2)调整插入图片的位置。
   (3)调整图片的大小
根据以上步骤编写代码,或者通过录制宏获取上述各步骤代码,结合Excel帮助再对代码进行删减,即可完成代码的编写。

Pictures集合

    Pictures集合是属于Worksheet的一个集合,代表工作表中插入图片的集合。但是在Excel帮助中和对象浏览器中均无法找到其身影。仅仅在插入图片动作的录制宏代码中才能发现Pictures集合确实属于工作表对象。Pictures集合包含了Picture对象(图片),与大部分集合一致,可以使用index(序号)或者名称来通过Picutures集合访问单个的图片对象。
    通过Picture对象插入一个图片可以使用Add方法,其语法为

Pictures.Add(Filename)

该方法将返回一个Picture对象。参数filename为文件的完整路径。
    使用Pictures. Add方法插入图片时,将按照图片的原始大小插入到工作表中。当需要更改其基本属性时,则需要通过Shape对象进行。Picture对象的ShapeRange属性提供了访问其Shape对象的方法。对于单个图片的Picture对象来说,可以使用以下表达式访问其Shape对象:

Picture.ShapeRange(1)


 

  • 6
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ngbshzhn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值