在VBA代码中引用Excel工作表中单元格区域的方式小结

时间:2024.5.13

在VBA代码中引用Excel工作表中单元格区域的方式小结

--------------------------------------------------------------------------------

在使用ExcelVBA进行编程时,我们通常需要频繁地引用单元格区域,然后再使用相应的属性和方法对区域进行操作。所谓单元格区域,指的是单个的单元格、或者是由多个单元格组成的区域、或者是整行、整列等。下面,我们设定一些情形,以问答的形式对引用单元格区域的方式进行归纳。

--------------------------------------------------------------------------------

问题一:在VBA代码中,如何引用当前工作表中的单个单元格(例如引用单元格C3)? 回答:可以使用下面列举的任一方式对当前工作表中的单元格(C3)进行引用。

(1) Range("C3")

(2) [C3]

(3) Cells(3, 3)

(4) Cells(3, "C")

(5) Range("C4").Offset(-1)

Range("D3").Offset(, -1)

Range("A1").Offset(2, 2)

(6) 若C3为当前单元格,则可使用:ActiveCell

(7) 若将C3单元格命名为“Range1”,则可使用:Range("Range1")或[Range1]

(8) Cells(4, 3).Offset(-1)

--------------------------------------------------------------------------------

问题二:在VBA代码中,我要引用当前工作表中的B2:D6单元格区域,有哪些方式? 回答:可以使用下面列举的任一方式对当前工作表中单元格区域B2:D6进行引用。

(1) Range(“B2:D6”)

(2) Range("B2", "D6")

(3) [B2:D6]

(4) Range(Range("B2"), Range("D6"))

(5) Range(Cells(2, 2), Cells(6, 4))

(6) 若将B2:D6区域命名为“MyRange”,则又可以使用下面的语句引用该区域:

① Range("MyRange")

② [MyRange]

(7) Range("B2").Resize(5, 3)

(8) Range("A1:C5").Offset(1, 1)

(9) 若单元格B2为当前单元格,则可使用语句:Range(ActiveCell, ActiveCell.Offset(4, 2))

(10) 若单元格D6为当前单元格,则可使用语句:Range("B2", ActiveCell)

--------------------------------------------------------------------------------

问题三:在VBA代码中,如何使用变量实现对当前工作表中不确定单元格区域的引用?

回答:有时,我们需要在代码中依次获取工作表中特定区域内的单元格,这通常可以采取下面的几种方式:

(1) Range(“A” & i)

(2) Range(“A” & i & “:C” & i)

(3) Cells(i,1)

(4) Cells(i,j)

其中,i、j为变量,在循环语句中指定i和j的范围后,依次获取相应单元格。

--------------------------------------------------------------------------------

问题四:在VBA代码中,如何扩展引用当前工作表中的单元格区域?

回答:可以使用Resize属性,例如:

(1) ActiveCell.Resize(4, 4),表示自当前单元格开始创建一个4行4列的区域。

(2) Range("B2").Resize(2, 2),表示创建B2:C3单元格区域。

(3) Range("B2").Resize(2),表示创建B2:B3单元格区域。

(4) Range("B2").Resize(, 2),表示创建B2:C2单元格区域。

如果是在一个单元格区域(如B3:E6),或一个命名区域中(如将单元格区域B3:E6命名为“MyRange”)使用Resize属性,则只是相对于单元格区域左上角单元格扩展区域,例如:

代码Range("C3:E6").Resize(, 2),表示单元格区域C3:D6,并且扩展的单元格区域可不在原单元格区域内。

因此,可以知道Resize属性是相对于当前活动单元格或某单元格区域中左上角单元格按指定的行数或列数扩展单元格区域。

--------------------------------------------------------------------------------

问题五:在VBA代码中,如何在当前工作表中基于当前单元格区域或指定单元格区域处理其它单元格区域?

回答:可以使用Offset属性,例如:

(1) Range("A1").Offset(2, 2),表示单元格C3。

(2) ActiveCell.Offset(, 1),表示当前单元格下一列的单元格。

(3) ActiveCell.Offset(1),表示当前单元格下一行的单元格。

(4) Range("C3:D5").Offset(, 1),表示单元格区域D3:E5,即将整个区域偏移一列。

从上面的代码示例可知,Offset属性从所指定的单元格开始按指定的行数和列数偏移,从而到达目的单元格,但偏移的行数和列数不包括指定单元格本身。

--------------------------------------------------------------------------------

问题六:在VBA代码中,如何在当前工作表中引用交叉区域?

回答:可以使用Intersect方法,例如:

Intersect(Range("C3:E6"), Range("D5:F8")),表示单元格区域D5:E6,即单元格区域C3:E6与D5:F8相重迭的区域。

--------------------------------------------------------------------------------

问题七:在VBA代码中,如何在当前工作表中引用多个区域?

回答:

(1) 可以使用Union方法,例如:

Union(Range("C3:D4"), Range("E5:F6")),表示单元格区域C3:D4和E5:F6所组成的区域。 Union方法可以将多个非连续区域连接起来成为一个区域,从而可以实现对多个非连续区域一起进行操作。

(2) 也可以使用下面的代码:

Range("C3:D4, E5:F6")或[C3:D4, E5:F6]

注意:Range("C3:D4", "F5:G6"),表示单元格区域C3:G6,即将两个区域以第一个区域左上角单元格为起点,以第二个区域右下角单元格为终点连接成一个新区域。

同时,在引用区域后使用Rows属性和Columns属性时,注意下面代码的区别:

①Range("C3:D4", "F8:G10").Rows.Count,返回的值为8;

②Range("C3:D4,F8:G10").Rows.Count,返回的值为2,即只计算第一个单元格区域。

--------------------------------------------------------------------------------

问题八:在VBA代码中,如何引用当前工作表中活动单元格或指定单元格所在的区域(当前区域)?

回答:可以使用CurrentRegion属性,例如:

(1) ActiveCell.CurrentRegion,表示活动单元格所在的当前区域。

(2) Range("D5").CurrentRegion,表示单元格D5所在的当前区域。

当前区域是指周围由空行或空列所围成的区域。该属性的详细使用参见《CurrentRegion属性示例》一文。

--------------------------------------------------------------------------------

问题九:在VBA代码中,如何引用当前工作表中已使用的区域?

回答:可以使用UsedRange属性,例如:

(1) Activesheet.UsedRange,表示当前工作表中已使用的区域。

(2) Worksheets("sheet1").UsedRange,表示工作表sheet1中已使用的区域。

与CurrentRegion属性不同的是,该属性代表工作表中已使用的单元格区域,包括显示为空行,但已进行过格式的单元格区域。该属性的详细使用参见《解析UsedRange属性》一文。

--------------------------------------------------------------------------------

问题十:如何在单元格区域内指定特定的单元格?

回答:可以使用Item属性,例如:

(1) Range("A1:B10").Item(5,3)指定单元格C5,这个单元格处于以区域中左上角单元格A1(即区域中第1行第1列的单元格)为起点的第5行第3列。因为Item属性为默认属性,因此也可以简写为:Range("A1:B10")(5,3)。

如果将A1:B10区域命名为”MyRange”,那么Range("MyRange")(5,3)也指定单元格C5。

(2) Range("A1:B10")(12,13)指定单元格M12,即用这种方式引用单元格,该单元格不必一定要包含在区域内。

同时,也不需要索引数值是正值,例如:

① Range("D4:F6")(0,0)代表单元格C3;

② Range("D4:F6")(-1,-2)代表单元格A2。

而Range("D4:F6")(1,1)代表单元格D4。

(3) 也可以在单元格区域中循环,例如:

Range("D4:F6")(2,2)(3,4)代表单元格H7,即该单元格位于作为左上角单元格E5的第3行第4列(因为E5是开始于区域中左上角单元格D4起的第2行第2列)。

(4) 也能使用一个单个的索引数值进行引用。计数方式为从左向右,即在区域中的第一行开始从左向右计数,第一行结束后,然后从第二行开始从左到右接着计数,依次类推。(注:从区域中第一行第一个单元格开始计数,当第一行结束时,转入第二行最左边的单元格,这样按一行一行从左向右依次计数。以单元格区域中第1个单元格开始,按上述规则依次为第2个单元格、第3个单元格….等等),例如:

Range("A1:B2")(1) 代表单元格A1;

Range("A1:B2")(2) 代表单元格B1;

Range("A1:B2")(3) 代表单元格A2;

Range("A1:B2")(4) 代表单元格B2。

这种方法可在工作表中连续向下引用单元格(即不一定是在单元格区域内,但在遵循相同的规律),例如:

Range("A1:B2")(5)代表单元格A3;

Range("A1:B2")(14)代表单元格B7,等等。

也可以使用单个的负数索引值。

这种使用单个索引值的方法对遍历列是有用的,例如,Range("D4")(1)代表单元格D4,Range("D4")(2)代表单元格D5,Range ("D4")(11)代表单元格D14,等等。

同理,稍作调整后也可遍历行,例如:

Range("D4").Columns(2)代表单元格E4,Range("D4").Columns(5)指定单元格H4,等等。

(5)当与对象变量配合使用时,Item属性能提供简洁并有效的代码,例如:

Set rng = Worksheets(1).[a1]

定义了对象变量后,像单元格方法一样,Item属性允许使用两个索引数值引用工作表中的任一单元格,例如,rng(3,4)指定单元格D3。(By Chip Pearson)

--------------------------------------------------------------------------------

问题十一:在VBA代码中,如何引用当前工作表中的整行或整列?

回答:见下面的示例代码:

(1) Range("C:C").Select,表示选择C列。

Range("C:E").Select,表示选择C列至E列。

(2) Range("1:1").Select,表示选择第一行。

Range("1:3").Select,表示选择第1行至第3行。

(3) Range("C:C").EntireColumn,表示C列;

Range("D1").EntireColumn,表示D列。

同样的方式,也可以选择整行,然后可以使用如AutoFit方法对整列或整行进行调整。

--------------------------------------------------------------------------------

问题十二:在VBA代码中,如何引用当前工作表中的所有单元格?

回答:可以使用下面的代码:

(1) Cells,表示当前工作表中的所有单元格。

(2) Range(Cells(1, 1), Cells(Cells.Rows.Count, Cells. Columns.Count)),其中Cells.Rows表示工作表所有行,Cells. Columns表示工作表所有列。

--------------------------------------------------------------------------------

问题十三:在VBA代码中,如何引用工作表中的特定单元格区域?

回答:在工作表中,您可能使用过“定位条件”对话框。可以通过选择菜单“编辑——定位”,单击“定位”对话框中的“定位条件”按钮显示该对话框。这个对话框可以允许用户选择特定的单元格。例如:

(1) Worksheets("sheet1").Cells.SpecialCells(xlCellTypeAllFormatConditions),表示工作表sheet1中由带有条件格式的单元格所组成的区域。

(2) ActiveCell.CurrentRegion.SpecialCells(xlCellTypeBlanks),表示当前工作表中活动单元格所在区域中所有空白单元格所组成的区域。

当然,还有很多常量和值的组合,可以让您实现特定单元格的查找并引用。参见《探讨在工作表中找到最后一行》一文。

--------------------------------------------------------------------------------

问题十四:在VBA代码中,如何引用其它工作表或其它工作簿中的单元格区域?

回答:要引用其它工作表或其它工作簿中的单元格区域,只需在单元格对象前加上相应的引用对象即可,例如:

(1) Worksheets(“Sheet3”).Range(“C3:D5”),表示引用工作表sheet3中的单元格区域C3:D5。

(2) Workbooks(“MyBook.xls”).Worksheets(“sheet1”).Range(“B2”),表示引用MyBook工作簿中工作表Sheet1上的单元格B2。

--------------------------------------------------------------------------------

问题十五:还有其它的一些情形吗?

回答:列举如下:

(1) Cells(15),表示单元格O1,即可在Cells属性中指定单元格数字来选择单元格,其计数顺序为自左至右、从上到下,又如Cells(257),表示单元格B1。

(2) Cells(, 256),表示单元格IV1,但是如果Cells(, 257),则会返回错误。

--------------------------------------------------------------------------------

结语

我们用VBA对Excel进行处理,一般是对其工作表中的数据进行处理,因此,引用单元格区域是ExcelVBA编程中最基本的操作之一,只有确定了所处理的单元格区域,才能使用相应的属性和方法进行下一步的操作。

上面列举了一些引用单元格区域的情形和方式,可以看出,引用单元格区域有很多方式,有一些可能不常用,可以根据工作表的所处的环境和个人编程习惯进行选择使用。

当然,在编写程序时,也可能会将上面的一些属性联合使用,以达到选取特定操作对象的目的,例如Offset属性、Resize属性、CurrentRegion属性、UsedRange属性等的组合。

找到最后一行的一些方法探讨

使用End属性

在ExcelVBA中,使用End(xlUp)查找最后一行是最常使用且最为简单的方法,它假设要有一列总包含有数据(数字、文本和公式等),并且在该列中最后输入数据的单元格的下一行不会包含数据,因此不必担心会覆盖掉已有数据。但该方法有两个缺点:

(1) 仅局限于查找指定列的最后一行。

(2) 如果该列中最后一行被隐藏,那么该隐藏行将被视作最后一行。因此,在最后一行被隐藏时,其数据可能会被覆盖。但该列中间的隐藏行不会影响查找的结果。

[示例代码01]

Sub EndxlUp_OneColLastRow()

If Range("A" & Rows.Count).End(xlUp) = Empty Then GoTo Finish

'获取最后一行

MsgBox "最后一行是第" & Range("A" & Rows.Count).End(xlUp).Row & “行.”

Exit Sub

Finish:

MsgBox "没有发现公式或数据! "

End Sub

[示例代码02]

Sub NextRowInColumnUsedAsSub()

'包含所有数据和公式,忽略隐藏的最后一行

Range("A" & Range("A" & Rows.Count).End(xlUp).Row + 1).Select

End Sub

[示例代码03]

Sub NextRowInColumnUsedAsFunction()

'包含所有数据和公式,忽略隐藏的最后一行

Range("A" & LastRowInColumn("A") + 1).Select

End Sub

'- - - - - - - - - - - - - - - - - - - - - - - - -

Public Function LastRowInColumn(Column As String) As Long

LastRowInColumn = Range(Column & Rows.Count).End(xlUp).Row

End Function

注意,要输入新数据的列可能与我们所查找最后一行时所使用的列不同,例如,在上例中,我们可以修改为在B列中查找该列的最后一行,而在A列相应行的下一行中输入新的数据。

--------------------------------------------------------------------------------

使用Find方法

Find方法在当前工作有数据中进行查找,不需要指定列,也可以确保不会意外地覆盖掉已有数据。其中,参数LookIn指定所查找的类型,有三个常量可供选择,即xlValues、xlFormulas和xlComments。

(1) 常量xlFormulas将包含零值的单元格作为有数据的单元格。(当设置零值不显示时,该单元格看起来为空,但该参数仍将该单元格视为有数据的单元格)

(2) 常量xlValues将包含零值的单元格(如果设置零值不显示时)作为空白单元格,此时,若该单元格在最后一行,则Find方法会认为该单元格所在的行为空行,因此,该单元格中的内容可能会被新数据所覆盖。

[注:在Excel中,选择菜单“工具”——“选项”,在打开的“选项”对话框中,选择“视图”选项卡,将其中的“零值”前的复选框取消选中,则工作表中的零值都不会显示]

如果在参数LookIn中使用常量xlValues的话,还存在一个问题是:如果您将最后一行隐藏,则Find方法会认为倒数第二行是最后一行,此时您在最后一行的下一行输入数据,则会将实际的最后一行的数据覆盖。

您可以在隐藏最后一行与不隐藏最后一行,或者是最后一行显示零值与不显示零值时,运行下面的示例代码04,看看所得的结果有什么不同。

[示例代码04]

Sub Find_LastRowxlValues()

On Error GoTo Finish

'获取最后一行

MsgBox "最后一行是第" & Cells.Find("*", _

SearchOrder:=xlByRows, LookIn:=xlValues, _

SearchDirection:=xlPrevious).EntireRow.Row & “行”

Exit Sub

Finish:

MsgBox "没有发现数值!"

End Sub

因此,在使用Find方法时,您应该考虑所选参数设置的常量,以及工作表最后一行是否有可能

被隐藏或不显示零值。如果您忽视这些情况,很可能得不到您想要的结果,或者是覆盖掉已有数据。使用常量xlFormulas可以避免这个问题,如下面的示例代码05所示。

[示例代码05]

Sub Find_LastRowxlFormulas()

On Error GoTo Finish

'获取最后一行

MsgBox "最后一行是第" & Cells.Find("*", _

SearchOrder:=xlByRows, LookIn:=xlFormulas, _

SearchDirection:=xlPrevious).EntireRow.Row & “行”

Exit Sub

Finish:

MsgBox "没发现数值或公式!"

End Sub

下面再列举几个示例代码。

[示例代码06]

Sub NextRowUsedAsSub()

'选取最后一行的下一行

Range("A" & Cells.Find("*", LookIn:=xlFormulas, SearchDirection:=xlPrevious).Row +

1).Select

End Sub

[示例代码07]

Sub NextRowUsedAsFunction()

'选取最后一行的下一行(调用函数)

Range("A" & LastRow + 1).Select

End Sub

'- - - - - - - - - - - - - - - - - - - - - - - - -

Public Function LastRow() As Long

'本代码包含隐藏行

'使用常量xlFormulas,因为常量xlValues会忽略隐藏的最后一行

LastRow = Cells.Find("*", LookIn:=xlFormulas, SearchDirection:=xlPrevious).Row End Function

注:Find方法中,参数LookIn的默认值为xlFormulas。

--------------------------------------------------------------------------------

使用SpecialCells方法

SpecialCells方法用于查找指定类型的值,其语法为SpecialCells(Type,Value),有两种主要的使用方式:

(1) 若参数Type仅考虑常量,则在查找时会忽略和覆盖由公式生成的任何数据,如示例代码08所示。

(2) 若参数Type仅考虑由公式生成的数据,则在查找时会忽略和覆盖任何常量数据,如示例代码09所示。

如果参数Type是xlCellTypeConstants或者是xlCellTypeFormulas,则Value参数可使用常量决定哪种类型的单元格将被包含在结果中,这些常量值能组合而返回多个类型,其缺省设置是选择所有的常量或公式,而不管是何类型,可使用下面四个可选的常量:

1) xlTextValues(包含文本); 2) xlNumbers(包含数字);

3) xlErrors(包含错误值); 4) xlLogical(包含逻辑值)

自已在工作表输入一些含有数值和公式的数据,隐藏或不隐藏最后一行或公式所在的行,先体验下面的两段示例代码。

[示例代码08]

'当最后一行为公式或隐藏了最后行时,会忽略,即认为倒数第二行为最后一行

Sub NextConstantRowFunction()

Range("A" & LastConstantRow(True, True, True, True) + 1).Select

End Sub

'- - - - - - - - - - - - - - - - - - - - - - - -

Public Function LastConstantRow(Optional IncludeText As Boolean, _

Optional IncludeNumbers As Boolean, _

Optional IncludeErrors As Boolean, _

Optional IncludeLogicals As Boolean) As Long

Dim Text As Long, Numbers As Long, Errors As Long

Dim Logical As Long, AllTypes As Long

If IncludeText Then Text = xlTextValues Else Text = 0

If IncludeNumbers Then Numbers = xlNumbers Else Numbers = 0

If IncludeErrors Then Errors = xlErrors Else Errors = 0

If IncludeLogicals Then Logical = xlLogical Else Logical = 0

AllTypes = Text + Numbers + Errors + Logical

On Error GoTo Finish

LastConstantRow = Split(Cells.SpecialCells(xlCellTypeConstants, AllTypes).Address, "$") _

(UBound(Split(Cells.SpecialCells(xlCellTypeConstants, AllTypes).Address, "$"))) Exit Function

Finish:

MsgBox "没有发现数据!"

End Function

[示例代码09]

'查找含有公式的单元格所在的行,忽略该行以后的常量和隐藏的行

Sub NextFormulaRowFunction()

Range("A" & LastFormulaRow(True, True, True, True) + 1).Select

End Sub

'- - - - - - - - - - - - - - - - - - -

Public Function LastFormulaRow(Optional IncludeText As Boolean, _

Optional IncludeNumbers As Boolean, _

Optional IncludeErrors As Boolean, _

Optional IncludeLogicals As Boolean) As Long

Dim Text As Long, Numbers As Long, Errors As Long

Dim Logical As Long, AllTypes As Long

If IncludeText Then Text = xlTextValues Else Text = 0

If IncludeNumbers Then Numbers = xlNumbers Else Numbers = 0

If IncludeErrors Then Errors = xlErrors Else Errors = 0

If IncludeLogicals Then Logical = xlLogical Else Logical = 0

AllTypes = Text + Numbers + Errors + Logical

On Error GoTo Finish

LastFormulaRow = Split(Cells.SpecialCells(xlCellTypeFormulas, AllTypes).Address, "$") _

(UBound(Split(Cells.SpecialCells(xlCellTypeFormulas, AllTypes).Address, "$"))) Exit Function

Finish:

MsgBox "没有发现数据!"

End Function

下面的示例代码10忽略最后一行带有公式的单元格,即当最后一行的单元格中含有公式时,将倒数第二行作为最后一行,即只考虑直接输入到工作表中的数据。当最后一行没有公式但被隐藏时,并不影响该方法的判断。

[示例代码10]

Sub SpecialCells_LastRowxlCellTypeConstants()

Dim MyRow As Range

On Error GoTo Finish

Set MyRow = Intersect([A:A], Cells. _

SpecialCells(xlCellTypeConstants).EntireRow).EntireRow

'获取最后一行

MsgBox "最后一行是第" & Split(MyRow.Address, "$") _

(UBound(Split(MyRow.Address, "$"))) & “行”

Set MyRow = Nothing

Exit Sub

Finish:

MsgBox "没有发现数据!"

End Sub

注:因为上述代码使用了’Split’函数,故只适合于Office2000及以上的版本。

该方法也允许我们指定单个数据类型,诸如数字数据或文本数据,如下所示。

下面,我们查找的最后一行是仅在行中有数字(而不包含公式)的单元格的最后一行。

[示例代码11]

Sub SpecialCells_LastRowxlCellTypeNumberConstants()

Dim MyRow As Range

On Error GoTo Finish

Set MyRow = Intersect([A:A], Cells. _

SpecialCells(xlCellTypeConstants, xlNumbers).EntireRow)

'获取最后一行

MsgBox "最后一行是第" & Split(MyRow.Address, "$") _

(UBound(Split(MyRow.Address, "$"))) & “行”

Set MyRow = Nothing

Exit Sub

Finish:

MsgBox "没有发现数据!"

End Sub

下面,我们查找的最后一行是仅在行中有文本(而不包含公式)的单元格的最后一行。

[示例代码12]

Sub SpecialCells_LastRowxlCellTypeTextConstants()

Dim MyRow As Range

On Error GoTo Finish

Set MyRow = Intersect([A:A], Cells. _

SpecialCells(xlCellTypeConstants, xlTextValues).EntireRow)

'获取最后一行

MsgBox "最后一行是第" & Split(MyRow.Address, "$") _

(UBound(Split(MyRow.Address, "$"))) & “行”

Set MyRow = Nothing

Exit Sub

Finish:

MsgBox "没有发现数据!"

End Sub

下面,我们查找的最后一行是仅在行中有公式的单元格的最后一行。

[示例代码13]

Sub SpecialCells_LastRowxlCellTypeFormulas()

Dim MyRow As Range

On Error GoTo Finish

Set MyRow = Intersect([A:A], Cells. _

SpecialCells(xlCellTypeFormulas).EntireRow).EntireRow

'获取最后一行

MsgBox "最后一行是第" & Split(MyRow.Address, "$") _

(UBound(Split(MyRow.Address, "$"))) & “行”

Set MyRow = Nothing

Exit Sub

Finish:

MsgBox "没有发现数据!"

End Sub

同上面所讲述的一样,我们也能使用SpecailCells方法去找到其它特定类型的单元格所在的最后一行,下面是这些常量的一个完整的列表:

XlCellTypeAllFormatConditions (任何格式的单元格)

XlCellTypeAllValidation (带有数据有效性的单元格)

XlCellTypeBlanks (所使用区域中的空白单元格)

XlCellTypeComments (包含有批注的单元格)

XlCellTypeConstants (包含有常量的单元格)

XlCellTypeFormulas (包含有公式的单元格)

XlCellTypeLastCell (已使用区域中的最后一个单元格(看下面))

XlCellTypeSameFormatConditions (有相同格式的单元格)

XlCellTypeSameValidation (有相同数据有效性条件的单元格)

XlCellTypeVisible (工作表中所有可见的单元格)

-------------------------------------------------------------------------------- 使用UsedRange属性(及SpecialCells方法) UsedRange方法可用于在工作表中已使用区域查找最后一行,该区域包括可能以前使用过的任何单元格,但现在其中的数据被删除了,比如目前的工作表中只有第1行至第5行共5行,其它行都无数据,但在第6行中有些单元格以前使用过(可能仅仅格式化或内容清除了,总之该行现在不含有数据),那么第6行也包含在该已使用的区域中。此外,如果最后一行被隐藏,那么会将因此,使用该方法查找最后一行是无规律且不可靠的,它通常可能会得到预料不到的结果。 有时,与UsedRange属性相似的技术也能用SpecialCells方法实现,其常量xlCellTypeLastCell代表在”已使用区域”中的最后一个单元格,与UsedRange属性稍有不同的是,当您在最后一行中输入数据后,又将其删除,则此数据所在的单元格也包含在已使用的区域中,并且如果最后的行被隐藏,则将可见行的最后一行当作最后一行。下面有两段代码您可以在工作表中进行调试,看看其特点。 [示例代码14] Sub NextUsedRowSub() ' 选取可见的最后一行的下一行

Range("A" & Cells.SpecialCells(xlCellTypeLastCell).Row + 1).Select

End Sub

[示例代码15]

Sub NextUsedRowFunction()

Range("A" & LastUsedRow + 1).Select

End Sub

'- - - - - - - - - - - - - - - - - - - -

Public Function LastUsedRow() As Long

LastUsedRow = Cells.SpecialCells(xlCellTypeLastCell).Row

End Function

使用这里介绍的两种技术时,您一定要清楚工作表当前的状态,以找到正确的最后一行。

--------------------------------------------------------------------------------

使用CurrentRegion属性

CurrentRegion属性返回代表单元格所在的当前区域,即四周有空行的独立区域,因此,可使用此属性查找当前区域的最后一行。但是使用其查找最后一行的一个缺点是,必须首先选取当前区域,然后进行查找。

--------------------------------------------------------------------------------

小结

正如开始所讲述的一样,使用各种方法来查找最后一行都有其优缺点,并且都能找到您想要的最后一行,关键是您要了解各种方法的特性,以及工作表的状态,以便于选择所使用的方法来找到您需要的最后一行。

上述内容可能有不准确的地方,也可能有遗漏之处,您也可以在调试中体会和改进。

使用 Visual Basic 的普通任务是指定单元格或单元格区域,然后对该单元格或单元格区域进行一些操作,如输入公式或更改格式。

通常用一条语句就能完成操作,该语句可标识单元格,还可更改某个属性或应用某个方法。

在 Visual Basic 中,Range 对象既可表示单个单元格,也可表示单元格区域。下列主题说明了标识和处理 Range 对象最常用的方法。

用 A1 样式记号引用单元格和单元格区域

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

Sub FormatRange()

Workbooks("Book1").Sheets("Sheet1").Range("A1:D5") _

.Font.Bold = True

End Sub

下表演示了使用 Range 属性的一些 A1 样式引用。

引用 含义

Range("A1") 单元格 A1

Range("A1:B5") 从单元格 A1 到单元格 B5 的区域

Range("C5:D9,G9:H16") 多块选定区域

Range("A:A") A 列

Range("1:1") 第一行

Range("A:C") 从 A 列到 C 列的区域

Range("1:5") 从第一行到第五行的区域

Range("1:1,3:3,8:8") 第 1、3 和 8 行

Range("A:A,C:C,F:F") A 、C 和 F 列

用编号引用单元格

通过使用行列编号,可用 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 样式记号引用单元格。

引用行和列

可用 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

用快捷记号引用单元格

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

Sub ClearRange()

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

End Sub

Sub SetValue()

[MyRange].Value = 30

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

相对于其他单元格来引用单元格

处理相对于另一个单元格的某一单元格的常用方法是使用 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 赋予该变量。随后的语句用该变量代替该区域对象,以修改该区域的属性。

Sub Random()

Dim myRange As Range

Set myRange = Worksheets("Sheet1").Range("A1:D5")

myRange.Formula = "=RAND()"

myRange.Font.Bold = True

End Sub

引用工作表上的所有单元格

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

Sub ClearSheet()

Worksheets("Sheet1").Cells.ClearContents

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

在VBA代码中引用Excel工作表中单元格区域的方式小结

20xx年07月12日 星期四 上午 09:37 在VBA代码中引用Excel工作表中单元格区域的方式小结

分类:ExcelVBA>>ExcelVBA对象模型编程>>常用对象>>Range对象

在 使用ExcelVBA进行编程时,我们通常需要频繁地引用单元格区域,然后再使用相应的属性和方法对区域进行操作。所谓单元格区域,指的是单个的单元格、 或者是由多个单元格组成的区域、或者是整行、整列等。下面,我们设定一些情形,以问答的形式对引用单元格区域的方式进行归纳。

问题一:在VBA代码中,如何引用当前工作表中的单个单元格(例如引用单元格C3)?

回答:可以使用下面列举的任一方式对当前工作表中的单元格(C3)进行引用。

(1) Range("C3")

(2) [C3]

(3) Cells(3, 3)

(4) Cells(3, "C")

(5) Range("C4").Offset(-1)

Range("D3").Offset(, -1)

Range("A1").Offset(2, 2)

(6) 若C3为当前单元格,则可使用:ActiveCell

(7) 若将C3单元格命名为“Range1”,则可使用:Range("Range1")或[Range1]

(8) Cells(4, 3).Offset(-1) (9) Range("A1").Range("C3")

问题二:在VBA代码中,我要引用当前工作表中的B2:D6单元格区域,有哪些方式?

回答:可以使用下面列举的任一方式对当前工作表中单元格区域B2:D6进行引用。

(1) Range(“B2:D6”)

(2) Range("B2", "D6")

(3) [B2:D6]

(4) Range(Range("B2"), Range("D6"))

(5) Range(Cells(2, 2), Cells(6, 4))

(6) 若将B2:D6区域命名为“MyRange”,则又可以使用下面的语句引用该区域: ① Range("MyRange")

② [MyRange]

(7) Range("B2").Resize(5, 3)

(8) Range("A1:C5").Offset(1, 1)

(9) 若单元格B2为当前单元格,则可使用语句:Range(ActiveCell, ActiveCell.Offset(4, 2))

(10) 若单元格D6为当前单元格,则可使用语句:Range("B2", ActiveCell)

问题三:在VBA代码中,如何使用变量实现对当前工作表中不确定单元格区域的引用?

回答:有时,我们需要在代码中依次获取工作表中特定区域内的单元格,这通常可以采取下面的几种方式:

(1) Range(“A” & i)

(2) Range(“A” & i & “:C” & i)

(3) Cells(i,1)

(4) Cells(i,j)

其中,i、j为变量,在循环语句中指定i和j的范围后,依次获取相应单元格。

问题四:在VBA代码中,如何扩展引用当前工作表中的单元格区域? 回答:可以使用Resize属性,例如:

(1) ActiveCell.Resize(4, 4),表示自当前单元格开始创建一个4行4列的区域。

(2) Range("B2").Resize(2, 2),表示创建B2:C3单元格区域。

(3) Range("B2").Resize(2),表示创建B2:B3单元格区域。

(4) Range("B2").Resize(, 2),表示创建B2:C2单元格区域。

如果是在一个单元格区域(如B3:E6),或一个命名区域中(如将单元格区域B3:E6命名为“MyRange”)使用Resize属性,则只是相对于单元格区域左上角单元格扩展区域,例如:

代码Range("C3:E6").Resize(, 2),表示单元格区域C3:D6,并且扩展的单元格区域可不在原单元格区域内。

因此,可以知道Resize属性是相对于当前活动单元格或某单元格区域中左上角单元格按指定的行数或列数扩展单元格区域。

问题五:在VBA代码中,如何在当前工作表中基于当前单元格区域或指定单元格区域处理其它单元格区域?

回答:可以使用Offset属性,例如:

(1) Range("A1").Offset(2, 2),表示单元格C3。

(2) ActiveCell.Offset(, 1),表示当前单元格下一列的单元格。

(3) ActiveCell.Offset(1),表示当前单元格下一行的单元格。

(4) Range("C3:D5").Offset(, 1),表示单元格区域D3:E5,即将整个区域偏移一列。

从上面的代码示例可知,Offset属性从所指定的单元格开始按指定的行数和列数偏移,从而到达目的单元格,但偏移的行数和列数不包括指定单元格本身。

问题六:在VBA代码中,如何在当前工作表中引用交叉区域?

回答:可以使用Intersect方法,例如:

Intersect(Range("C3:E6"), Range("D5:F8")),表示单元格区域D5:E6,即单元格区域C3:E6与D5:F8相重迭的区域。

问题七:在VBA代码中,如何在当前工作表中引用多个区域?

回答:

(1) 可以使用Union方法,例如:

Union(Range("C3:D4"), Range("E5:F6")),表示单元格区域C3:D4和E5:F6所组成的区域。

Union方法可以将多个非连续区域连接起来成为一个区域,从而可以实现对多个非连续区域一起进行操作。

(2) 也可以使用下面的代码:

Range("C3:D4, E5:F6")或[C3:D4, E5:F6]

注意:Range("C3:D4", "F5:G6"),表示单元格区域C3:G6,即将两个区域以第一个区域左上角单元格为起点,以第二个区域右下角单元格为终点连接成一个新区域。

同时,在引用区域后使用Rows属性和Columns属性时,注意下面代码的区别: ①Range("C3:D4", "F8:G10").Rows.Count,返回的值为8;

②Range("C3:D4,F8:G10").Rows.Count,返回的值为2,即只计算第一个单元格区域。

问题八:在VBA代码中,如何引用当前工作表中活动单元格或指定单元格所在的区域(当前区域)?

回答:可以使用CurrentRegion属性,例如:

(1) ActiveCell.CurrentRegion,表示活动单元格所在的当前区域。

(2) Range("D5").CurrentRegion,表示单元格D5所在的当前区域。 当前区域是指周围由空行或空列所围成的区域。该属性的详细使用参见《CurrentRegion属性示例》一文。

问题九:在VBA代码中,如何引用当前工作表中已使用的区域?

回答:可以使用UsedRange属性,例如:

(1) Activesheet.UsedRange,表示当前工作表中已使用的区域。

(2) Worksheets("sheet1").UsedRange,表示工作表sheet1中已使用的区域。 与CurrentRegion属性不同的是,该属性代表工作表中已使用的单元格区域,包括显示为空行,但已进行过格式的单元格区域。该属性的详细使用参见《解析UsedRange属性》一文。

问题十:如何在单元格区域内指定特定的单元格?

回答:可以使用Item属性,例如:

(1) Range("A1:B10").Item(5,3)指定单元格C5,这个单元格处于以区域中左上角单元格A1(即区域中第1行第1列的单元格)为起点的第5行第3列。因为Item属性为默认属性,因此也可以简写为:Range("A1:B10")(5,3)。

如果将A1:B10区域命名为”MyRange”,那么Range("MyRange")(5,3)也指定单元格C5。

(2) Range("A1:B10")(12,13)指定单元格M12,即用这种方式引用单元格,该单元格不必一定要包含在区域内。

同时,也不需要索引数值是正值,例如:

① Range("D4:F6")(0,0)代表单元格C3;

② Range("D4:F6")(-1,-2)代表单元格A2。

而Range("D4:F6")(1,1)代表单元格D4。

(3) 也可以在单元格区域中循环,例如:

Range("D4:F6")(2,2)(3,4)代表单元格H7,即该单元格位于作为左上角单元格E5的第3行第4列(因为E5是开始于区域中左上角单元格D4起的第2行第2列)。

(4) 也能使用一个单个的索引数值进行引用。计数方式为从左向右,即在区域中的第一行开始从左向右计数,第一行结束后,然后从第二行开始从左到右接着计数,依次 类推。(注:从区域中第一行第一个单元格开始计数,当第一行结束时,转入第二行最左边的单元格,这样按一行一行从左向右依次计数。以单元格区域中第1个单 元格开始,按上述规则依次为第2个单元格、第3个单元格?.等等),例如:

Range("A1:B2")(1) 代表单元格A1;

Range("A1:B2")(2) 代表单元格B1;

Range("A1:B2")(3) 代表单元格A2;

Range("A1:B2")(4) 代表单元格B2。

这种方法可在工作表中连续向下引用单元格(即不一定是在单元格区域内,但在遵循相同的规律),例如:

Range("A1:B2")(5)代表单元格A3;

Range("A1:B2")(14)代表单元格B7,等等。

也可以使用单个的负数索引值。

这种使用单个索引值的方法对遍历列是有用的,例如,Range("D4")(1)代表单元格D4,Range("D4")(2)代表单元格D5,Range ("D4")(11)代表单元格D14,等等。

同理,稍作调整后也可遍历行,例如:

Range("D4").Columns(2)代表单元格E4,Range("D4").Columns(5)指定单元格H4,等等。

(5)当与对象变量配合使用时,Item属性能提供简洁并有效的代码,例如: Set rng = Worksheets(1).[a1]

定义了对象变量后,像单元格方法一样,Item属性允许使用两个索引数值引用工作表中的任一单元格,例如,rng(3,4)指定单元格D3。(By Chip Pearson)

问题十一:在VBA代码中,如何引用当前工作表中的整行或整列?

回答:见下面的示例代码:

(1) Range("C:C").Select,表示选择C列。

Range("C:E").Select,表示选择C列至E列。

(2) Range("1:1").Select,表示选择第一行。

Range("1:3").Select,表示选择第1行至第3行。

(3) Range("C:C").EntireColumn,表示C列;

Range("D1").EntireColumn,表示D列。

同样的方式,也可以选择整行,然后可以使用如AutoFit方法对整列或整行进行

调整。

问题十二:在VBA代码中,如何引用当前工作表中的所有单元格?

回答:可以使用下面的代码:

(1) Cells,表示当前工作表中的所有单元格。

(2) Range(Cells(1, 1), Cells(Cells.Rows.Count, Cells. Columns.Count)),其中Cells.Rows表示工作表所有行,Cells. Columns表示工作表所有列。

问题十三:在VBA代码中,如何引用工作表中的特定单元格区域?

回答:在工作表中,您可能使用过“定位条件”对话框。可以通过选择菜单“编辑——定位”,单击“定位”对话框中的“定位条件”按钮显示该对话框。这个对话框可以允许用户选择特定的单元格。例如:

(1)

Worksheets("sheet1").Cells.SpecialCells(xlCellTypeAllFormatConditions),表示工作表sheet1中由带有条件格式的单元格所组成的区域。

(2) ActiveCell.CurrentRegion.SpecialCells(xlCellTypeBlanks),表示当前工作表中活动单元格所在区域中所有空白单元格所组成的区域。

当然,还有很多常量和值的组合,可以让您实现特定单元格的查找并引用。参见《探讨在工作表中找到最后一行》一文。

问题十四:在VBA代码中,如何引用其它工作表或其它工作簿中的单元格区域? 回答:要引用其它工作表或其它工作簿中的单元格区域,只需在单元格对象前加上相应的引用对象即可,例如:

(1) Worksheets(“Sheet3”).Range(“C3:D5”),表示引用工作表sheet3中的单元格区域C3:D5。

(2) Workbooks(“MyBook.xls”).Worksheets(“sheet1”).Range(“B2”),表示引用MyBook工作簿中工作表Sheet1上的单元格B2。

问题十五:还有其它的一些情形吗?

回答:列举如下:

(1) Cells(15),表示单元格O1,即可在Cells属性中指定单元格数字来选择单元格,其计数顺序为自左至右、从上到下,又如Cells(257),表示单元格B1。

(2) Cells(, 256),表示单元格IV1,但是如果Cells(, 257),则会返回错误。

结语

我们用VBA对Excel进行处理,一般是对其工作表中的数据进行处理,因此,引用单元格区域是ExcelVBA编程中最基本的操作之一,只有确定了所处理的单元格区域,才能使用相应的属性和方法进行下一步的操作。

上面列举了一些引用单元格区域的情形和方式,可以看出,引用单元格区域有很多方式,有一些可能不常用,可以根据工作表的所处的环境和个人编程习惯进行选择使用。

当然,在编写程序时,也可能会将上面的一些属性联合使用,以达到选取特定操作对象的目的,例如Offset属性、Resize属性、CurrentRegion属性、UsedRange属性等的组合。

MsgBox 函数

作用:在对话框中显示消息,等待用户单击按钮,并返回一个 Integer 告诉用户单击哪一个按钮。

语法:

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

参数说明:

MsgBox 函数的语法具有以下几个命名参数:

Prompt-------必需的。字符串表达式,作为显示在对话框中的消息。prompt 的最大长度大约为 1024 个字符,由所用字符的宽度决定。如果 prompt 的内容超过一行,则可以在每一行之间用回车符 (Chr(13))、换行符 (Chr(10)) 或是回车与换行符的组合 (Chr(13) & Chr(10)) 将各行分隔开来。

Buttons-------可选的。数值表达式是值的总和,指定显示按钮的数目及形式,使用的图标样式,缺省按钮是什么以及消息框的强制回应等。如果省略,则 buttons 的缺省值为 0。 Title-------可选的。在对话框标题栏中显示的字符串表达式。如果省略 title,则将应用程序名放在标题栏中。

Helpfile--------可选的。字符串表达式,识别用来向对话框提供上下文相关帮助的帮助文件。如果提供了 helpfile,则也必须提供 context。

Context-------可选的。数值表达式,由帮助文件的作者指定给适当的帮助主题的帮助上下文编号。如果提供了 context,则也必须提供 helpfile。

用于MsgBox函数中Button参数的常量

常量 值 说明

vbOKOnly 0 只显示“确定”按钮

VbOKCancel 1 显示“确定”和“取消”按钮

VbAbortRetryIgnore 2 显示“终止”、“重试”和“忽略” 按钮

VbYesNoCancel 3 显示“是”、“否”和“取消”按钮

VbYesNo 4 显示“是”和“否”按钮

VbRetryCancel 5 显示“重试”和“取消”按钮

VbCritical 16 显示“关键信息”图标

VbQuestion 32 显示“警告询问”图标

VbExclamation 48 显示“警告消息”图标

VbInformation 64 显示“通知消息”图标

vbDefaultButton1 0 第一个按钮是缺省值(缺省设置)

vbDefaultButton2 256第二个按钮是缺省值

vbDefaultButton3 512第三个按钮是缺省值

vbDefaultButton4 768第四个按钮是缺省值

vbApplicationModal 0应用程序强制返回;应用程序一直被挂起,直到用户对消息框 作出响应才继续工作

vbSystemModal 4096系统强制返回;全部应用程序都被挂起,直到用户对消息框作 出响应才继续工作

vbMsgBoxHelpButton 16384将Help按钮添加到消息框

VbMsgBoxSetForeground 65536指定消息框窗口作为前景窗口

vbMsgBoxRight 524288文本为右对齐

vbMsgBoxRtlReading 1048576指定文本应为在希伯来和阿拉伯语系统中的从右到左显示 说明:

(1)第一组值(0–5)描述了消息框中显示的按钮的类型与数目;第二组值(16,32,48,64)描述了图标的样式;第三组值(0,256,512,768)说明哪一个按钮是缺省值;而第四组值(0,4096)则决定消息框的强制返回性。将这些数字相加以生成Buttons参数值的时候,只能由每组值取用一个数字。

(2)这些常数都是 Visual Basic for Applications (VBA) 指定的。结果,可以在程序代码中到处使用这些常数名称,而不必使用实际数值。实际数值与常数名称是等价的。

返回值

用于MsgBox函数返回值的常量

常数 值 说明

vbOK 1 确定

vbCancel 2 取消

vbAbort 3 终止

vbRetry 4 重试

vbIgnore 5 忽略

vbYes 6 是

vbNo 7 否

(1) 如果同时提供了Helpfile与Context参数,可以按F1键来查看与Context相应的帮助主题,Excel通常会在输入框中自动添加一个帮助(Help)按钮。

(2)若在消息框中显示“取消”按钮,则按下ESC键与单击“取消”按钮效果相同。若消息框中有“帮助”按钮,则提供相关的帮助信息。

(3)如果要输入多个参数并省略中间的某些参数,则必须在相应位置加入逗号分界符。 示例

(1)(1)使用 MsgBox 函数,在具有“是”及“否”按钮的对话框中显示一条严重错误信息。示例中的缺省按钮为“否”,MsgBox函数的返回值视用户按哪一个钮而定。并假设DEMO.HLP为一帮助文件,其中有一个帮助主题代码为1000。

Dim Msg,Style,Title,Help,Ctxt,Response,MyString

Msg="Do you want to continue ?" ’定义消息文本

Style = vbYesNo + vbCritical + vbDefaultButton2 ' 定义按钮

Title = "MsgBox Demonstration" ' 定义标题文本

Help = "DEMO.HLP" ' 定义帮助文件

Ctxt = 1000 ' 定义帮助主题

Response = MsgBox(Msg, Style, Title, Help, Ctxt)

If Response = vbYes Then ' 用户按下“是”

MyString = "Yes" ' 完成某操作

Else ' 用户按下“否”

MyString = "No" ' 完成某操作

End If

(2)只显示某消息

MsgBox “Hello!”

(3)将消息框返回的结果赋值给变量

Ans=MsgBox(“Continue?”,vbYesNo)

If MsgBox(“Continue?”,vbYesNo)<>vbYes Then Exit Sub

(4)使用常量的组合,赋值组Config变量,并设置第二个按钮为缺省按钮

Config=vbYesNo+vbQuestion+vbDefaultButton2

(5)若要在消息中强制换行,可在文本中使用vbCrLf(或vbNewLine)常量,用&加空格与字符隔开。如

MsgBox “This is the first line.” & vbNewLine & “Second line.”

(6)可以在消息框中使用vbTab常量插入一个制表符。下面的过程使用一个消息框来显示5×5单元格区域中的所有值,用vbTab常量分隔列并使用vbCrLf常量插入一个新行。注意在MsgBox函数最多只显示1024个字符,因此限制了可显示的单元格数。

Option Explicit

Sub ShowRangeValue()

Dim Msg As String

Dim r As Integer, c As Integer

Msg = ""

For r = 1 To 5

For c = 1 To 5

Msg = Msg & Cells(r, c) & vbTab

Next c

Msg = Msg & vbCrLf

Next r

MsgBox Msg

End Sub

(7)在消息框语句中运用工作表函数以及设置显示的数置格式,如下面语句所示:

MsgBox " selection has " & m & " cells ." & Chr(13) & " the sum is :" & Application.WorksheetFunction.Sum(Selection) & Chr(13) & "the average is :" & Format(Application.WorksheetFunction.Average(Selection), "#,##0.00"), vbInformation, "selection count & sum & average" & Chr(13)

更多相关推荐:
Excel表格格式大全

Excel表格公式大全1查找重复内容公式IFCOUNTIFAAA2gt1quot重复quotquotquot2用出生年月来计算年龄公式TRUNCDAYS360H6quot20xx830quotFALSE3600...

Excel表格格式设置

Excel20xx表格格式设置1Excel中字体格式设置1选中需要修改格式的单元格在开始选项卡字体区中修改字体字号等Excel中字号为1409除了下拉列表可以选的字号外可以直接输入想要的字号增大字号减小字号以2...

Excel表格复制后内容和格式都保持不变的方法

Excel表格复制后内容和格式都保持不变的方法我们在复制excel表格时经常是内容和格式一起复制但我们发现用普通的复制粘贴的方法是无法实现的特别是行高和列宽包括页面设置复制后总是不能保持原来的行高和列宽如下图所...

简单的excel表格制作

EXCEL表格制作及应用1新建一个EXCEL文件在桌面或任何磁盘里右键新建EXCEL2打开文件如下3在打开的EXCEL里点第一格写表头写完表头后再在第二行依次写你需要的项目在写这些项目时不要管它格子大小只要依次...

excel表格过宽

excel表格过宽不能完全打印出来怎么办1超过页面大小的问题在EXCEL中点文件页面设置在出现的页面设置窗口中的页面标签下有一个缩放是两个单选框选择第二个调整为页宽页高就可让让EXCEL根据你设置的页边距和文档...

Excel 电子表格—教案

计算机基础电子教案Excel电子表格项目一Excel基本操作教学进度教学课时4课时理论2节实践2节一目的要求1掌握Excel电子表格的基本制作过程和表格制作的基本方法2掌握工作表的基本操作二教材分析重点创建和编...

Excel表格的操作大全

也许你已经在Excel中完成过上百张财务报表也许你已利用Excel函数实现过上千次的复杂运算也许你认为Excel也不过如此甚至了无新意但我们平日里无数次重复的得心应手的使用方法只不过是Excel全部技巧的百分之...

Excel表格复制后内容和格式都保持不变的方法

Excel表格复制后内容和格式都保持不变的方法我们在复制excel表格时经常是内容和格式一起复制但我们发现用普通的复制粘贴的方法是无法实现的特别是行高和列宽包括页面设置复制后总是不能保持原来的行高和列宽如下图所...

word、ppt、excel文件格式解析

wordpptexcel文件格式解析1文件格式层级关系用于存储流数据的所有Sectors的列表叫做扇区链SectorChain这些Sectors可以是无序的因此用于指定一个流的Sectors的顺序的SID数组就...

Excel表格实用大全(上)

1把一个EXCEL的表格按另外一个表格顺序来排列方法请问怎么把一个EXCEL的表格按另外一个表格顺序来排列比方说我们公司以前有一张表格是旧的可是新的是打乱了要用新的表格里面的数据请问怎么按旧的表格的顺序快速的方...

Excel个人简历表格模板

Excel个人简历表格模板

学习制表excel

Excel表格的35招必学秘技也许你已经在Excel中完成过上百张财务报表也许你已利用Excel函数实现过上千次的复杂运算也许你认为Excel也不过如此甚至了无新意但我们平日里无数次重复的得心应手的使用方法只不...

excel表格范本(33篇)