爱玩科技网
您的当前位置:首页VBA从入门到精通

VBA从入门到精通

来源:爱玩科技网
单元格的引用 Sub sel()

Dim rng As Range ‘定义变量类型

Set rng = Range(\"A2:D4, d5:e8\") ‘给rng赋值 。。

rng.Select ‘选定变量

Selection.Interior.ColorIndex = 3 ‘改变单元格(变量)颜色为红色

Set rng = nothing End Sub

此程序可以在excel中的selection区域内求和。本例要点为IsNumeric语句的使用。

Isnmeric语句为逻辑判断语句,如果isnmeric () 括号中为数字,则逻辑真,否者逻辑假! Sub 区域求和() Dim r

Dim t As Single

For Each r In Selection

If IsNumeric(r.Value) Then t = t + r.Value End If Next

MsgBox \"所选区域之和为\" & t End Sub

工作簿和工作表

操作方法:创建工作簿

要在 Visual Basic 中创建工作簿,请使用 Add 方法。以下过程将创建一个工作簿。Microsoft Excel 会自动将该工作簿命名为“BookN”,其中“N”是下一个可用的数字。新工作簿将成为活动工作簿。

Sub AddOne()

Workbooks.Add End Sub

创建工作簿的一种更好的方式是将其分配给一个对象变量。在下例中,由 Add 方法返回的 Workbook 对象分配给了对象变量 newBook。然后,又设置了 newBook 的若干属性。通过使用对象变量可以轻松地控制新工作簿。

Sub AddNew()

Set NewBook = Workbooks.Add With NewBook

.Title = \"All Sales\" .Subject = \"Sales\"

.SaveAs Filename:=\"Allsales.xls\" End With End Sub

操作方法:引用多张工作表

可用 Array 函数标识一组工作表。以下示例选定了活动工作簿中的三张工作表。

Sub Several()

Worksheets(Array(\"Sheet1\End Sub

操作方法:通过索引号引用工作表

索引号是基于工作表标签在同一类型的工作表中的位置(按从左到右的方式计数)分配给工作表的序号。下面的过程使用 Worksheets 属性激活活动工作簿中的第一个工作表。

Sub FirstOne()

Worksheets(1).Activate End Sub

如果要处理所有类型的工作表(工作表、图表、模块和对话框编辑表),可使用 Sheets 属性。以下过程激活工作簿中的第四张工作表。

Sub FourthOne()

Sheets(4).Activate End Sub

如果移动、添加或删除工作表,索引顺序可能会发生变化。

操作方法:通过名称引用工作表

使用 Worksheets 属性和 Charts 属性可通过名称来标识工作表。下述语句激活活动工作簿中的不同工作表。

Worksheets(\"Sheet1\").Activate Charts(\"Chart1\").Activate

DialogSheets(\"Dialog1\").Activate

可以使用 Sheets 属性返回工作表、图表、模块或对话框工作表。Sheets 集合包含所有这些种类的工作表。以下示例将激活活动工作簿中名为“Chart1”的工作表。

Sub ActivateChart()

Sheets(\"Chart1\").Activate End Sub

注释

嵌入到工作表中的图表是 ChartObjects 集合的成员,而那些位于单独的工作表上的图表则属于 Charts 集合。

单元格和区域

操作方法:引用工作表上的所有单元格

如果对工作表应用 Cells 属性时不指定索引号,该方法将返回代表工作表上所有单元格的 Range 对象。以下 Sub 过程清除活动工作簿中 Sheet1 上的所有单元格的内容。

Sub ClearSheet()

Worksheets(\"Sheet1\").Cells.ClearContents End Sub

操作方法:使用 A1 表示法引用单元格和区域

可使用 Range 属性引用 A1 引用样式中的单元格或单元格区域。下述子例程将单元格区域 A1:D5 的字体设置为加粗。

Sub FormatRange() Workbooks(\"Book1\").Sheets(\"Sheet1\").Range(\"A1:D5\") _ .Font.Bold = True End Sub 下表演示了使用 Range 属性的一些 A1 样式引用。 引用 含义 单元格 A1 从单元格 A1 到单元格 B5 的区域 Range(\"A1\") Range(\"A1:B5\") Range(\"C5:D9,G9:H16\") Range(\"A:A\") Range(\"1:1\") Range(\"A:C\") Range(\"1:5\") Range(\"1:1,3:3,8:8\") Range(\"A:A,C:C,F:F\") 多块选定区域 A 列 第一行 从 A 列到 C 列的区域 从第一行到第五行的区域 第 1、3 和 8 行 A 、C 和 F 列

操作方法:引用行和列

可用 Rows 属性或 Columns 属性来处理整行或整列。这两个属性返回代表单元格区域的 Range 对象。在下例中,Rows(1) 返回 Sheet1 上的第一行,然后将区域的 Font 对象的 Bold 属性设置为 True。

Sub RowBold() Worksheets(\"Sheet1\").Rows(1).Font.Bold = True End Sub 下表举例说明了使用 Rows 和 Columns 属性的一些行和列的引用。 引用 含义 第一行 工作表上所有的行 第一列 第一列 工作表上所有的列 Rows(1) Rows Columns(1) Columns(\"A\") Columns 若要同时处理若干行或列,请创建一个对象变量并使用 Union 方法,将对 Rows 属性或 Columns 属性的多个调用组合起来。下例将活动工作簿中第一张工作表上的第一行、第三行和第五行的字体设置为加粗。 Sub SeveralRows()

Worksheets(\"Sheet1\").Activate Dim myUnion As Range

Set myUnion = Union(Rows(1), Rows(3), Rows(5)) myUnion.Font.Bold = True End Sub

操作方法:使用索引号引用单元格

通过使用行列索引号,可用 Cells 属性引用单个单元格。该属性返回代表单个单元格的 Range 对象。在下例中,Cells(6,1) 返回 Sheet1 上的单元格 A6,然后将 Value 属性设置为 10。

Sub EnterValue() Worksheets(\"Sheet1\").Cells(6, 1).Value = 10 End Sub 因为可用变量替代编号,所以 Cells 属性非常适合于在单元格区域中循环,如下例中所示。

Sub CycleThrough()

Dim Counter As Integer For Counter = 1 To 20

Worksheets(\"Sheet1\").Cells(Counter, 3).Value = Counter Next Counter End Sub

注释 如果要同时更改某个区域中所有单元格的属性(或将方法应用于该区域中的所有单元格),请使用 Range 属性。

操作方法:使用快捷表示法引用单元格

可用方括号将 A1 引用样式或命名区域括起来,作为 Range 属性的快捷方式。这样就不必键入单词“Range”或使用引号了,如下例中所示。

Sub ClearRange()

Worksheets(\"Sheet1\").[A1:B5].ClearContents End Sub

Sub SetValue()

[MyRange].Value = 30 End Sub

操作方法:引用相对于其他单元格的单元格

以相对于另一个单元格的方式处理某一单元格的常用方法是使用 Offset 属性。在下例中,将位于活动工作表上活动单元格下一行和右边三列的单元格的内容设置为带双下划线。

Sub Underline() ActiveCell.Offset(1, 3).Font.Underline = xlDouble End Sub 注释 可录制使用 Offset 属性指定相对引用(而不是绝对引用)的宏。若要这样做,请在“开发工具”选项卡上单击“使用相对引用”,然后单击“录制宏”。 若要在单元格区域中循环,请在循环中将变量与 Cells 属性一起使用。本示例以 5 为步长,用 5 到 100 之间的值填充第三列的前 20 个单元格。变量 counter 用作 Cells 属性的行索引。

Sub CycleThrough()

Dim counter As Integer For counter = 1 To 20

Worksheets(\"Sheet1\").Cells(counter, 3).Value = counter * 5 Next counter End Sub

操作方法:使用 Range 对象引用单元格

如果将对象变量设置为 Range 对象,即可用变量名轻松地操作单元格区域。

以下过程将创建对象变量 myRange,然后将活动工作簿中 Sheet1 上的区域 A1:D5 赋予该变量。随后的语句用该变量名称代替 Range 对象,以修改该区域的属性。

Sub Random()

Dim myRange As Range

Set myRange = Worksheets(\"Sheet1\").Range(\"A1:D5\") myRange.Formula = \"=RAND()\" myRange.Font.Bold = True End Sub

操作方法:引用命名区域

用名称比用 A1 样式记号更容易标识单元格区域。若要命名选定的单元格区域,请单击编辑栏左端的名称框,键入名称,再按 Enter。

引用命名区域

以下示例引用名为“MyBook.xls”的工作簿中名为“MyRange”的区域。

Sub FormatRange() Range(\"MyBook.xls!MyRange\").Font.Italic = True End Sub 以下示例引用名为“Report.xls”的工作簿中特定于工作表的区域“Sheet1!Sales”。

Sub FormatSales() Range(\"[Report.xls]Sheet1!Sales\").BorderAround Weight:=xlthin End Sub 要选定命名区域,请使用 GoTo 方法,该方法将激活工作簿和工作表,然后选定该区域。

Sub ClearRange() Application.Goto Reference:=\"MyBook.xls!MyRange\" Selection.ClearContents End Sub 以下示例显示对于活动工作簿将如何编写相同的过程。

Sub ClearRange() Application.Goto Reference:=\"MyRange\" Selection.ClearContents End Sub 在命名区域中的单元格上循环

以下示例使用 For Each...Next 循环语句在命名区域中的每一个单元格中循环。如果该区域中的任一单元格的值超过 Limit 的值,则该单元格的颜色会变为黄色。

Sub ApplyColor()

Const Limit As Integer = 25 For Each c In Range(\"MyRange\") If c.Value > Limit Then c.Interior.ColorIndex = 27 End If Next c End Sub

操作方法:引用多个区域

如果使用适当的方法,可以轻松引用多个区域。使用 Range 和 Union 方法可引用任意区域组合;使用 Areas 属性可引用工作表上一组选定的区域。

使用 Range 属性

通过在两个或多个引用之间插入逗号,可使用 Range 属性引用多个区域。以下示例清除了 Sheet1 上三个区域的内容。

Sub ClearRanges() Worksheets(\"Sheet1\").Range(\"C5:D9,G9:H16,B14:D18\"). _ ClearContents End Sub 命名区域使得用 Range 属性处理多个区域更加容易。以下示例可在所有这三个命名区域处于同一工作表时运行。

Sub ClearNamed() Range(\"MyRange, YourRange, HisRange\").ClearContents End Sub 使用 Union 方法

使用 Union 方法可将多个区域组合到一个 Range 对象中。以下示例创建了名为 myMultipleRange 的 Range 对象,并将其定义为区域 A1:B2 和 C3:D4 的组合,然后将该组合区域的字体设置为加粗。

Sub MultipleRange()

Dim r1, r2, myMultipleRange As Range Set r1 = Sheets(\"Sheet1\").Range(\"A1:B2\") Set r2 = Sheets(\"Sheet1\").Range(\"C3:D4\") Set myMultipleRange = Union(r1, r2) myMultipleRange.Font.Bold = True End Sub

使用 Areas 属性

可用 Areas 属性引用选定的单元格区域或多块选定区域中的区域集合。下述过程计算选定区域中的块数目,如果有多个块,就显示一则警告消息。

Sub FindMultiple() If Selection.Areas.Count > 1 Then MsgBox \"Cannot do this to a multiple selection.\" End If End Sub

控件、对话框和窗体

操作方法:向文档中添加控件

若要向文档中添加控件,请显示“控件工具箱”,再单击要添加的控件,然后单击文档。拖动控件的调整控点直到控件的轮廓大小和形状符合要求。 注释 将一个控件(或一组控件)从窗体拖回“控件工具箱”,即可创建一个可重复使用的控件模板。这是一项非常有用的功能,能实现应用程序的标准界面。

操作方法:向用户窗体中添加控件

要向用户窗体中添加控件,请在“工具箱”中找到要添加的控件,将该控件拖到窗体上,然后拖动控件的调整控点,直到控件的轮廓大小和形状符合要求。 注释 将一个控件(或多个“组合”的控件)从窗体拖回“工具箱”,即可创建一个可重复使用的控件模板。这是一项非常有用的功能,能实现应用程序的标准界面。 向窗体中添加了控件后,可使用 Visual Basic 编辑器中“格式”菜单上的命令调整控件的对齐方式和间距。

操作方法:创建用户窗体

要创建自定义对话框,必须创建用户窗体。要创建用户窗体,请单击“Visual Basic 编辑器”中“插入”菜单上的“用户窗体”。

可使用“属性”窗口更改窗体的名称、行为和外观。例如,要更改窗体的标题,可设置 Caption 属性。

操作方法:向用户窗体中添加控件

要向用户窗体中添加控件,请在“工具箱”中找到要添加的控件,将该控件拖到窗体上,然后拖动控件的调整控点,直到控件的轮廓大小和形状符合要求。 注释 将一个控件(或多个“组合”的控件)从窗体拖回“工具箱”,即可创建一个可重复使用的控件模板。这是一项非常有用的功能,能实现应用程序的标准界面。 向窗体中添加了控件后,可使用 Visual Basic 编辑器中“格式”菜单上的命令调整控件的对齐方式和间距。

设置控件属性

可以在设计时(即宏运行之前)设置某些控件属性。在设计模式下,右键单击某一控件,然后单击“属性”显示属性窗口。属性名称显示在该窗口的左列中,属性的值显示在右列中。在属性名称的右边输入新值可以设置属性的值。

初始化控件属性

可通过使用宏中的 Visual Basic 代码,在运行时初始化控件。例如,可填充列表框、设置文本值或设置选项按钮。

以下示例使用 AddItem 方法向列表框中添加数据。然后它设置文本框的值并显示窗体。

Private Sub GetUserName() With UserForm1

.lstRegions.AddItem \"North\" .lstRegions.AddItem \"South\" .lstRegions.AddItem \"East\" .lstRegions.AddItem \"West\" .txtSalesPersonID.Text = \"00000\" .Show ' ... End With End Sub

还可以在窗体的 Initialize 事件中用代码设置窗体上控件的初始值。在 Initialize 事件中设置控件的初始值的好处在于:初始化代码与窗体存储在一起。您可以将该窗体复制到其他项目中,这样,当运行 Show 方法来显示对话框时,将初始化其中的控件。

Private Sub UserForm_Initialize() UserForm1.lstNames.AddItem \"Test One\" UserForm1.lstNames.AddItem \"Test Two\" UserForm1.txtUserName.Text = \"Default Name\" End Sub

控件和对话框事件

将控件添加到对话框或文档后,再添加事件过程以确定控件如何响应用户操作。

用户窗体和控件均拥有一组预定义事件。例如,某命令按钮拥有 Click 事件,该事件将在用户单击此命令按钮时发生,用户窗体拥有 Initialize 事件,该事件将在加载窗体时运行。

若要编写控件或窗体事件过程,请双击窗体或控件打开模块,然后从“过程”下拉列表框中选择相应事件。 事件过程包含控件的名称。例如,命令按钮 Command1 的 Click 事件过程的名称为 Command1_Click。 如果为事件过程添加代码后更改该控件的名称,这些代码仍保留使用原名称的过程中。

例如,假设在 Commmand1 的 Click 事件中添加代码,然后将该控件重命名为 Command2。双击

Command2 时,在 Click 事件过程中看不到任何代码。您需要将 Command1_Click 中的代码移到 Command2_Click 中。

为了简化开发过程,最好在编写代码之前命名控件。

显示自定义对话框

若要在 Visual Basic 编辑器中测试对话框,请在 Visual Basic 编辑器的“运行”菜单上单击“运行子过程/用户窗体”。

若要用 Visual Basic 代码显示对话框,请使用 Show 方法。下例显示了名为“UserForm1”的对话框。

Private Sub GetUserName() UserForm1.Show End Sub

代码运行时使用控件值

可在运行 Visual Basic 代码时设置和返回某些控件属性。下列示例将文本框的 Text 属性设为“Hello”。

TextBox1.Text = \"Hello\" 关闭窗体时,用户在窗体中输入的数据将丢失。如果在卸载窗体后返回其中控件的值,则得到的是控件的初始值而非用户输入的值。

如果要保存在窗体中输入的数据,可以当窗体还在运行时将该信息保存到模块级变量中。以下示例显示一个窗体并保存窗体数据。

' Code in module to declare public variables. Public strRegion As String

Public intSalesPersonID As Integer Public blnCancelled As Boolean

' Code in form.

Private Sub cmdCancel_Click() Module1.blnCancelled = True Unload Me End Sub

Private Sub cmdOK_Click() ' Save data.

intSalesPersonID = txtSalesPersonID.Text

strRegion = lstRegions.List(lstRegions.ListIndex) Module1.blnCancelled = False Unload Me End Sub

Private Sub UserForm_Initialize() Module1.blnCancelled = True End Sub

' Code in module to display form. Sub LaunchSalesPersonForm() frmSalesPeople.Show

If blnCancelled = True Then

MsgBox \"Operation Cancelled!\ Else

MsgBox \"The Salesperson's ID is: \" & intSalesPersonID & _ \"The Region is: \" & strRegion End If End Sub

操作方法:创建用户窗体

要创建自定义对话框,必须创建用户窗体。要创建用户窗体,请单击“Visual Basic 编辑器”中“插入”菜单上的“用户窗体”。

可使用“属性”窗口更改窗体的名称、行为和外观。例如,要更改窗体的标题,可设置 Caption 属性。

因篇幅问题不能全部显示,请点此查看更多更全内容