最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Excel VBA常用技巧 第04章 shape及Chart对象

IT圈 admin 40浏览 0评论

2024年4月23日发(作者:张简雅琴)

VBA常用技巧代码解析

VBA常用技巧

目录

VBA常用技巧 ................................................................................................................................... 1

第4章 Shape(图形)、Chart(图表)对象 .................................................................. 2

技巧1 在工作表中添加图形 ....................................................................................... 2

技巧2 导出工作表中的图片 ....................................................................................... 7

技巧3 在工作表中添加艺术字 ................................................................................... 9

技巧4 遍历工作表中的图形 ..................................................................................... 11

技巧5 移动、旋转图片 ............................................................................................. 13

技巧6 工作表中自动插入图片 ................................................................................. 14

技巧7 固定工作表中图形的位置 ............................................................................. 17

技巧8 使用VBA自动生成图表 .............................................................................. 19

技巧9 使用独立窗口显示图表 ................................................................................. 23

技巧10 导出工作表中的图表 ................................................................................... 24

技巧11 多图表制作 ................................................................................................... 25

1

VBA常用技巧代码解析

第4章 Shape(图形)、Chart(图表)对象

技巧1 在工作表中添加图形

如果需要在工作表中添加图形对象,可以使用AddShape方法,如下面的代码所示。

#001 Sub AddShape()

#002 Dim myShape As Shape

#003 On Error Resume Next

#004 ("myShape").Delete

#005 Set myShape = pe(msoShapeRectangle, 40, 120, 280,

30)

#006 With myShape

#007 .Name = "myShape"

#008 With .ters

#009 .Text = "单击将选择Sheet2!"

#010 With .Font

#011 .Name = "华文行楷"

#012 .FontStyle = "常规"

#013 .Size = 22

#014 .ColorIndex = 7

#015 End With

#016 End With

#017 With .TextFrame

#018 .HorizontalAlignment = -4108

#019 .VerticalAlignment = -4108

#020 End With

#021 .Placement = 3

2

VBA常用技巧代码解析

#022 End With

#023

#024 With ange

#025 With .Line

#026 .Weight = 1

#027 .DashStyle = msoLineSolid

#028 .Style = msoLineSingle

#029 .Transparency = 0

#030 .Visible = msoTrue

#031 .Color = 40

#032 . = RGB(255, 255, 255)

#033 End With

#034 With .Fill

#035 .Transparency = 0

#036 .Visible = msoTrue

#037 .Color = 41

#038 .OneColorGradient 1, 4, 0.23

#039 End With

#040 End With

#041 ("A1").Select

#042 Anchor:=myShape, Address:="", _

#043 SubAddress:="Sheet2!A1", ScreenTip:="选择Sheet2!"

#044 Set myShape = Nothing

#045 End Sub

代码解析:

AddShape过程在工作表中添加一个矩形并设置其外观等属性。

第2行代码声明变量myShape的对象类型。

第3、4行代码删除可能存在的名称为“myShape”的图形对象。

第5行代码使用AddShape方法在工作表中添加一个矩形。当该方法应用于Shapes

对象时,返回一个Shape对象,该对象代表工作表中的新自选图形,语法如下:

pe(Type, Left, Top, Width, Height)

参数expression是必需的,返回一个Shapes对象。

3

VBA常用技巧代码解析

参数Type是必需的,指定要创建的自选图形的类型。

参数Left和Top是必需的,以磅为单位给出自选图形边框左上角的位置。

参数Width和Height是必需的,以磅为单位给出自选图形边框的宽度和高度。

第7行代码将新建图形命名为“myShape”,向Shapes集合添加新的图形时,将对新

添加的图形赋以默认的名称,若要为图形指定更有意义的名称,可指定其Name属性。

第8行到第16行代码为矩形添加文字,并设定其格式。

其中第8行代码使用TextFrame 属性和Characters方法返回该矩形的字符区域。应用

于Shape对象的TextFrame 属性返回一个TextFrame对象,该对象包含指定图形对象的

对齐和定位属性;Characters方法返回一个Characters对象,该对象代表某个图形的文本

框中的字符区域,语法如下:

ters(Start, Length)

参数expression是必需的,返回一个指定文本框内Characters对象的表达式。

参数Start是可选的,表示将要返回的第一个字符,如果此参数设置为 1 或被忽略,

则Characters方法会返回以第一个字符为起始字符的字符区域。

参数Length是可选的,表示要返回的字符个数。如果此参数被忽略,则Characters方

法会返回该字符串的剩余部分(由Start参数指定的字符以后的所有字符)。

第9行代码为矩形添加文字,应用于Characters对象的Text属性返回或设置对象的文

本,为可读写的String类型。

第10行到第15行代码设置矩形中文字的属性,应用于Characters对象Font属性返

回一个Font对象,该对象代表指定对象的字体属性(字体名称、字体大小、字体颜色等),

第11行代码设置字体名称,第12行代码设置字体样式,第13行代码设置字体大小,第14

行代码颜色。

第17行到第20行代码设定矩形中文字的对齐方式。应用于TextFrame对象的

HorizontalAlignment属性返回或设置指定对象的水平对齐方式,可为表格 1-1所示的

XlHAlign常量之一。

常量

xlHAlignCenter

xlHAlignCenterAcrossSelection

xlHAlignDistributed

xlHAlignFill

xlHAlignGeneral

xlHAlignJustify

xlHAlignLeft

xlHAlignRight

-4108

7

-4117

5

1

-4130

-4131

-4152

描述

居中

靠左

分散对齐

分散对齐

靠左

两端对齐

靠左

靠右

表格 1-1 HorizontalAlignment属性的XlHAlign常量

4

VBA常用技巧代码解析

应用于TextFrame对象的VerticalAlignment属性返回或设置指定对象的垂直对齐方式,

可为表格 1-2所示的XlHAlign常量之一。

常量

xlVAlignCenter

xlVAlignJustify

xlVAlignBottom

xlVAlignDistributed

xlVAlignTop

-4108

-4130

-4107

-4117

-4160

描述

居中

两端对齐

靠下

分散对齐

靠上

表格 1-2 VerticalAlignment属性的XlHAlign常量

第21行代码设置矩形大小和位置不随单元格而变,应用于Shape对象的Placement

属性返回或设置对象与所在的单元格之间的附属关系,可为表格 1-3所示的XlPlacement

常量之一。

常量

xlFreeFloating

xlMove

xlMoveAndSize

3

2

1

描述

大小、位置均固定

大小固定、位置随单元格而变

大小、位置随单元格而变

表格 1-3 XlPlacement常量

第24行到第32行代码设置矩形的边框线条格式,应用于ShapeRange集合的Line属

性返回一个LineFormat 对象,该对象包含指定图形的线条格式属性。

其中第26行代码设置矩形线条粗细,第27行代码设置矩形线条的虚线样式,第28行

代码设置矩形填充的透明度,第29行代码设置矩形为可见,第30行代码设置矩形的前景

色,第31行代码设置矩形填充背景的颜色。

第33行到第38行代码设置矩形的内部填充格式,应用于ShapeRange集合的Fill属

性返回FillFormat对象,该对象包含指定的图表或图形的填充格式属性。

其中第35行代码设置矩形内部的透明度,第36行代码设置矩形内部为可见,第37行

代码设置矩形内部的前景色,第38行代码将矩形内部指定填充设为单色渐变,应用于

FillFormat对象的OneColorGradient方法将指定填充设为单色渐变,语法如下:

orGradient(Style, Variant, Degree)

其中参数Style是必需的,底纹样式,可为表格 2-1所示的MsoGradientStyle常量之

一。

常量

msoGradientDiagonalDown

msoGradientDiagonalUp

4

3

描述

斜下

斜上

5

VBA常用技巧代码解析

msoGradientFromCenter

msoGradientFromCorner

msoGradientFromTitle

msoGradientHorizontal

msoGradientMixed

msoGradientVertical

7

5

6

1

-2

2

角部幅射

中心幅射

水平

垂直

表格 1-4 MsoGradientStyle常量

参数Variant是必需的,渐变变量。取值范围为 1 到 4 之间,分别与“填充效果”对话

框中“渐变”选项卡的四个渐变变量相对应。如果GradientStyle 设为

msoGradientFromCenter,则Variant参数只能设为 1 或 2。

参数Degree是必需的,灰度。取值范围为 0.0(表示最深)到 1.0(表示最浅)之间。

第42、43行代码为矩形对象添加超链接,应用于Hyperlinks对象的Add方法向指定

的区域或图形添加超链接,语法如下:

(Anchor, Address, SubAddress, ScreenTip, TextToDisplay)

参数expression是必需的,返回一个Hyperlinks对象。

参数Anchor是必需的,超链接的位置。可为Range对象或Shape对象。

参数Address是必需的,超链接的地址。

参数SubAddress是必需的,超链接的子地址。

参数ScreenTip是可选的,当鼠标指针停留在超链接上时所显示的屏幕提示。

参数TextToDisplay是可选的,要显示的超链接的文本。

运行AddShape过程结果如图 1-1所示。

图 1-1 在工作表中添加图形

6

VBA常用技巧代码解析

技巧2 导出工作表中的图片

有时需要将工作表中的图形对象保存为单独的图像文件,可以使用Export方法将工作

表中的图片以文件形式导出,如下面的代码所示。

#001 Sub ExportShp()

#002 Dim Shp As Shape

#003 Dim FileName As String

#004 For Each Shp In

#005 If = msoPicture Then

#006 FileName = & "" & & ".gif"

#007

#008 With (0, 0, + 28,

+ 30).Chart

#009 .Paste

#010 .Export FileName, "gif"

#011 .

#012 End With

#013 End If

#014 Next

#015 End Sub

代码解析:

ExportShp过程将Sheet1工作表的所有图片以文件形式导出到同一目录中。

第4行代码使用Next 语句遍历Sheet1工作表中的所有图形。

第5行代码判断图形的类型是否为图片,应用于Shape对象的Type属性返回或设置

图形类型,可以为表格 2-1所示的MsoShapeType常量之一。

常量

msoShapeTypeMixed

msoAutoShape

msoCallout

msoChart

msoComment

msoFreeform

-2

1

2

3

4

5

说明

混合型图形

自选图形

没有边框线的标注

图表

批注

任意多边形

7

VBA常用技巧代码解析

msoGroup

msoFormControl

msoLine

msoLinkedOLEObject

msoLinkedPicture

msoOLEControlObject

msoPicture

msoTextEffect

msoTextBox

msoDiagram

6

8

9

10

11

12

13

15

17

21

图形组合

窗体控件

线条

链接式或内嵌OLE对象

剪贴画或图片

ActiveX 控件

图片

艺术字

文本框

组织结构图或其他图示

表格 2-1 MsoShapeType常量

第6行代码使用字符串变量FileName记录需导出图形的路径和名称。

第7行代码复制图形,应用于Shape对象的Copy方法将对象复制到剪贴板。

第8行代码使用Add方法在工作表中添加一个图表,应用于ChartObjects对象的Add

方法创建新的嵌入图表,语法如下:

(Left, Top, Width, Height)

参数expression是必需的,返回一个ChartObjects对象。

参数Left、参数Top是必需的,以磅为单位给出新对象的初始坐标,该坐标是相对于工

作表上单元格A1的左上角或图表的左上角的坐标。

参数Width、参数Height是必需的,以磅为单位给出新对象的初始大小。

第9行代码使用Paste方法将图形粘贴到新的嵌入图表中,应用于Chart对象的Paste

方法将剪贴板中的图表数据粘贴到指定的图表中,语法如下:

(Type)

参数expression是必需的,返回一个Chart对象。

参数Type是可选的的,如果剪贴板中有图表,本参数指定要粘贴的图表信息。可为以

下XlPasteType常量之一:xlFormats、xlFormulas或xlAll。默认值为xlAll,如果剪贴板中

是数据不是图表,则不能使用本参数。

第10行代码使用Export方法将图表导出到同一目录中,应用于Chart对象的Export

方法以图形格式导出图表,语法如下:

(Filename, FilterName, Interactive)

其中参数Filename是必需的,被导出的文件的名称。

第10行代码删除新建的图表。因为Chart对象是不能使用Delete方法直接删除的,应

先使用Parent属性返回指定对象的父对象,然后使用Delete方法删除。

8

VBA常用技巧代码解析

技巧3 在工作表中添加艺术字

在工作表中插入艺术字,可以使用AddTextEffect方法,如下面的代码所示。

#001 Sub TextEffect()

#002 Dim myShape As Shape

#003 On Error Resume Next

#004 ("myShape").Delete

#005 Set myShape = tEffect _

#006 (PresetTextEffect:=msoTextEffect15, _

#007 Text:="我爱 Excel Home", FontName:="宋体", FontSize:=36, _

#008 FontBold:=msoFalse, FontItalic:=msoFalse, _

#009 Left:=100, Top:=100)

#010 With myShape

#011 .Name = "myShape"

#012 With .Fill

#013 .Solid

#014 .Color = 55

#015 .Transparency = 0

#016 End With

#017 With .Line

#018 .Weight = 1.5

#019 .DashStyle = msoLineSolid

#020 .Style = msoLineSingle

#021 .Transparency = 0

#022 .Color = 12

#023 . = RGB(255, 255, 255)

#024 End With

#025 End With

#026 Set myShape = Nothing

#027 End Sub

代码解析:

9

VBA常用技巧代码解析

TextEffect过程在工作表中插入艺术字并设置其格式。

第3、4行代码删除工作表中可能存在的艺术字,以免重复添加。

第5行到第9行代码使用AddTextEffect方法在工作表中插入艺术字,AddTextEffect

方法创建艺术字对象。返回一个Shape对象,该对象代表新建的艺术字对象,语法如下:

tEffect(PresetTextEffect,

FontBold, FontItalic, Left, Top)

Text, FontName, FontSize,

参数expression是必需的,返回一个Shapes对象。

参数PresetTextEffect是必需的,艺术字预置文本效果,可为MsoPresetTextEffect 常

量之一,等同于在工作表中插入艺术字时的样式选项卡,如图 3-1所示。

图 3-1 艺术字样式

参数Text是必需的,艺术字对象中的文字。

参数FontName是必需的,艺术字对象中所用的字体名称。

参数FontSize是必需的,以磅为单位给出艺术字对象中所用的字体大小。

参数FontBold是必需的,在艺术字中要加粗的字体。

参数FontItalic是必需的,在艺术字中要倾斜的字体。

参数Left和参数Top是必需的,相对于文档的左上角、顶部,以磅为单位给出艺术字

对象边框左上角的位置。

第11行代码将艺术字对象重命名为“myShape”。

第12行到第16行代码设置艺术字对象的填充格式。其中第13行代码将填充格式设置

为均一的颜色,应用于FillFormat 对象的Solid方法将指定的填充格式设置为均一的颜色,

可用本方法将带有渐进色、纹理、图案或背景的填充格式转换为单色的填充格式。第14行

代码设置填充的颜色。第15行代码设置填充的透明度。

10

VBA常用技巧代码解析

第17行到第24行代码设置艺术字对象的线条格式属性。其中第18行代码设置线条粗

细,第19行代码设置线条虚线样式,第20行代码设置线条区域的样式,第21行代码设置

线条的透明度,第22行代码设置前景色,第23行代码设置填充背景的颜色。

运行TextEffect过程工作表中如图 3-2所示。

图 3-2 工作表中插入艺术字

技巧4 遍历工作表中的图形

工作表中的多个图形,如果使用系统缺省名称,如“文本框1”、“文本框2”这样前面

是固定的字符串,后面是序号的,可以使用Next 语句遍历图形,如下面的代码所示。

#001 Sub ErgShapes_1()

#002 Dim i As Integer

#003 For i = 1 To 4

#004 ("文本框 " & i). = ""

#005 Next

#006 End Sub

代码解析:

ErgShapes_1过程清除工作表中四个图形文本框中的文字。

第3行到第5行代码,使用Shapes属性在工作表上的三个图形文本框中循环。

Shapes属性返回Shapes对象,代表工作表或图形工作表上的所有图形,可以使用

Shapes(index)返回单个的Shape对象,其中index是图形的名称或索引号。

11

VBA常用技巧代码解析

返回单个的Shape对象后使用TextFrame 属性和Characters方法清除文本框中的字

符,关于Shape对象的TextFrame 属性和Characters方法请参阅技巧1 。

如果图形的名称没有规律,可以使用Next 语句循环遍历所有图形,根据

Type属性返回的图形类型进行相应的操作,如下面的代码所示。

#001 Sub ErgShapes_2()

#002 Dim myShape As Shape

#003 Dim i As Integer

#004 i = 1

#005 For Each myShape In

#006 If = msoTextBox Then

#007 = "这是第" & i & "个文本框"

#008 i = i + 1

#009 End If

#010 Next

#011 End Sub

代码解析:

ErgShapes_2过程在工作表中的所有图形文本框中写入文本。

第5行代码使用Next 语句循环遍历工作表中所有的图形对象。

第6行到第9行代码如果图形对象是文本框则在文本框中写入文本。其中第6行代码

根据Type属性判断图形对象是否为文本框,应用于Shape对象的Type属性返回或设置图

形类型,MsoShapeType类型,请参阅表格 2-1 。

第7行代码根据返回的Type属性值在所有的文本框内写入相应的文本,如图 4-1所示。

图 4-1 遍历所有的文本框

12

VBA常用技巧代码解析

技巧5 移动、旋转图片

工作表中的图片可以移动、旋转,如下面的代码所示。

#001 Sub MoveShape()

#002 Dim i As Long

#003 Dim j As Long

#004 With (1)

#005 For i = 1 To 3000 Step 5

#006 .Top = Sin(i * (3.1416 / 180)) * 100 + 100

#007 .Left = Cos(i * (3.1416 / 180)) * 100 + 100

#008 . = i * 100

#009 For j = 1 To 10

#010 .IncrementRotation -2

#011 DoEvents

#012 Next

#013 Next

#014 End With

#015 End Sub

代码解析:

MoveShape过程移动、旋转工作表中的图片并不断改变其填充的前景色。

第6行代码设置图片的Top属性值,应用于Shape对象的Top属性设置图形的顶端到

工作表顶端的距离。在循环的过程中使用Sin函数将Top属性值设置为一个圆形的弧度值。

Sin函数返回指定参数的正弦值,语法如下:

Sin(number)

参数number表示一个以弧度为单位的角。

Sin函数取一角度为参数值,并返回角的对边长度除以斜边长度的比值,将角度除以180

后即能角度转换为弧度。

第7行代码设置图片的Left属性值,应用于Shape对象的Left属性设置图形从左边界

至 A 列左边界(在工作表中)或图表区左边界(在图表工作表中)的距离。在循环的过程

中使用Cos函数将Left属性值设置为一个圆形的弧度值。Cos函数返回指定一个角的余弦

值,语法如下:

Cos(number)

13

VBA常用技巧代码解析

参数number表示一个以弧度为单位的角。

Cos函数的number参数为一个角,并返回直角三角形两边的比值,该比值为角的邻边

长度除以斜边长度之商,将角度除以180后即能角度转换为弧度。

第8行代码设置图片填充的前景色随着循环的过程不断的变化。使用Fill属性返回一个

FillFormat对象,FillFormat对象代表图形的填充格式,其ForeColor 属性设置对象填充的

前景色。

第9行到第11行代码在图形移动的过程中使用IncrementRotation方法设置图形绕 z

轴的转角,IncrementRotation方法以指定的度数为增量,更改指定的图形绕 z 轴的转角,

语法如下:

entRotation(Increment)

参数expression是必需的,返回一个Shape对象。

参数Increment是必需的,以度为单位指定图形在水平方向的旋转量,正值使图形按顺

时针方向旋转,负值使图形按逆时针方向旋转。

其中第11行是关键的代码,使用DoEvents函数转让控制权,否则达不到预计的视觉

效果。

运行MoveShape过程,工作表的图形在自身进行逆时针方向旋转的同时沿着一个圆形

的弧度进行移动,并不断改变其填充的颜色。

技巧6 工作表中自动插入图片

在日常工作中经常需要在工作表中插入大量图片,比如在如图 6-1所示的工作表中需

要根据A列的名称在C列插入保存在同一目录中的相应的图片,如果使用手工插入不仅非

常繁琐且极易出错,而使用VBA代码可以很好的完成操作。

14

VBA常用技巧代码解析

图 6-1 需插入图片的工作表

示例代码如下:

#001 Sub insertPic()

#002 Dim i As Integer

#003 Dim FilPath As String

#004 Dim rng As Range

#005 Dim s As String

#006 With Sheet1

#007 For i = 3 To .Range("a65536").End(xlUp).Row

#008 FilPath = & "" & .Cells(i, 1).Text & ".jpg"

#009 If Dir(FilPath) <> "" Then

#010 .(FilPath).Select

#011 Set rng = .Cells(i, 3)

#012 With Selection

#013 .Top = + 1

#014 .Left = + 1

#015 .Width = - 1

#016 .Height = - 1

#017 End With

#018 Else

#019 s = s & Chr(10) & .Cells(i, 1).Text

#020 End If

#021 Next

15

VBA常用技巧代码解析

#022 .Cells(3, 1).Select

#023 End With

#024 If s <> "" Then

#025 MsgBox s & Chr(10) & "没有照片!"

#026 End If

#027 End Sub

代码解析:

insertPic过程使用Insert方法在工作表中插入图片。

第7行代码开始Next循环,循环的终值由工作表中A列单元格的行数所决定。

第8行代码字符串变量FilPath保存A列名称单元格所对应的图片文件的路径和文件

名,本例中图片文件的文件名应和A列中的名称一致。

第9行到第11行代码使用Dir函数在同一文件夹中查找与A列单元格中的名称相对应

的图片文件,如果对应的图片文件存在则使用Insert方法将图片插入到工作表中,并将C

列的单元格赋给变量rng。

Dir函数返回一个String,用以表示一个文件名、目录名或文件夹名称,它必须与指定

的模式或文件属性、或磁盘卷标相匹配。如果已没有合乎条件的文件,则Dir函数会返回一

个零长度字符串 ("")。

第12行到第17行代码,当图片片插入到工作表时其实是插入到活动单元格的,此时

需设置图片的Top属性和Left属性将图片移动到C列所对应的单元格中,并设置其Width

属性和Height属性使其适应所在单元格的大小。

第18、19行代码如果在同一文件夹中没有与A列单元格对应的图片文件,则使用字符

串变量s保存没有图片文件的名称。

第24行到第26行代码如果字符串变量s不等于空白说明文件夹中缺少图片文件,使

用消息框提示。

运行insertPic过程工作表如图 6-2所示。

16

VBA常用技巧代码解析

图 6-2 插入图片后的工作表

如果文件夹中缺少对应的图片文件,则会进行提示,如图 6-3所示。

图 6-3 缺少图片文件提示

技巧7 固定工作表中图形的位置

17

VBA常用技巧代码解析

工作表中插入的图片,一般都是固定的尺寸和固定的单元格区域中的,但在实际使用中

可能因一些人为的因素导致图片位置偏移或尺寸变化,此时可以使用VBA代码进行调整,

如下面的代码所示。

#001 Sub ShapeAddress()

#002 Dim rng As Range

#003 Set rng = ("B4:E22")

#004 With ("Picture 1")

#005 .Rotation = 0

#006 .Select

#007 With Selection

#008 .Top = rng(1).Top + 1

#009 .Left = rng(1).Left + 1

#010 .Width = - 0.5

#011 .Height = - 0.5

#012 End With

#013 End With

#014 Range("A1").Select

#015 End Sub

代码解析:

ShapeAddress过程调整指定图形在工作表中的位置。

第3行代码变量rng保存工作表中插入图片的单元格区域。。

第5行代码设置图片的转角,应用于Shape对象Rotation属性以度为单位返回或设置

图形的转角,设置为正值向右偏转,设置为负值向左偏转,设置为零图片则保持90度垂直。

第7行到第12行代码设置图片的Top属性和Left属性将图片移动到变量rng所保存的

单元格区域中,并设置其Width属性和Height属性使其适应所在单元格区域的大小。

第14行代码选择A1单元格,不然图片会处于选中状态。

经过以上设置,工作表中的图片“Picture 1”不管处于什么状态都可以一键恢复其原来

的大小、位置。

18

VBA常用技巧代码解析

技巧8 使用VBA自动生成图表

在实际工作中我们常用图表来表现数据间的某种相对关系,一般采用手工插入的方式,

而使用VBA代码可以在工作表中自动生成图表,如下面的示例代码。

#001 Sub ChartAdd()

#002 Dim myRange As Range

#003 Dim myChart As ChartObject

#004 Dim R As Integer

#005 With Sheet1

#006 .

#007 R = .Range("A65536").End(xlUp).Row

#008 Set myRange = .Range("A" & 1 & ":B" & R)

#009 Set myChart = .(120, 40, 400, 250)

#010 With

#011 .ChartType = xlColumnClustered

#012 .SetSourceData Source:=myRange, PlotBy:=xlColumns

#013 .ApplyDataLabels ShowValue:=True

#014 .HasTitle = True

#015 . = "图表制作示例"

#016 With .

#017 .Size = 20

#018 .ColorIndex = 3

#019 .Name = "华文新魏"

#020 End With

#021 With .or

#022 .ColorIndex = 8

#023 .PatternColorIndex = 1

#024 .Pattern = xlSolid

#025 End With

#026 With .or

#027 .ColorIndex = 35

#028 .PatternColorIndex = 1

19

VBA常用技巧代码解析

#029 .Pattern = xlSolid

#030 End With

#031 .SeriesCollection(1).

#032 With .SeriesCollection(2).

#033 .Size = 10

#034 .ColorIndex = 5

#035 End With

#036 End With

#037 End With

#038 Set myRange = Nothing

#039 Set myChart = Nothing

#040 End Sub

代码解析:

ChartAdd过程在工作表中自动生成图表,图表类型为簇状柱形图。

第6行代码使用Delete方法删除工作表中已经存在的图表,而ChartObjects方法返回

代表工作表中单个嵌入图表(ChartObject对象)或所有嵌入图表的集合(ChartObjects对

象)的对象,语法如下:

bjects(Index)

其中参数Index是可选的,指定图表的名称或号码。该参数可以是数组,用于指定多个

图表,因为示例中只有一个图表,所以无需指定其Index参数。

第8行代码指定图表的数据源。

第9行代码使用Add方法创建一个新图表,应用于ChartObjects对象的Add方法创建

新的嵌入图表,语法如下:

(Left, Top, Width, Height)

参数Left、Top是必需的,以磅为单位给出新对象的初始坐标,该坐标是相对于工作表

上单元格A1的左上角或图表的左上角的坐标。

参数Width、Height是必需,以磅为单位给出新对象的初始大小。

第10行代码使用Chart属性返回新创建的图表,应用于ChartObject对象的Chart属

性返回一个Chart对象,该对象代表指定对象所包含的图表。

第11行代码指定新创建图表的图表类型,应用于Chart对象的ChartType属性返回或

设置图表的类型,可以为XlChartType常量之一,具体请参阅VBA帮助。本例中设置为

xlColumnClustered即图表类型为簇状柱形图。

第12行代码指定图表的数据源和绘图方式,应用于Chart对象的SetSourceData方法

20

VBA常用技巧代码解析

为指定图表设置源数据区域,语法如下:

rceData(Source, PlotBy)

参数expression是必需的,该表达式返回一个Chart对象。

参数Source是可选的,源数据的区域。

参数PlotBy是可选的,指定数据绘制方式,可为xlColumns(系列产生在列)或xlRows

(系列产生在行)。

第13行代码使用ApplyDataLabels方法使图表显示数据标签和数据点的值,应用于

Chart对象的ApplyDataLabels方法将数据标签应用于图表中的某一数据点、某一数据系列

或所有数据系列,语法如下:

ataLabels(Type, LegendKey, AutoText, HasLeaderLines,

ShowSeriesName, ShowCategoryName, ShowValue, ShowPercentage, ShowBubbleSize,

Separator)

参数expression是必需的,该表达式返回一个Chart对象。

参数Type是可选的,要应用的数据标签的类型,可为表格 8-1所列的

XlDataLabelsType 常量之一。

常量

xlDataLabelsShowBubbleSizes

6

描述

占总数的百分比及数据点所属的分类。仅用于饼图或圆环图。

占总数的百分比。仅用于饼图或圆环图。

数据点所属的分类。

xlDataLabelsShowLabelAndPercent 5

xlDataLabelsShowPercent

xlDataLabelsShowLabel

xlDataLabelsShowNone

xlDataLabelsShowValue

3

4

-4142 无数据标签。

2 数据点的值,若未指定本参数,默认使用此设置。

表格 8-1 XlDataLabelsType 常量

参数LegendKey是可选的,如果该值为True,则显示数据点旁的图例项标示。默认值

为False。

参数AutoText是可选的,如果对象根据内容自动生成正确的文字,则该值为True。

参数HasLeaderLines是可选的,如果数据系列具有引导线,则该值为True。

参数ShowSeriesName是可选的,数据标签的系列名称。

参数ShowCategoryName是可选的,数据标签的分类名称。

参数ShowValue是可选的,数据标签的值。

参数ShowPercentage是可选的,数据标签的百分比。

参数ShowBubbleSize是可选的,数据标签的气泡尺寸。

参数Separator是可选的,数据标签的分隔符。

21

VBA常用技巧代码解析

第14、15行代码设置新创建的图表有可见的标题并设置图表标题的文字。应用于Chart

对象的HasTitle属性,如果坐标轴或图表有可见标题,则该值为True,而ChartTitle属性

返回一个ChartTitle对象,代表指定图表的标题。

第16行到第20行代码设置图表标题文字的格式。

第21行到第25行代码设置图表区的颜色。

第26行到第30行代码设置绘图区的颜色。

第31行代码删除图表上第一个数据系列中的数据标签。SeriesCollection方法返回图

表或图表组中单个数据系列(Series对象)或所有数据系列的集合(SeriesCollection集合)

的对象,语法如下:

Collection(Index)

可选的Index参数指定数据系列的名称或编号。

而DataLabels方法则返回代表数据系列中的单个数据标签(DataLabel对象)或所有

数据标签的集合(DataLabels集合)的对象,语法如下:

bels(Index)

可选的Index参数指定数据系列中的数据标签的编号。

第32行到第36行代码设置图表上第二个数据系列中的数据标签的字体格式。

运行ChartAdd过程,在工作表中创建簇状柱形图,如图 8-1所示。

图 8-1 创建簇状柱形图

22

VBA常用技巧代码解析

技巧9 使用独立窗口显示图表

如果需要将工作表中嵌入的图表显示在独立的窗口中,可以使用下面的代码。

#001 Sub ChartShow()

#002 With bjects(1)

#003 .Activate

#004 .ndow = True

#005 End With

#006 With ActiveWindow

#007 .Top = 50

#008 .Left = 50

#009 .Width = 400

#010 .Height = 280

#011 .Caption =

#012 End With

#013 End Sub

代码解析:

ChartShow过程,将工作表中嵌入的图表显示在独立的窗口中。

第2行到第5行代码将工作表中指定图表的ShowWindow属性设置为True,使用独立

的窗口显示该图表。

第7、8行代码指定活动窗口显示的位置。

第9、10行代码调整活动窗口的大小使之适应图表的大小。

第11行代码指定活动窗口标题栏中显示的标题。

运行ChartShow过程结果如图 9-1所示。

23

VBA常用技巧代码解析

图 9-1 使用独立窗口显示图表

技巧10 导出工作表中的图表

如果需要将工作表中的图表保存为单独的图像文件,可以使用Export方法以图形文件

格式导出图表,示例代码如下。

#001 Sub ExportChart()

#002 Dim myChart As Chart

#003 Dim myFileName As String

#004 Set myChart = bjects(1).Chart

#005 myFileName = ""

#006 On Error Resume Next

#007 Kill & "" & myFileName

#008 Filename:= _

#009 & "" & myFileName, Filtername:="JPG"

24

VBA常用技巧代码解析

#010 MsgBox "图表已保存在[" & & "]文件夹中!"

#011 Set myChart = Nothing

#012 End Sub

代码解析:

ExportChart过程使用Export方法将工作表中的图表以图形文件的形式导出。

第4行代码指定工作表中的图表对象。

第5行代码指定图形文件保存的文件名。

第6、7行代码使用Kill语句删除文件夹中原有的图形文件。当文件夹中指定删除的文

件不存在时Kill语句会出错所以需要使用On Error语句忽略错误。

第8、9行代码使用Export方法将图表导出到同一目录中,应用于Chart对象的Export

方法以图形文件格式导出图表,语法如下:

(Filename, FilterName, Interactive)

其中参数Filename是必需的,被导出的文件的名称,示例中加上了文件保存的路径。

参数FilterName是可选的,被导出的文件的图形格式,示例中文件以JPG文件格式保

存。

技巧11 多图表制作

如果需要,我们可以为工作表中的每一个数据区域创建一张图表,在如图 11-1所示的

工作表区域中,需要为每一个员工的全年数据创建一张图表。

图 11-1 数据区域

25

VBA常用技巧代码解析

示例代码如下:

#001 Sub ChartsAdd()

#002 Dim myChart As ChartObject

#003 Dim i As Integer

#004 Dim R As Integer

#005 Dim m As Integer

#006 R = ("A65536").End(xlUp).Row - 1

#007 m = Abs(Int(-(R / 4)))

#008

#009 For i = 1 To R

#010 Set myChart = _

#011 (Left:=(((i - 1) Mod m) + 1) * 350 - 320, _

#012 Top:=((i - 1) m + 1) * 220 - 210, _

#013 Width:=330, Height:=210)

#014 With

#015 .ChartType = xlColumnClustered

#016 .SetSourceData Source:=("B2:M2").Offset(i - 1),

_

#017 PlotBy:=xlRows

#018 With .SeriesCollection(1)

#019 .XValues = ("B1:M1")

#020 .Name = ("A2").Offset(i - 1)

#021 .ApplyDataLabels AutoText:=True, ShowValue:=True

#022 . = 10

#023 End With

#024 .HasLegend = False

#025 With .ChartTitle

#026 .Left = 5

#027 .Top = 1

#028 . = 14

#029 . = "华文行楷"

#030 End With

26

VBA常用技巧代码解析

#031 With .or

#032 .ColorIndex = 2

#033 .PatternColorIndex = 1

#034 .Pattern = xlSolid

#035 End With

#036 .Axes(xlCategory). = 10

#037 .Axes(xlValue). = 10

#038 End With

#039 Next

#040

#041 Set myChart = Nothing

#042 End Sub

代码解析:

ChartsAdd过程根据数据工作表A列的人数在图表工作表中创建图表并分4行排列整

齐。

第6行代码取得数据工作表中需要创建图表的人数。

第7行代码计算图表工作表每行需要排列的图表数目,共分4行排列。使用Int函数返

回图表数目除4行后的整数部分,使用负值是为了向上取整数,最后使用Abs函数返回绝

对值,将负值转化为正值。

第8行代码使用Delete方法删除图表工作表中存在的所有图表。

第9行代码开始Next循环,循环的终值由需要创建的图表数目决定。

第10行到第13行代码使用Add方法在图表工作表中创建嵌入的图表,关于应用于

ChartObjects对象的Add方法请参阅技巧8 。其中第11、12行代码根据循环计数器的数

值设置新创建图表的Left和Top属性使之依次排列。第13行代码设置图表的大小。

第15行代码设置新创建图表的类型。

第16、17行代码根据循环计数器的数值分别设置新创建图表的数据源。

第18行到第23行代码设置图表第一个数据系列的名称、数据标签和字体格式。

第24行代码删除图表中的图例。

第25行到第30行代码设置图表的标题。

第31行到第35行代码设置图表的绘图区。

第36、37行代码设置图表坐标轴的字体大小。

关于图表的设置请参阅技巧8 。

运行ChartsAdd过程图表工作表中如所示。

27

VBA常用技巧代码解析

图 11-2 图表工作表

28

2024年4月23日发(作者:张简雅琴)

VBA常用技巧代码解析

VBA常用技巧

目录

VBA常用技巧 ................................................................................................................................... 1

第4章 Shape(图形)、Chart(图表)对象 .................................................................. 2

技巧1 在工作表中添加图形 ....................................................................................... 2

技巧2 导出工作表中的图片 ....................................................................................... 7

技巧3 在工作表中添加艺术字 ................................................................................... 9

技巧4 遍历工作表中的图形 ..................................................................................... 11

技巧5 移动、旋转图片 ............................................................................................. 13

技巧6 工作表中自动插入图片 ................................................................................. 14

技巧7 固定工作表中图形的位置 ............................................................................. 17

技巧8 使用VBA自动生成图表 .............................................................................. 19

技巧9 使用独立窗口显示图表 ................................................................................. 23

技巧10 导出工作表中的图表 ................................................................................... 24

技巧11 多图表制作 ................................................................................................... 25

1

VBA常用技巧代码解析

第4章 Shape(图形)、Chart(图表)对象

技巧1 在工作表中添加图形

如果需要在工作表中添加图形对象,可以使用AddShape方法,如下面的代码所示。

#001 Sub AddShape()

#002 Dim myShape As Shape

#003 On Error Resume Next

#004 ("myShape").Delete

#005 Set myShape = pe(msoShapeRectangle, 40, 120, 280,

30)

#006 With myShape

#007 .Name = "myShape"

#008 With .ters

#009 .Text = "单击将选择Sheet2!"

#010 With .Font

#011 .Name = "华文行楷"

#012 .FontStyle = "常规"

#013 .Size = 22

#014 .ColorIndex = 7

#015 End With

#016 End With

#017 With .TextFrame

#018 .HorizontalAlignment = -4108

#019 .VerticalAlignment = -4108

#020 End With

#021 .Placement = 3

2

VBA常用技巧代码解析

#022 End With

#023

#024 With ange

#025 With .Line

#026 .Weight = 1

#027 .DashStyle = msoLineSolid

#028 .Style = msoLineSingle

#029 .Transparency = 0

#030 .Visible = msoTrue

#031 .Color = 40

#032 . = RGB(255, 255, 255)

#033 End With

#034 With .Fill

#035 .Transparency = 0

#036 .Visible = msoTrue

#037 .Color = 41

#038 .OneColorGradient 1, 4, 0.23

#039 End With

#040 End With

#041 ("A1").Select

#042 Anchor:=myShape, Address:="", _

#043 SubAddress:="Sheet2!A1", ScreenTip:="选择Sheet2!"

#044 Set myShape = Nothing

#045 End Sub

代码解析:

AddShape过程在工作表中添加一个矩形并设置其外观等属性。

第2行代码声明变量myShape的对象类型。

第3、4行代码删除可能存在的名称为“myShape”的图形对象。

第5行代码使用AddShape方法在工作表中添加一个矩形。当该方法应用于Shapes

对象时,返回一个Shape对象,该对象代表工作表中的新自选图形,语法如下:

pe(Type, Left, Top, Width, Height)

参数expression是必需的,返回一个Shapes对象。

3

VBA常用技巧代码解析

参数Type是必需的,指定要创建的自选图形的类型。

参数Left和Top是必需的,以磅为单位给出自选图形边框左上角的位置。

参数Width和Height是必需的,以磅为单位给出自选图形边框的宽度和高度。

第7行代码将新建图形命名为“myShape”,向Shapes集合添加新的图形时,将对新

添加的图形赋以默认的名称,若要为图形指定更有意义的名称,可指定其Name属性。

第8行到第16行代码为矩形添加文字,并设定其格式。

其中第8行代码使用TextFrame 属性和Characters方法返回该矩形的字符区域。应用

于Shape对象的TextFrame 属性返回一个TextFrame对象,该对象包含指定图形对象的

对齐和定位属性;Characters方法返回一个Characters对象,该对象代表某个图形的文本

框中的字符区域,语法如下:

ters(Start, Length)

参数expression是必需的,返回一个指定文本框内Characters对象的表达式。

参数Start是可选的,表示将要返回的第一个字符,如果此参数设置为 1 或被忽略,

则Characters方法会返回以第一个字符为起始字符的字符区域。

参数Length是可选的,表示要返回的字符个数。如果此参数被忽略,则Characters方

法会返回该字符串的剩余部分(由Start参数指定的字符以后的所有字符)。

第9行代码为矩形添加文字,应用于Characters对象的Text属性返回或设置对象的文

本,为可读写的String类型。

第10行到第15行代码设置矩形中文字的属性,应用于Characters对象Font属性返

回一个Font对象,该对象代表指定对象的字体属性(字体名称、字体大小、字体颜色等),

第11行代码设置字体名称,第12行代码设置字体样式,第13行代码设置字体大小,第14

行代码颜色。

第17行到第20行代码设定矩形中文字的对齐方式。应用于TextFrame对象的

HorizontalAlignment属性返回或设置指定对象的水平对齐方式,可为表格 1-1所示的

XlHAlign常量之一。

常量

xlHAlignCenter

xlHAlignCenterAcrossSelection

xlHAlignDistributed

xlHAlignFill

xlHAlignGeneral

xlHAlignJustify

xlHAlignLeft

xlHAlignRight

-4108

7

-4117

5

1

-4130

-4131

-4152

描述

居中

靠左

分散对齐

分散对齐

靠左

两端对齐

靠左

靠右

表格 1-1 HorizontalAlignment属性的XlHAlign常量

4

VBA常用技巧代码解析

应用于TextFrame对象的VerticalAlignment属性返回或设置指定对象的垂直对齐方式,

可为表格 1-2所示的XlHAlign常量之一。

常量

xlVAlignCenter

xlVAlignJustify

xlVAlignBottom

xlVAlignDistributed

xlVAlignTop

-4108

-4130

-4107

-4117

-4160

描述

居中

两端对齐

靠下

分散对齐

靠上

表格 1-2 VerticalAlignment属性的XlHAlign常量

第21行代码设置矩形大小和位置不随单元格而变,应用于Shape对象的Placement

属性返回或设置对象与所在的单元格之间的附属关系,可为表格 1-3所示的XlPlacement

常量之一。

常量

xlFreeFloating

xlMove

xlMoveAndSize

3

2

1

描述

大小、位置均固定

大小固定、位置随单元格而变

大小、位置随单元格而变

表格 1-3 XlPlacement常量

第24行到第32行代码设置矩形的边框线条格式,应用于ShapeRange集合的Line属

性返回一个LineFormat 对象,该对象包含指定图形的线条格式属性。

其中第26行代码设置矩形线条粗细,第27行代码设置矩形线条的虚线样式,第28行

代码设置矩形填充的透明度,第29行代码设置矩形为可见,第30行代码设置矩形的前景

色,第31行代码设置矩形填充背景的颜色。

第33行到第38行代码设置矩形的内部填充格式,应用于ShapeRange集合的Fill属

性返回FillFormat对象,该对象包含指定的图表或图形的填充格式属性。

其中第35行代码设置矩形内部的透明度,第36行代码设置矩形内部为可见,第37行

代码设置矩形内部的前景色,第38行代码将矩形内部指定填充设为单色渐变,应用于

FillFormat对象的OneColorGradient方法将指定填充设为单色渐变,语法如下:

orGradient(Style, Variant, Degree)

其中参数Style是必需的,底纹样式,可为表格 2-1所示的MsoGradientStyle常量之

一。

常量

msoGradientDiagonalDown

msoGradientDiagonalUp

4

3

描述

斜下

斜上

5

VBA常用技巧代码解析

msoGradientFromCenter

msoGradientFromCorner

msoGradientFromTitle

msoGradientHorizontal

msoGradientMixed

msoGradientVertical

7

5

6

1

-2

2

角部幅射

中心幅射

水平

垂直

表格 1-4 MsoGradientStyle常量

参数Variant是必需的,渐变变量。取值范围为 1 到 4 之间,分别与“填充效果”对话

框中“渐变”选项卡的四个渐变变量相对应。如果GradientStyle 设为

msoGradientFromCenter,则Variant参数只能设为 1 或 2。

参数Degree是必需的,灰度。取值范围为 0.0(表示最深)到 1.0(表示最浅)之间。

第42、43行代码为矩形对象添加超链接,应用于Hyperlinks对象的Add方法向指定

的区域或图形添加超链接,语法如下:

(Anchor, Address, SubAddress, ScreenTip, TextToDisplay)

参数expression是必需的,返回一个Hyperlinks对象。

参数Anchor是必需的,超链接的位置。可为Range对象或Shape对象。

参数Address是必需的,超链接的地址。

参数SubAddress是必需的,超链接的子地址。

参数ScreenTip是可选的,当鼠标指针停留在超链接上时所显示的屏幕提示。

参数TextToDisplay是可选的,要显示的超链接的文本。

运行AddShape过程结果如图 1-1所示。

图 1-1 在工作表中添加图形

6

VBA常用技巧代码解析

技巧2 导出工作表中的图片

有时需要将工作表中的图形对象保存为单独的图像文件,可以使用Export方法将工作

表中的图片以文件形式导出,如下面的代码所示。

#001 Sub ExportShp()

#002 Dim Shp As Shape

#003 Dim FileName As String

#004 For Each Shp In

#005 If = msoPicture Then

#006 FileName = & "" & & ".gif"

#007

#008 With (0, 0, + 28,

+ 30).Chart

#009 .Paste

#010 .Export FileName, "gif"

#011 .

#012 End With

#013 End If

#014 Next

#015 End Sub

代码解析:

ExportShp过程将Sheet1工作表的所有图片以文件形式导出到同一目录中。

第4行代码使用Next 语句遍历Sheet1工作表中的所有图形。

第5行代码判断图形的类型是否为图片,应用于Shape对象的Type属性返回或设置

图形类型,可以为表格 2-1所示的MsoShapeType常量之一。

常量

msoShapeTypeMixed

msoAutoShape

msoCallout

msoChart

msoComment

msoFreeform

-2

1

2

3

4

5

说明

混合型图形

自选图形

没有边框线的标注

图表

批注

任意多边形

7

VBA常用技巧代码解析

msoGroup

msoFormControl

msoLine

msoLinkedOLEObject

msoLinkedPicture

msoOLEControlObject

msoPicture

msoTextEffect

msoTextBox

msoDiagram

6

8

9

10

11

12

13

15

17

21

图形组合

窗体控件

线条

链接式或内嵌OLE对象

剪贴画或图片

ActiveX 控件

图片

艺术字

文本框

组织结构图或其他图示

表格 2-1 MsoShapeType常量

第6行代码使用字符串变量FileName记录需导出图形的路径和名称。

第7行代码复制图形,应用于Shape对象的Copy方法将对象复制到剪贴板。

第8行代码使用Add方法在工作表中添加一个图表,应用于ChartObjects对象的Add

方法创建新的嵌入图表,语法如下:

(Left, Top, Width, Height)

参数expression是必需的,返回一个ChartObjects对象。

参数Left、参数Top是必需的,以磅为单位给出新对象的初始坐标,该坐标是相对于工

作表上单元格A1的左上角或图表的左上角的坐标。

参数Width、参数Height是必需的,以磅为单位给出新对象的初始大小。

第9行代码使用Paste方法将图形粘贴到新的嵌入图表中,应用于Chart对象的Paste

方法将剪贴板中的图表数据粘贴到指定的图表中,语法如下:

(Type)

参数expression是必需的,返回一个Chart对象。

参数Type是可选的的,如果剪贴板中有图表,本参数指定要粘贴的图表信息。可为以

下XlPasteType常量之一:xlFormats、xlFormulas或xlAll。默认值为xlAll,如果剪贴板中

是数据不是图表,则不能使用本参数。

第10行代码使用Export方法将图表导出到同一目录中,应用于Chart对象的Export

方法以图形格式导出图表,语法如下:

(Filename, FilterName, Interactive)

其中参数Filename是必需的,被导出的文件的名称。

第10行代码删除新建的图表。因为Chart对象是不能使用Delete方法直接删除的,应

先使用Parent属性返回指定对象的父对象,然后使用Delete方法删除。

8

VBA常用技巧代码解析

技巧3 在工作表中添加艺术字

在工作表中插入艺术字,可以使用AddTextEffect方法,如下面的代码所示。

#001 Sub TextEffect()

#002 Dim myShape As Shape

#003 On Error Resume Next

#004 ("myShape").Delete

#005 Set myShape = tEffect _

#006 (PresetTextEffect:=msoTextEffect15, _

#007 Text:="我爱 Excel Home", FontName:="宋体", FontSize:=36, _

#008 FontBold:=msoFalse, FontItalic:=msoFalse, _

#009 Left:=100, Top:=100)

#010 With myShape

#011 .Name = "myShape"

#012 With .Fill

#013 .Solid

#014 .Color = 55

#015 .Transparency = 0

#016 End With

#017 With .Line

#018 .Weight = 1.5

#019 .DashStyle = msoLineSolid

#020 .Style = msoLineSingle

#021 .Transparency = 0

#022 .Color = 12

#023 . = RGB(255, 255, 255)

#024 End With

#025 End With

#026 Set myShape = Nothing

#027 End Sub

代码解析:

9

VBA常用技巧代码解析

TextEffect过程在工作表中插入艺术字并设置其格式。

第3、4行代码删除工作表中可能存在的艺术字,以免重复添加。

第5行到第9行代码使用AddTextEffect方法在工作表中插入艺术字,AddTextEffect

方法创建艺术字对象。返回一个Shape对象,该对象代表新建的艺术字对象,语法如下:

tEffect(PresetTextEffect,

FontBold, FontItalic, Left, Top)

Text, FontName, FontSize,

参数expression是必需的,返回一个Shapes对象。

参数PresetTextEffect是必需的,艺术字预置文本效果,可为MsoPresetTextEffect 常

量之一,等同于在工作表中插入艺术字时的样式选项卡,如图 3-1所示。

图 3-1 艺术字样式

参数Text是必需的,艺术字对象中的文字。

参数FontName是必需的,艺术字对象中所用的字体名称。

参数FontSize是必需的,以磅为单位给出艺术字对象中所用的字体大小。

参数FontBold是必需的,在艺术字中要加粗的字体。

参数FontItalic是必需的,在艺术字中要倾斜的字体。

参数Left和参数Top是必需的,相对于文档的左上角、顶部,以磅为单位给出艺术字

对象边框左上角的位置。

第11行代码将艺术字对象重命名为“myShape”。

第12行到第16行代码设置艺术字对象的填充格式。其中第13行代码将填充格式设置

为均一的颜色,应用于FillFormat 对象的Solid方法将指定的填充格式设置为均一的颜色,

可用本方法将带有渐进色、纹理、图案或背景的填充格式转换为单色的填充格式。第14行

代码设置填充的颜色。第15行代码设置填充的透明度。

10

VBA常用技巧代码解析

第17行到第24行代码设置艺术字对象的线条格式属性。其中第18行代码设置线条粗

细,第19行代码设置线条虚线样式,第20行代码设置线条区域的样式,第21行代码设置

线条的透明度,第22行代码设置前景色,第23行代码设置填充背景的颜色。

运行TextEffect过程工作表中如图 3-2所示。

图 3-2 工作表中插入艺术字

技巧4 遍历工作表中的图形

工作表中的多个图形,如果使用系统缺省名称,如“文本框1”、“文本框2”这样前面

是固定的字符串,后面是序号的,可以使用Next 语句遍历图形,如下面的代码所示。

#001 Sub ErgShapes_1()

#002 Dim i As Integer

#003 For i = 1 To 4

#004 ("文本框 " & i). = ""

#005 Next

#006 End Sub

代码解析:

ErgShapes_1过程清除工作表中四个图形文本框中的文字。

第3行到第5行代码,使用Shapes属性在工作表上的三个图形文本框中循环。

Shapes属性返回Shapes对象,代表工作表或图形工作表上的所有图形,可以使用

Shapes(index)返回单个的Shape对象,其中index是图形的名称或索引号。

11

VBA常用技巧代码解析

返回单个的Shape对象后使用TextFrame 属性和Characters方法清除文本框中的字

符,关于Shape对象的TextFrame 属性和Characters方法请参阅技巧1 。

如果图形的名称没有规律,可以使用Next 语句循环遍历所有图形,根据

Type属性返回的图形类型进行相应的操作,如下面的代码所示。

#001 Sub ErgShapes_2()

#002 Dim myShape As Shape

#003 Dim i As Integer

#004 i = 1

#005 For Each myShape In

#006 If = msoTextBox Then

#007 = "这是第" & i & "个文本框"

#008 i = i + 1

#009 End If

#010 Next

#011 End Sub

代码解析:

ErgShapes_2过程在工作表中的所有图形文本框中写入文本。

第5行代码使用Next 语句循环遍历工作表中所有的图形对象。

第6行到第9行代码如果图形对象是文本框则在文本框中写入文本。其中第6行代码

根据Type属性判断图形对象是否为文本框,应用于Shape对象的Type属性返回或设置图

形类型,MsoShapeType类型,请参阅表格 2-1 。

第7行代码根据返回的Type属性值在所有的文本框内写入相应的文本,如图 4-1所示。

图 4-1 遍历所有的文本框

12

VBA常用技巧代码解析

技巧5 移动、旋转图片

工作表中的图片可以移动、旋转,如下面的代码所示。

#001 Sub MoveShape()

#002 Dim i As Long

#003 Dim j As Long

#004 With (1)

#005 For i = 1 To 3000 Step 5

#006 .Top = Sin(i * (3.1416 / 180)) * 100 + 100

#007 .Left = Cos(i * (3.1416 / 180)) * 100 + 100

#008 . = i * 100

#009 For j = 1 To 10

#010 .IncrementRotation -2

#011 DoEvents

#012 Next

#013 Next

#014 End With

#015 End Sub

代码解析:

MoveShape过程移动、旋转工作表中的图片并不断改变其填充的前景色。

第6行代码设置图片的Top属性值,应用于Shape对象的Top属性设置图形的顶端到

工作表顶端的距离。在循环的过程中使用Sin函数将Top属性值设置为一个圆形的弧度值。

Sin函数返回指定参数的正弦值,语法如下:

Sin(number)

参数number表示一个以弧度为单位的角。

Sin函数取一角度为参数值,并返回角的对边长度除以斜边长度的比值,将角度除以180

后即能角度转换为弧度。

第7行代码设置图片的Left属性值,应用于Shape对象的Left属性设置图形从左边界

至 A 列左边界(在工作表中)或图表区左边界(在图表工作表中)的距离。在循环的过程

中使用Cos函数将Left属性值设置为一个圆形的弧度值。Cos函数返回指定一个角的余弦

值,语法如下:

Cos(number)

13

VBA常用技巧代码解析

参数number表示一个以弧度为单位的角。

Cos函数的number参数为一个角,并返回直角三角形两边的比值,该比值为角的邻边

长度除以斜边长度之商,将角度除以180后即能角度转换为弧度。

第8行代码设置图片填充的前景色随着循环的过程不断的变化。使用Fill属性返回一个

FillFormat对象,FillFormat对象代表图形的填充格式,其ForeColor 属性设置对象填充的

前景色。

第9行到第11行代码在图形移动的过程中使用IncrementRotation方法设置图形绕 z

轴的转角,IncrementRotation方法以指定的度数为增量,更改指定的图形绕 z 轴的转角,

语法如下:

entRotation(Increment)

参数expression是必需的,返回一个Shape对象。

参数Increment是必需的,以度为单位指定图形在水平方向的旋转量,正值使图形按顺

时针方向旋转,负值使图形按逆时针方向旋转。

其中第11行是关键的代码,使用DoEvents函数转让控制权,否则达不到预计的视觉

效果。

运行MoveShape过程,工作表的图形在自身进行逆时针方向旋转的同时沿着一个圆形

的弧度进行移动,并不断改变其填充的颜色。

技巧6 工作表中自动插入图片

在日常工作中经常需要在工作表中插入大量图片,比如在如图 6-1所示的工作表中需

要根据A列的名称在C列插入保存在同一目录中的相应的图片,如果使用手工插入不仅非

常繁琐且极易出错,而使用VBA代码可以很好的完成操作。

14

VBA常用技巧代码解析

图 6-1 需插入图片的工作表

示例代码如下:

#001 Sub insertPic()

#002 Dim i As Integer

#003 Dim FilPath As String

#004 Dim rng As Range

#005 Dim s As String

#006 With Sheet1

#007 For i = 3 To .Range("a65536").End(xlUp).Row

#008 FilPath = & "" & .Cells(i, 1).Text & ".jpg"

#009 If Dir(FilPath) <> "" Then

#010 .(FilPath).Select

#011 Set rng = .Cells(i, 3)

#012 With Selection

#013 .Top = + 1

#014 .Left = + 1

#015 .Width = - 1

#016 .Height = - 1

#017 End With

#018 Else

#019 s = s & Chr(10) & .Cells(i, 1).Text

#020 End If

#021 Next

15

VBA常用技巧代码解析

#022 .Cells(3, 1).Select

#023 End With

#024 If s <> "" Then

#025 MsgBox s & Chr(10) & "没有照片!"

#026 End If

#027 End Sub

代码解析:

insertPic过程使用Insert方法在工作表中插入图片。

第7行代码开始Next循环,循环的终值由工作表中A列单元格的行数所决定。

第8行代码字符串变量FilPath保存A列名称单元格所对应的图片文件的路径和文件

名,本例中图片文件的文件名应和A列中的名称一致。

第9行到第11行代码使用Dir函数在同一文件夹中查找与A列单元格中的名称相对应

的图片文件,如果对应的图片文件存在则使用Insert方法将图片插入到工作表中,并将C

列的单元格赋给变量rng。

Dir函数返回一个String,用以表示一个文件名、目录名或文件夹名称,它必须与指定

的模式或文件属性、或磁盘卷标相匹配。如果已没有合乎条件的文件,则Dir函数会返回一

个零长度字符串 ("")。

第12行到第17行代码,当图片片插入到工作表时其实是插入到活动单元格的,此时

需设置图片的Top属性和Left属性将图片移动到C列所对应的单元格中,并设置其Width

属性和Height属性使其适应所在单元格的大小。

第18、19行代码如果在同一文件夹中没有与A列单元格对应的图片文件,则使用字符

串变量s保存没有图片文件的名称。

第24行到第26行代码如果字符串变量s不等于空白说明文件夹中缺少图片文件,使

用消息框提示。

运行insertPic过程工作表如图 6-2所示。

16

VBA常用技巧代码解析

图 6-2 插入图片后的工作表

如果文件夹中缺少对应的图片文件,则会进行提示,如图 6-3所示。

图 6-3 缺少图片文件提示

技巧7 固定工作表中图形的位置

17

VBA常用技巧代码解析

工作表中插入的图片,一般都是固定的尺寸和固定的单元格区域中的,但在实际使用中

可能因一些人为的因素导致图片位置偏移或尺寸变化,此时可以使用VBA代码进行调整,

如下面的代码所示。

#001 Sub ShapeAddress()

#002 Dim rng As Range

#003 Set rng = ("B4:E22")

#004 With ("Picture 1")

#005 .Rotation = 0

#006 .Select

#007 With Selection

#008 .Top = rng(1).Top + 1

#009 .Left = rng(1).Left + 1

#010 .Width = - 0.5

#011 .Height = - 0.5

#012 End With

#013 End With

#014 Range("A1").Select

#015 End Sub

代码解析:

ShapeAddress过程调整指定图形在工作表中的位置。

第3行代码变量rng保存工作表中插入图片的单元格区域。。

第5行代码设置图片的转角,应用于Shape对象Rotation属性以度为单位返回或设置

图形的转角,设置为正值向右偏转,设置为负值向左偏转,设置为零图片则保持90度垂直。

第7行到第12行代码设置图片的Top属性和Left属性将图片移动到变量rng所保存的

单元格区域中,并设置其Width属性和Height属性使其适应所在单元格区域的大小。

第14行代码选择A1单元格,不然图片会处于选中状态。

经过以上设置,工作表中的图片“Picture 1”不管处于什么状态都可以一键恢复其原来

的大小、位置。

18

VBA常用技巧代码解析

技巧8 使用VBA自动生成图表

在实际工作中我们常用图表来表现数据间的某种相对关系,一般采用手工插入的方式,

而使用VBA代码可以在工作表中自动生成图表,如下面的示例代码。

#001 Sub ChartAdd()

#002 Dim myRange As Range

#003 Dim myChart As ChartObject

#004 Dim R As Integer

#005 With Sheet1

#006 .

#007 R = .Range("A65536").End(xlUp).Row

#008 Set myRange = .Range("A" & 1 & ":B" & R)

#009 Set myChart = .(120, 40, 400, 250)

#010 With

#011 .ChartType = xlColumnClustered

#012 .SetSourceData Source:=myRange, PlotBy:=xlColumns

#013 .ApplyDataLabels ShowValue:=True

#014 .HasTitle = True

#015 . = "图表制作示例"

#016 With .

#017 .Size = 20

#018 .ColorIndex = 3

#019 .Name = "华文新魏"

#020 End With

#021 With .or

#022 .ColorIndex = 8

#023 .PatternColorIndex = 1

#024 .Pattern = xlSolid

#025 End With

#026 With .or

#027 .ColorIndex = 35

#028 .PatternColorIndex = 1

19

VBA常用技巧代码解析

#029 .Pattern = xlSolid

#030 End With

#031 .SeriesCollection(1).

#032 With .SeriesCollection(2).

#033 .Size = 10

#034 .ColorIndex = 5

#035 End With

#036 End With

#037 End With

#038 Set myRange = Nothing

#039 Set myChart = Nothing

#040 End Sub

代码解析:

ChartAdd过程在工作表中自动生成图表,图表类型为簇状柱形图。

第6行代码使用Delete方法删除工作表中已经存在的图表,而ChartObjects方法返回

代表工作表中单个嵌入图表(ChartObject对象)或所有嵌入图表的集合(ChartObjects对

象)的对象,语法如下:

bjects(Index)

其中参数Index是可选的,指定图表的名称或号码。该参数可以是数组,用于指定多个

图表,因为示例中只有一个图表,所以无需指定其Index参数。

第8行代码指定图表的数据源。

第9行代码使用Add方法创建一个新图表,应用于ChartObjects对象的Add方法创建

新的嵌入图表,语法如下:

(Left, Top, Width, Height)

参数Left、Top是必需的,以磅为单位给出新对象的初始坐标,该坐标是相对于工作表

上单元格A1的左上角或图表的左上角的坐标。

参数Width、Height是必需,以磅为单位给出新对象的初始大小。

第10行代码使用Chart属性返回新创建的图表,应用于ChartObject对象的Chart属

性返回一个Chart对象,该对象代表指定对象所包含的图表。

第11行代码指定新创建图表的图表类型,应用于Chart对象的ChartType属性返回或

设置图表的类型,可以为XlChartType常量之一,具体请参阅VBA帮助。本例中设置为

xlColumnClustered即图表类型为簇状柱形图。

第12行代码指定图表的数据源和绘图方式,应用于Chart对象的SetSourceData方法

20

VBA常用技巧代码解析

为指定图表设置源数据区域,语法如下:

rceData(Source, PlotBy)

参数expression是必需的,该表达式返回一个Chart对象。

参数Source是可选的,源数据的区域。

参数PlotBy是可选的,指定数据绘制方式,可为xlColumns(系列产生在列)或xlRows

(系列产生在行)。

第13行代码使用ApplyDataLabels方法使图表显示数据标签和数据点的值,应用于

Chart对象的ApplyDataLabels方法将数据标签应用于图表中的某一数据点、某一数据系列

或所有数据系列,语法如下:

ataLabels(Type, LegendKey, AutoText, HasLeaderLines,

ShowSeriesName, ShowCategoryName, ShowValue, ShowPercentage, ShowBubbleSize,

Separator)

参数expression是必需的,该表达式返回一个Chart对象。

参数Type是可选的,要应用的数据标签的类型,可为表格 8-1所列的

XlDataLabelsType 常量之一。

常量

xlDataLabelsShowBubbleSizes

6

描述

占总数的百分比及数据点所属的分类。仅用于饼图或圆环图。

占总数的百分比。仅用于饼图或圆环图。

数据点所属的分类。

xlDataLabelsShowLabelAndPercent 5

xlDataLabelsShowPercent

xlDataLabelsShowLabel

xlDataLabelsShowNone

xlDataLabelsShowValue

3

4

-4142 无数据标签。

2 数据点的值,若未指定本参数,默认使用此设置。

表格 8-1 XlDataLabelsType 常量

参数LegendKey是可选的,如果该值为True,则显示数据点旁的图例项标示。默认值

为False。

参数AutoText是可选的,如果对象根据内容自动生成正确的文字,则该值为True。

参数HasLeaderLines是可选的,如果数据系列具有引导线,则该值为True。

参数ShowSeriesName是可选的,数据标签的系列名称。

参数ShowCategoryName是可选的,数据标签的分类名称。

参数ShowValue是可选的,数据标签的值。

参数ShowPercentage是可选的,数据标签的百分比。

参数ShowBubbleSize是可选的,数据标签的气泡尺寸。

参数Separator是可选的,数据标签的分隔符。

21

VBA常用技巧代码解析

第14、15行代码设置新创建的图表有可见的标题并设置图表标题的文字。应用于Chart

对象的HasTitle属性,如果坐标轴或图表有可见标题,则该值为True,而ChartTitle属性

返回一个ChartTitle对象,代表指定图表的标题。

第16行到第20行代码设置图表标题文字的格式。

第21行到第25行代码设置图表区的颜色。

第26行到第30行代码设置绘图区的颜色。

第31行代码删除图表上第一个数据系列中的数据标签。SeriesCollection方法返回图

表或图表组中单个数据系列(Series对象)或所有数据系列的集合(SeriesCollection集合)

的对象,语法如下:

Collection(Index)

可选的Index参数指定数据系列的名称或编号。

而DataLabels方法则返回代表数据系列中的单个数据标签(DataLabel对象)或所有

数据标签的集合(DataLabels集合)的对象,语法如下:

bels(Index)

可选的Index参数指定数据系列中的数据标签的编号。

第32行到第36行代码设置图表上第二个数据系列中的数据标签的字体格式。

运行ChartAdd过程,在工作表中创建簇状柱形图,如图 8-1所示。

图 8-1 创建簇状柱形图

22

VBA常用技巧代码解析

技巧9 使用独立窗口显示图表

如果需要将工作表中嵌入的图表显示在独立的窗口中,可以使用下面的代码。

#001 Sub ChartShow()

#002 With bjects(1)

#003 .Activate

#004 .ndow = True

#005 End With

#006 With ActiveWindow

#007 .Top = 50

#008 .Left = 50

#009 .Width = 400

#010 .Height = 280

#011 .Caption =

#012 End With

#013 End Sub

代码解析:

ChartShow过程,将工作表中嵌入的图表显示在独立的窗口中。

第2行到第5行代码将工作表中指定图表的ShowWindow属性设置为True,使用独立

的窗口显示该图表。

第7、8行代码指定活动窗口显示的位置。

第9、10行代码调整活动窗口的大小使之适应图表的大小。

第11行代码指定活动窗口标题栏中显示的标题。

运行ChartShow过程结果如图 9-1所示。

23

VBA常用技巧代码解析

图 9-1 使用独立窗口显示图表

技巧10 导出工作表中的图表

如果需要将工作表中的图表保存为单独的图像文件,可以使用Export方法以图形文件

格式导出图表,示例代码如下。

#001 Sub ExportChart()

#002 Dim myChart As Chart

#003 Dim myFileName As String

#004 Set myChart = bjects(1).Chart

#005 myFileName = ""

#006 On Error Resume Next

#007 Kill & "" & myFileName

#008 Filename:= _

#009 & "" & myFileName, Filtername:="JPG"

24

VBA常用技巧代码解析

#010 MsgBox "图表已保存在[" & & "]文件夹中!"

#011 Set myChart = Nothing

#012 End Sub

代码解析:

ExportChart过程使用Export方法将工作表中的图表以图形文件的形式导出。

第4行代码指定工作表中的图表对象。

第5行代码指定图形文件保存的文件名。

第6、7行代码使用Kill语句删除文件夹中原有的图形文件。当文件夹中指定删除的文

件不存在时Kill语句会出错所以需要使用On Error语句忽略错误。

第8、9行代码使用Export方法将图表导出到同一目录中,应用于Chart对象的Export

方法以图形文件格式导出图表,语法如下:

(Filename, FilterName, Interactive)

其中参数Filename是必需的,被导出的文件的名称,示例中加上了文件保存的路径。

参数FilterName是可选的,被导出的文件的图形格式,示例中文件以JPG文件格式保

存。

技巧11 多图表制作

如果需要,我们可以为工作表中的每一个数据区域创建一张图表,在如图 11-1所示的

工作表区域中,需要为每一个员工的全年数据创建一张图表。

图 11-1 数据区域

25

VBA常用技巧代码解析

示例代码如下:

#001 Sub ChartsAdd()

#002 Dim myChart As ChartObject

#003 Dim i As Integer

#004 Dim R As Integer

#005 Dim m As Integer

#006 R = ("A65536").End(xlUp).Row - 1

#007 m = Abs(Int(-(R / 4)))

#008

#009 For i = 1 To R

#010 Set myChart = _

#011 (Left:=(((i - 1) Mod m) + 1) * 350 - 320, _

#012 Top:=((i - 1) m + 1) * 220 - 210, _

#013 Width:=330, Height:=210)

#014 With

#015 .ChartType = xlColumnClustered

#016 .SetSourceData Source:=("B2:M2").Offset(i - 1),

_

#017 PlotBy:=xlRows

#018 With .SeriesCollection(1)

#019 .XValues = ("B1:M1")

#020 .Name = ("A2").Offset(i - 1)

#021 .ApplyDataLabels AutoText:=True, ShowValue:=True

#022 . = 10

#023 End With

#024 .HasLegend = False

#025 With .ChartTitle

#026 .Left = 5

#027 .Top = 1

#028 . = 14

#029 . = "华文行楷"

#030 End With

26

VBA常用技巧代码解析

#031 With .or

#032 .ColorIndex = 2

#033 .PatternColorIndex = 1

#034 .Pattern = xlSolid

#035 End With

#036 .Axes(xlCategory). = 10

#037 .Axes(xlValue). = 10

#038 End With

#039 Next

#040

#041 Set myChart = Nothing

#042 End Sub

代码解析:

ChartsAdd过程根据数据工作表A列的人数在图表工作表中创建图表并分4行排列整

齐。

第6行代码取得数据工作表中需要创建图表的人数。

第7行代码计算图表工作表每行需要排列的图表数目,共分4行排列。使用Int函数返

回图表数目除4行后的整数部分,使用负值是为了向上取整数,最后使用Abs函数返回绝

对值,将负值转化为正值。

第8行代码使用Delete方法删除图表工作表中存在的所有图表。

第9行代码开始Next循环,循环的终值由需要创建的图表数目决定。

第10行到第13行代码使用Add方法在图表工作表中创建嵌入的图表,关于应用于

ChartObjects对象的Add方法请参阅技巧8 。其中第11、12行代码根据循环计数器的数

值设置新创建图表的Left和Top属性使之依次排列。第13行代码设置图表的大小。

第15行代码设置新创建图表的类型。

第16、17行代码根据循环计数器的数值分别设置新创建图表的数据源。

第18行到第23行代码设置图表第一个数据系列的名称、数据标签和字体格式。

第24行代码删除图表中的图例。

第25行到第30行代码设置图表的标题。

第31行到第35行代码设置图表的绘图区。

第36、37行代码设置图表坐标轴的字体大小。

关于图表的设置请参阅技巧8 。

运行ChartsAdd过程图表工作表中如所示。

27

VBA常用技巧代码解析

图 11-2 图表工作表

28

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论