• VBA 图形图片处理


    学习资源:《Excel VBA从入门到进阶》第44集 by兰色幻想


    本节来学习如何处理VBA图片与图形处理,用到的是VBA的shape对象。

    Shape 对象,该对象代表工作表或图形工作表上的所有图形,它是sheets和chart的子对象(属性)。下表列出shape部分常用属性。

        获取单元格sheet.shape.topleftcell.address

    使用示例:获取shape的l类型。

    Dim ms As Shape
    Cells(k, 1) = ms.Type
    Shape.Type的部分值

    关于shape对象的添加、编辑、变换位置等操作,在这边就略过了。因为这部分内容太多,使用起来也复杂,需要用到时就使用录制宏来获取代码吧。

     

    下面学三段常用的代码:

    1. 图片批量导入

    例题:在B例批量导入A列名称的对应图片。

    要导入的图片

    思路:插入图形,在图形上填充图片。

    因为部分图片分辨率过大,直接插入,可能会导致文件很大。在图形上插入,可以控制图片的大小,和压缩图片。

    提示:关于如何插入图形,可以录制一个插入图形并填充图片的宏,获得代码后再套上循环改写。

    Sub 图片导入()
    
    Dim S As Shape
    Dim RG As Range
    
    '删除已有图片
    For Each S In ActiveSheet.Shapes
        If S.Type <> 8 Then            '有插入一个窗体控件指定宏
            S.Delete                   '把不是窗体控件的shape(图片、图形等)清除
        End If
    Next S
    
    '导入图形
    For Each RG In Range("B2:B5")
        '插入矩形msoShapeRectangle,它的左边距、顶点、宽度、高度都引用RG单元格的
        ActiveSheet.Shapes.AddShape(msoShapeRectangle, RG.Left, RG.Top, RG.Width, RG.Height).Select
        'RG单元格左边单元格填写了图片名称,填充对应图片到矩形里。
        Selection.ShapeRange.Fill.UserPicture "C:" & RG.Offset(0, -1) & ".jpg"
    Next RG
    
    End Sub

    运行示例(逐步展示导入图片,实际用时其实是一秒多):

     

    2. 批量插入复选框

    例题:在B例批量导入复选框。

    提示:先录制一个插入复选框的宏,获得代码后再套上循环改写。

    Sub 批量插入复选框()
    
    Dim RG As Range
    Dim S As Shape
    
    '删除已有复选框
    For Each S In ActiveSheet.Shapes
        If InStr(S.Name, "Ch") > 0 Then      '复选框的名称是Check box
            S.Delete
        End If
    Next S
    
    '批量插入复选框
    For Each RG In Range("B2:B15")
       '插入复选框CheckBoxes,它的左边距、顶点、宽度、高度都引用RG单元格的
        ActiveSheet.CheckBoxes.Add(RG.Left, RG.Top, RG.Width, RG.Height).Select
        
       '复选框的文本为“是”,值为空,链接的单元格是RG的位置
        With Selection
            .Characters.Text = "是"
            .Value = xlOff
            .LinkedCell = RG.Address
        End With
        
       '把RG单元格的字体颜色变成白色,否则打勾会显示True和False
        RG.Font.ThemeColor = xlThemeColorDark1
    
    Next RG
    
    End Sub

    运行示例(逐步批量插入复选框,实际用时不过1秒多):

     

    3. 连线

    例题:把相同内容的单元格连线起来。

    Sub 连线()
    
    Dim rg1 As Range, rg2 As Range, rg3 As Range, rg4 As Range
    Dim S As Shape
    Dim RG As Range
    
    '删除已有线条
    For Each S In ActiveSheet.Shapes
        If S.Type = 9 Then
            S.Delete
        End If
    Next S
    
    '连线
    Set rg1 = Range("B1")
    Set rg2 = Range("B2")
    Set rg3 = Range("C2")
    Set rg4 = Range("C1")
    
    '控制起点和终点,起点为B列单元格的左边线中点,终点为C列单元格的左边线中点
    '没有右边线的说法,所以不能把起点设为A列单元格的右边线中点
    ActiveSheet.Shapes.AddLine(rg1.Left, rg1.Top + rg1.Height / 2, rg3.Left, rg3.Top + rg3.Height / 2).Select
    Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
    ActiveSheet.Shapes.AddLine(rg2.Left, rg2.Top + rg2.Height / 2, rg4.Left, rg4.Top + rg4.Height / 2).Select
    Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle
    
    End Sub
    

    运行示例(逐步进行连线,实际用时不超1秒):

     


    小结

    这些例题都比较简单,尤其第三道,只是想把几个可能常用到的实例介绍出来,要想把它们化为己用的话肯定要改写一下,如果需要用到没讲的功能就使用录制宏来获取代码吧,不细讲了~

    这几天有看视频的,就是不知道该怎么做笔记了,因为有些内容也没听太明白,后面可能还会慢更(捂脸……让我想想该怎么做之后的笔记会比较好……

  • 相关阅读:
    数据结构之查找算法总结笔记
    html的a链接的href怎样才另起一个页面
    深入理解CSS中的空白符和换行
    CSS文本方向
    alert()与console.log()的区别
    CSS旧版flex及兼容
    Java:类与继承
    Java中只有按值传递,没有按引用传递!
    String作为方法参数传递 与 引用传递
    Java:按值传递还是按引用传递详细解说
  • 原文地址:https://www.cnblogs.com/plyc/p/14701245.html
Copyright © 2020-2023  润新知