第2章VBA程序设计
2.1工作簿和工作表
一、创建和打开工作簿
Workbooks.Add创建一个新的工作簿
Set NewBook=Workbooks.Add建工作簿,用对象变量表示
NewBook.SaveAs Filename:="Test.xls"工作簿另存为
Workbooks.Open("D:\Test.xls") 打开工作簿
二、引用工作表
Worksheets(1).Activate激活第一张工作表
Sheets(4).Activate激活四张工作表
Worksheets("Sheet1").Activate激活指定的工作表
Sheets("Chart1").Activate激活图表“Chart1”
2.2单元格和区域
一、引用单元格和区域
1.用A1样式记号引用单元格和单元格区域
【例2.6】将工作表“Sheet1”中单元格区域A1:D5的字体设置为加粗。
Sheets("Sheet1").Range("A1:D5").Font.Bold=True
2.用编号引用单元格
【例2.7】将Sheet1上的单元格A6的Value属性设置为10
Worksheets("Sheet1").Cells(6,1).Value=10
【例2.9】清除活动工作簿中Sheet1上的所有单元格的内容
Worksheets("Sheet1").Cells.ClearContents
【例2.10】假设工作簿中Sheet1的A列是员工姓名(不超过50人),Sheet2的A列是员工姓名、B列是对应的电话号码。现在需将所有员工的电话号码填写到Sheet1中的B列(注:Sheet1中姓名“李三”在Sheet2中可能为“李三”,中间没有空格)。
3.引用行和列
【例2.11】将Sheet1上第一行单元格区域的Font对象Bold属性设置为True。Worksheets("Sheet1").Rows(1).Font.Bold=True
表2.2 Rows和Columns属性的应用示例
Set myUn=Union(Rows(1),Rows(3),Rows(5))
myUn.Font.Bold=True
4.用快捷记号引用单元格
【例2.13】将工作表“Sheet1”的单元格区域“A1:B5”内容清除。
Worksheets("Sheet1").[A1:B5].ClearContents
5.引用命名区域
【例2.14】将当前工作表中名为“AA”的单元格区域设置为30。
[AA].Value=30
【例2.15】用GoTo方法激活工作簿“Book1.xls”,选定区域“AA”,然后清除该区域内容。Application.Goto Reference:="Book1.xls!AA"
Selection.ClearContents
【例2.16】用ForEach...Next循环语句在命名区域中的每一个单元格上循环。如果该区域中的任一单元格的值超过25,就将该单元格的颜色更改为黄色。
For Each c In Range("AA")
If c.Value>25 Then
c.Interior.ColorIndex=27
End If
Next c
6.相对于其他单元格来引用单元格
【例2.17】将位于活动单元格下一行和右边三列的单元格的内容设置为双下划线格式。ActiveCell.Offset(1,3).Font.Underline=xlDouble
7.用Range对象引用单元格
【例2.18】将Sheet1上的单元格区域A1:D5赋予该变量,随后用该变量代替该区域对象,填充随机函数。
Set myRange=Worksheets("Sheet1").Range("A1:D5")
myRange.Formula="=RAND()"
8.引用多个单元格区域
【例2.19】清除当前工作表上三个区域的内容。
Range("C5:D9,G9:H16,B14:D18").ClearContents
Range("MyRange,YourRange,HisRange").ClearContents
【例2.20】将组合区域的字体设置为加粗。
Set r1=Sheets("Sheet1").Range("A1:B2")
Set r2=Sheets("Sheet1").Range("C3:D4")
Set myMR=Union(r1,r2)
myMR.Font.Bold=True
【例2.21】计算选定区域中的数目,如果有多个区域,就显示一则警告消息。If Selection.Areas.Count>1 Then
MsgBox"请不要选择多个区域!"
End If
二、在单元格区域中循环
【例2.22】将单元格区域C1:C20所有绝对值小于10的数字都设置红色。
For Cnt=1 To 20
Set curC=Worksheets("Sheet1").Cells(Cnt,3)
If Abs(curC.Value)<10 Then
curC.Font.ColorIndex=3
Next Cnt
求区域末尾行号常用的方法:
r=Range("A1").End(xlDown).Row '求A1单元格数据区末尾行号
r=Cells(1,1).End(xlDown).Row '求A1单元格数据区末尾行号
r=Range("A65536").End(xlUp).Row '求A列数据区末尾行号
r=Cells(65536,1).End(xlUp).Row '求A列数据区末尾行号
r=Columns(1).End(xlDown).Row' 求A列数据区末尾行号
求区域末尾列号常用的方法:
c=Range("A1").End(xlToRight).Column '求A1单元格数据区末尾列号
c=Cells(1,1).End(xlToRight).Column '求A1单元格数据区末尾列号
c=Cells(1,256).End(xlToLeft).Column '求第1行数据区末尾列号
c=Rows(1).End(xlToRight).Column '求第1行数据区末尾列号
【例2.23】将单元格区域A1:D10所有绝对值小于10的数字都设置为红色。For Each c In Worksheets("Sheet1").Range("A1:D10").Cells
If Abs(c.Value)<10 Then
c.Font.ColorIndex=3
Next
【例2.24】将活动单元格区域所有绝对值小于10的数字都设置为红色。
For Each c In ActiveCell.CurrentRegion.Cells
If Abs(c.Value)<10 Then
c.Font.ColorIndex=3
Next
三、选定和激活单元格
1.使用Select方法和Selection属性
【例2.25】将A1:B1单元格中的内容加粗。
Range("A1:B1").Select
Selection.Font.Bold=True
也可以用下面语句:
Range("A1:B1").Font.Bold=True
2.选定活动工作表上的单元格
【例2.26】将Sheet1中的一行复制到Sheet2上。
Worksheets("Sheet1").Rows(1).Copy
Worksheets("Sheet2").Select
Worksheets("Sheet2").Rows(1).Select
Worksheets("Sheet2").Paste
3.激活选定区域内的单元格
【例2.27】选定一个区域,激活区域内的一个单元格,但并不改变选定区域。
Range("A1:D4").Select
Range("B2").Activate
四、处理三维区域
【例2.28】设置三维单元格区域的边框格式。
Sheets(Array("Sheet2","Sheet3","Sheet5")).Select
Range("A1:H1").Select
Selection.Borders(xlBottom).LineStyle=xlDouble
【例2.29】用FillAcrossSheets方法将Sheet2上指定区域的格式和内容复制到该工作簿中所有工作表上的相应区域中。
Worksheets.FillAcrossSheets(Worksheets("Sheet2").Range("A1:H1"))
五、处理活动单元格
【例2.30】使单元格B5成为活动单元格,然后将其字体设置为加粗。
Worksheets("Sheet1").Range("B5").Activate
ActiveCell.Font.Bold=True
【例2.31】在选定区域内的活动单元格中插入文本,然后将活动单元格右移一格,但并不更改选定区域。
Range("A1:D10").Select
ActiveCell.Value="姓名"
ActiveCell.Offset(0,1).Activate
【例2.32】将选定区域扩充到与活动单元格相邻的包含数据的单元格中。
ActiveCell.CurrentRegion.Select
其中,CurrentRegion属性返回由空白行和空白列所包围的单元格区域。
范例2-1从区域中删除重复的内容
在Excel当前工作表B列存放一些数据,现要列出这些数据互不重复的值,放到D列。
①建函数UnqV
②编写子程序nodupa
范例2-2在Excel工作表列出指定文件夹中所有文件的目录信息。
①进入VBE,在“工具”菜单中选择“引用”项,在“引用”对话框中选中“Microsoft
Scripting Runtime”项。
②建立子程序“列文件目录”
范例2-3自动生成年历
子程序GenerateCalendar(分析)
2.3工作表函数与图形
一、在VBA中使用Excel工作表函数
1.在VBA中调用工作表函数
【例2.33】使用Min工作表函数求出区域中的最小值。
Set myR=Worksheets("Sheet1").Range("A1:C10")
answer=Application.WorksheetFunction.Min(myR)
MsgBox answer
注意:VBA函数和Excel工作表函数可能同名,但作用和引用方式是不同的。
2.在单元格中插入工作表函数
【例2.34】将RAND(随机数)工作表函数赋给Sheet1上A1:B3区域的Formula属性。Worksheets("Sheet1").Range("A1:B3").Formula="=RAND()"
【例2.35】下面程序使用工作表函数Pmt来计算住宅抵押贷款的支付额。
Sub Fml()
Static lAmt,lInt,lTrm
lAmt=Application.InputBox(Prompt:="贷款额:", Default:=lAmt,Type:=1)
lInt=Application.InputBox(Prompt:="年利率:",Default:=lInt,Type:=1)
lTrm=Application.InputBox(Prompt:="年限:",Default:=lTrm,Type:=1)
lPmt=Application.WorksheetFunction.Pmt(lInt/1200,lTrm*12,lAmt)
MsgBox"月支付额:"&Format(lPmt,"Currency")
End Sub
二、处理图形对象
1.设置图形的属性
【例2.36】设置指定图形的前景色。
Worksheets(1).Shapes(1).Fill.ForeColor.RGB=RGB(255,0,0)
2.同时对多个图形应用属性或方法
对多个选定图形通过构造ShapeRange集合,并直接对该ShapeRange集合应用适当的属性和方法,可执行同一操作。
也可在图形的Shapes集合或ShapeRange集合中循环,对每个单独的Shape对象应用适当的属性和方法来执行该操作。
3.创建ShapeRange集合
【例2.37】创建选定的图形ShapeRange对象,然后填充绿色。
Set sr=Selection.ShapeRange
sr.Fill.ForeColor.SchemeColor=17
注:先选中图形
4.对ShapeRange集合应用属性或方法
【例2.38】假设在当前工作表上建立了两个图形“Sp1”和“Sp2”。下面程序构造包含图形“Sp1”和“Sp2”的图形区域,并对这些图形应用渐变填充格式。
Set myD=WorkSheets(1)
Set myR=myD.Shapes.Range(Array("Sp1","Sp2"))
myR.Fill.PresetGradient msoGradientHorizontal,1,msoGradientBrass
5.在Shapes集合或ShapeRange集合中循环
【例2.39】在当前工作表上对所有图形进行循环,更改每个自选图形的前景色。
Set myD=WorkSheets(1)
For Each sh In myD.Shapes
If sh.Type=msoAutoShape Then
sh.Fill.ForeColor.RGB=RGB(255,0,0)
sh.Fill.Visible=msoTrue
End If
Next
【例2.40】对当前活动窗口中所有选定的图形构造一个ShapeRange集合,并设置每个选定图形的填充色。
For Each sh In ActiveWindow.Selection.ShapeRange
sh.Fill.Visible=msoTrue
sh.Fill.Solid
sh.Fill.ForeColor.SchemeColor=57
Next
注:先选中图形
范例2-4多元一次方程组求解
①界面初始化程序设计
②求解方程组程序设计
计算系数矩阵a的逆矩阵(用工作表函数MInverse)
逆矩阵与向量b进行矩阵相乘得到向量x(用工作表函数MMult)
求矩阵行列式的值(用工作表函数MDeterm)
范例2-5创建动态三维图表
①选中A3:D9区域,单击“图表向导”按钮,创建“三维柱形图”,插入当前工作表。
②录制新宏:在绘图区快捷菜单上选择“设置三维视图格式”项,设置上下仰角、左右
旋转值均为0,得到有关的语句。
③编写子程序“动态效果
2.4 Word文档操作
一、使用文本
1.将文本插入文档
【例2.41】在活动文档的末尾插入字符“###”。
ActiveDocument.Content.InsertAfter Text:="###"
【例2.42】在所选内容之前或光标位置之前插入字符“***”。
Selection.InsertBefore Text:="***"
2.从文档返回文本
【例2.43】返回选定的文本。
strT=Selection.Text
【例2.44】返回活动文档中的第一个单词。
sFW=ActiveDocument.Words(1).Text
【例2.45】删除Word当前文档选定部分的多余空格。
str_in=Trim(Selection.text)
str_out=""
For i=1 To Len(str_in)
strch=Mid(str_in,i,1)
If strch<>"" Or Right(str_out,1)<>"" Then
str_out=str_out&strch
End If
Next i
Selection.text=str_out
3.查找和替换
【例2.46】查找并选定文字。
With Selection.Find
.Text="VBA"
End With
注:可通过宏录制获得
【例2.47】查找而不选定文字。
With ActiveDocument.Content.Find
.Text="VBA"
.Forward=True
.Execute
If.Found=True Then
.Parent.Bold=True
End With
使用Execute方法的参数,执行结果相同。
Set myR=ActiveDocument.Content
myR.Find.Execute FindText:="VBA",Forward:=True
If myR.Find.Found Then
myR.Bold=True
【例2.48】查找并替换文本。
With Selection.Find
.Text="VBA"
.Replacement.Text="VisualBasic"
.Execute Replace:=wdReplaceAll
End With
【例2.49】查找并替换格式。
With ActiveDocument.Content.Find
.Font.Bold=True
.Replacement.Font.Bold=False
.Execute FindText:="",ReplaceWith:="", Format:=True,Replace:=wdReplaceAll
End With
4.将格式应用于文本
【例2.50】将格式应用于选定内容。
WithSelection.Font
.Name="楷体_GB2312"
.Size=16
End With
With Selection.ParagraphFormat
.LineUnitBefore=0.5
.LineUnitAfter=0.5
End With
【例2.51】将格式应用于某一区域。
Set rgF=ActiveDocument.Range(Start:=ActiveDocument.Paragraphs(1).Range.Start,_ End:=ActiveDocument.Paragraphs(3).Range.End)
With rgF.Font
.Name="楷体_GB2312"
.Size=16
二、使用Word对象
1.选定文档中的对象
【例2.52】选定活动文档中的第一个表格。
ActiveDocument.Tables(1).Select
【例2.53】选定活动文档中的前四个段落。
Set RnP=ActiveDocument.Range(Start:=ActiveDocument.Paragraphs(1).Range.Start,_ End:=ActiveDocument.Paragraphs(4).Range.End)
RnP.Select
2.将Range对象赋给变量
【例】将活动文档中的第一个和第二个单词赋给变量Range1和Range2
Set Range1=ActiveDocument.Words(1)
Set Range2=ActiveDocument.Words(2)
【例】将一个Range对象变量的值送给另一个Range对象变量
Set Range2=Range1
【例】创建一个Range1对象的新副本Range2
Set Range2=Range1.Duplicate
3.修改文档的某一部分
【例】将所选内容的第一个单词复制到“剪贴板”。
Selection.Words(1).Copy
【例】将活动文档的第一段复制到“剪贴板”。
ActiveDocument.Paragraphs(1).Range.Copy
【例】设置活动文档中第一个单词为大写。
ActiveDocument.Words(1).Case=wdUpperCase
【例】将当前节的下边距设为0.5英寸。
Selection.Sections(1).PageSetup.BottomMargin=InchesToPoints(0.5)
【例】将活动文档的字符间距设为两倍。
ActiveDocument.Content.ParagraphFormat.Space2
【例2.54】创建一个Range对象,引用活动文档的前10个字符,然后利用该对象设置字符的字号。
Se trgTC=ActiveDocument.Range(Start:=0,End:=10)
rgTC.Font.Size=20
4.引用活动文档元素
【例】将边框应用于选定内容的第一段
Selection.Paragraphs(1).Borders.Enable=True
【例2.55】将底纹应用于选定内容中第一张表格的首行。
If Selection.Tables.Count>=1 Then
Selection.Tables(1).Rows(1).Shading.Texture=wdTexture25Percent
Else
MsgBox"您选择的区域没有包含表!"
End If
【例2.56】将底纹应用于选定内容中每张表格的首行。
Dim tbl AsTable
If Selection.Tables.Count>=1 Then