Range对象应用大全_第1页
Range对象应用大全_第2页
Range对象应用大全_第3页
Range对象应用大全_第4页
Range对象应用大全_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Range对象应用大全VBA代码中引用或选择Excel工作表的单元格或单元格区域在使用ExcelVBA编程时,我们通常需要频繁地引用单元格区域,然后再使用相应的属性和方法对区域进行操作。所谓单元格区域,指的是单个的单元格、或者包含连续或非连续的多个单元格组成的区域、或者是整行、整列、甚至是三维单元格区域等。

[应用1]引用当前工作表中的单个单元格(例如引用单元格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″)

此外,可以使用下面的代码选择当前工作表中的单元格D5:

ActiveSheet.Cells(5,4).Select

或:ActiveSheet.Range(“D5″).Select

[应用2]引用当前工作表中的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)

下面的过程将单元格区域A1:D5的字体设置为加粗。SubFormatRange()Workbooks("Book1").Sheets("Sheet1").Range("A1:D5")_.Font.Bold=TrueEndSubRange(“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列。

下面是给单元格赋值的几个例子。

示例1:Subtest1()Worksheets("Sheet1").Range("A5").Value=22MsgBox"工作表Sheet1内单元格A5中的值为"_&Worksheets("Sheet1").Range("A5").ValueEndSub示例2:Subtest2()Worksheets("Sheet1").Range("A1").Value=_Worksheets("Sheet1").Range("A5").ValueMsgBox"现在A1单元格中的值也为"&_Worksheets("Sheet1").Range("A5").ValueEndSub示例3:Subtest3()MsgBox"用公式填充单元格,本例为随机数公式"Range("A1:H8").Formula="=Rand()"EndSub示例4:Subtest4()Worksheets(1).Cells(1,1).Value=24MsgBox"现在单元格A1的值为24"EndSub示例5:Subtest5()MsgBox"给单元格设置公式,求B2至B5单元格区域之和"ActiveSheet.Cells(2,1).Formula="=Sum(B1:B5)"EndSub示例6:Subtest6()MsgBox"设置单元格C5中的公式."Worksheets(1).Range("C5:C10").Cells(1,1).Formula="=Rand()"EndSub示例7:Subtest7()MsgBox"给命名区域赋值."ActiveSheet.Range("MyCell").Value=1EndSub其中,MyCell为单元格区域的名称。

[应用3]引用当前工作表中不确定的单元格区域

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

(1)Range(“A”&i)

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

(3)Cells(i,1)

(4)Cells(i,j)

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

在下例中,Cells(6,1)返回Sheet1上的单元格A6,然后将Value属性设置为10。SubEnterValue()Worksheets("Sheet1").Cells(6,1).Value=10EndSub因为可以用变量替代编号,所以Cells属性非常适合于在单元格区域中循环,如下例中所示。SubCycleThrough()DimCounterAsIntegerForCounter=1To20Worksheets("Sheet1").Cells(Counter,3).Value=CounterNextCounterEndSub如果要同时更改某个区域中所有单元格的属性(或将方法应用于该区域中的所有单元格),建议使用Range属性。

[应用4]扩展引用当前工作表中的单元格区域

可以使用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属性是相对于当前活动单元格或某单元格区域中左上角单元格按指定的行数或列数扩展单元格区域。

再举一些例子。

例1:要选择当前工作表中名为“Database”区域,然后将该区域向下扩展5行,可以使用下面的代码:Range("Database").SelectSelection.Resize(Selection.Rows.Count+5,Selection.Columns.Count).Select例2:选择名为“Database”区域下方4行右侧3列的一个区域,然后扩展2行和1列,可以使用下面的代码:Range("Database").SelectSelection.Offset(4,3).Resize(Selection.Rows.Count+2,Selection.Columns.Count+1).Select[应用5]在当前工作表中基于当前单元格区域或指定单元格区域处理其它单元格区域

可以使用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属性从所指定的单元格开始按指定的行数和列数偏移,从而到达目的单元格,但偏移的行数和列数不包括指定单元格本身。正值表示向下和向右,负值表示向上和向左,零值则是指当前单元格。

例如,要选择距当前单元格下面5行左侧4列的单元格,可以使用下面的代码:ActiveCell.Offset(5,-4).Select要选择距当前单元格上方2行右侧3列的单元格,可以使用下面的代码:ActiveCell.Offset(-2,3).Select注意:一定要保证当前单元格与所选单元格之间的距离在工作表范围内,否则会出错。

又如,要选择距单元格C7下方5行右侧4列的单元格,可以使用下面的代码:ActiveSheet.Cells(7,3).Offset(5,4).Select或:ActiveSheet.Range("C7").Offset(5,4).Select再举一些例子。

例如,要选择与名为“Test”的区域大小相同但在该区域下方4行右侧3列的一个区域,可以使用下面的代码:ActiveSheet.Range("Test").Offset(4,3).Select如果该命名区域不在当前工作表中,可以先激活该工作表,然后再选择,如下面的代码:Sheets("Sheet3").ActivateActiveSheet.Range("Test").Offset(4,3).Select下面的例子计算移动平均值:SubMovingAvg()DimrngAsRangeDimlngRowAsLongSetrng=Range("B1:B3")ForlngRow=3To12Cells(lngRow,"C").Value=WorksheetFunction.Sum(rng)/3Setrng=rng.Offset(1,0)NextlngRowEndSub上述代码首先将B列中的前3个单元格设置为一个单元格区域,计算其平均值,并放置在单元格C3中。接着,Offset属性将单元格区域下移一行但仍在B列,计算单元格区域B2:B4的平均值,并将结果放置到单元格C4。代码重复上述过程直到单元格B12。

[应用6]在当前工作表中引用交叉区域

可以使用Intersect方法,例如:Intersect(Range("C3:E6"),Range("D5:F8"))表示单元格区域D5:E6,即单元格区域C3:E6与D5:F8相重迭的区域。

又如,要选择名为“Test”和“Sample”的两个区域的交叉区域,可以使用下面的代码:Application.Intersect(Range("Test"),Range("Sample")).Select注意,两个区域必须在同一工作表中。

注意,如果两个区域不存在交叉,那么该方法返回Nothing。

例如,下面的代码选择两个命名区域的交叉部分,如果不存在交叉,则显示一条消息。SubIntersectSample()Worksheets("Sheet1").ActivateSetIntersect=Application.Intersect(Range("rng1"),Range("rng2"))IfIntersectIsNothingThenMsgBox"不存在交叉区域."ElseIntersect.SelectEndIfEndSub[应用7]在当前工作表中引用多个区域

(1)可以使用Union方法,将多个区域组合到一个Range对象中。例如:Union(Range("C3:D4"),Range("E5:F6"))表示单元格区域C3:D4和E5:F6所组成的区域。

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

(2)也可以使用下面的代码,即通过在两个或多个引用之间插入逗号,可使用Range属性引用多个区域: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,即只计算第一个单元格区域。

(3)可用Areas属性引用选定的单元格区域或多块选定区域中的区域集合。

例1:以下示例清除了Sheet1上三个区域的内容。SubClearRanges()Worksheets("Sheet1").Range("C5:D9,G9:H16,B14:D18")._ClearContentsEndSub命名区域使得用Range属性处理多个区域更加容易。以下示例可在所有这三个命名区域处于同一工作表时运行。SubClearNamed()Range("MyRange,YourRange,HisRange").ClearContentsEndSub例2:为了同时选择名为“Test”和“Sample”的两个区域,可以使用下面的代码:Application.Union(Range("Test"),Range("Sample")).Select注意,这两个区域须在同一工作表中,如下面的代码:Sety=Application.Union(Range("Sheet1!A1:B2"),Range("Sheet1!C3:D4"))但Union方法不能处理不同工作表中的区域,可下面的代码:Sety=Application.Union(Range("Sheet1!A1:B2"),Range("Sheet2!C3:D4"))将会出错。

例3:以下示例创建了名为myMultipleRange的Range对象,并将其定义为区域A1:B2和C3:D4的组合,然后将该组合区域的字体设置为加粗。SubMultipleRange()Dimr1,r2,myMultipleRangeAsRangeSetr1=Sheets("Sheet1").Range("A1:B2")Setr2=Sheets("Sheet1").Range("C3:D4")SetmyMultipleRange=Union(r1,r2)myMultipleRange.Font.Bold=TrueEndSub例4:下述过程计算选定区域中的块数目,如果有多个块,就显示一则警告消息。SubFindMultiple()IfSelection.Areas.Count>1ThenMsgBox"不能对多个选区进行操作."EndIfEndSub[应用8]引用当前工作表中活动单元格或指定单元格所在的区域(当前区域)

可以使用CurrentRegion属性,例如:

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

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

当前区域是指周围由空行或空列所围成的区域。

下面的示例将当前工作表当前区域的值复制到剪贴板,然后将这些值插入到新工作表:SubCopyCurrentRegionValue()Range("D5").ActivateActiveCell.CurrentRegion.SelectSelection.CopySheets.AddAfter:=Sheets(Sheets.Count)Sheets(Sheets.Count).Name="Sample"Sheets("Sample").SelectRange("D5").ActivateActiveSheet.PasteEndSub[应用9]引用当前工作表中已使用的区域

可以使用UsedRange属性,例如:

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

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

与CurrentRegion属性不同的是,该属性代表工作表中已使用的单元格区域,包括显示为空行,但已进行过格式的单元格区域。'选取当前工作表中已使用的单元格区域SubSelectUsedRange()MsgBox"选取当前工作表中已使用的单元格区域"_&vbCrLf&"并显示其地址"ActiveSheet.UsedRange.SelectMsgBoxActiveSheet.UsedRange.AddressEndSub[应用10]在单元格区域内指定特定的单元格

可以使用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属性能提供简洁并有效的代码,例如:Setrng=Worksheets(1).[A1]定义了对象变量后,像单元格方法一样,Item属性允许使用两个索引数值引用工作表中的任一单元格,例如,rng(3,4)指定单元格D3。

[应用11]引用当前工作表中的整行或整列

见下面的示例代码:

(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方法对整列或整行进行调整。

此外,可用Rows属性或Columns属性来处理整行或整列。这两个属性返回代表单元格区域的Range对象。在下例中,Rows(1)返回Sheet1上的第一行,然后将区域字体加粗。SubRowBold()Worksheets("Sheet1").Rows(1).Font.Bold=TrueEndSub另,Rows(1)代表当前工作表中的第一行,Rows代表当前工作表中的所有的行,Columns(1)代表当前工作表中的第一列,Columns(“A”)代表当前工作表中的第一列,Columns代表当前工作表中所有的列。

若要同时处理若干行或列,可创建一个对象变量并使用Union方法,将对Rows属性或Columns属性的多个调用组合起来。下例将活动工作簿中第一张工作表上的第一行、第三行和第五行的字体设置为加粗。SubSeveralRows()Worksheets("Sheet1").ActivateDimmyUnionAsRangeSetmyUnion=Union(Rows(1),Rows(3),Rows(5))myUnion.Font.Bold=TrueEndSub[应用12]引用当前工作表中的所有单元格

可以使用下面的代码:

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

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

下面的过程清除活动工作簿中Sheet1上所有单元格的内容。SubClearSheet()Worksheets("Sheet1").Cells.ClearContentsEndSub[应用13]引用工作表中的特定单元格区域

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

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

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

(3)选择所有公式单元格SubSelectSpecialCells()MsgBox"选择当前工作表中所有公式单元格"ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas).SelectEndSub当然,还有很多常量和值的组合,可以让您实现特定单元格的查找并引用。

[应用14]引用命名区域

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

例1:要选择当前工作表中名为“Test”的区域,可以使用下面的代码:Range("Test").Select或:Application.Goto"Test"例2:选择同一工作簿中另一工作表上名为“Test”的区域,可使用下面的代码:Application.GotoSheets("Sheet1").Range("Test")也可以先激活工作表,再选择:Sheets("Sheet1").ActivateRange("Test").Select例3:要选择不同工作簿中工作表上名为“Test”的区域,可使用下面的代码:Application.GotoWorkbooks("BOOK2.XLS").Sheets("Sheet2").Range("Test")也可以先激活工作表,再选择:Workbooks("BOOK2.XLS").Sheets("Sheet2").ActivateRange("Test").Select例4:以下示例引用名为“MyBook.xls”的工作簿中名为“MyRange”的区域,并将该区域的字体设置为斜体:SubFormatRange()Range("MyBook.xls!MyRange").Font.Italic=TrueEndSub例5:以下示例引用名为“Report.xls”的工作簿中特定工作表的区域“Sheet1!Sales”,并添加边框线:SubFormatSales()Range("[Report.xls]Sheet1!Sales").BorderAroundWeight:=xlThinEndSub例6:要选定命名区域,可以使用GoTo方法。该方法将激活工作簿和工作表,然后选定该区域。SubClearRange()Application.GotoReference:="MyBook.xls!MyRange"Selection.ClearContentsEndSub以下示例显示对于活动工作簿将如何编写与上例相同的过程。SubClearRange()Application.GotoReference:="MyRange"Selection.ClearContentsEndSub例7:下例用ForEach…Next循环语句在命名区域中的每一个单元格上循环。如果该区域中的任一单元格的值超过limit的值,就将该单元格的颜色更改为黄色。SubApplyColor()ConstLimitAsInteger=25ForEachcInRange("MyRange")Ifc.Value>LimitThenc.Interior.ColorIndex=27EndIfNextcEndSub[应用15]选择特别指定的单元格或单元格区域

下面的示例使用了如下图1所示的工作表。

图1:示例数据

例1:选择连续数据列中的最后一个单元格

要选择一个列A中最后一个单元格,可以使用下面的代码:ActiveSheet.Range("A1").End(xlDown).Select在图1所示的工作表中运行上述代码,将选择单元格A4。'选取最下方的单元格SubSelectEndCell()MsgBox"选取当前单元格区域内最下方的单元格"ActiveCell.End(xlDown).SelectEndSub可以改变参数xlDown以选取最左边、最右边、最上方的单元格。

例2:选择连续数据列底部的空单元格

要选择连续单元格区域下面的空单元格,可以使用下面的代码:ActiveSheet.Range("A1").End(xlDown).Offset(1,0).Select在图1所示的工作表中运行上述代码,将选择单元格A5。

例3:选择某列中连续数据单元格区域

要选择列A中连续数据单元格区域,可以使用下面的代码:ActiveSheet.Range("A1",ActiveSheet.Range("A1").End(xlDown)).Select或:ActiveSheet.Range("A1:"&ActiveSheet.Range("A1").End(xlDown).Address).Select在图1所示的工作表中运行上述代码,将选择单元格区域A1:A4。

例4:选择某列中非连续数据单元格区域

要选择某列中非连续数据单元格区域,可以使用下面的代码:ActiveSheet.Range("A1",ActiveSheet.Range("A65536").End(xlUp)).Select或:ActiveSheet.Range("A1:"&ActiveSheet.Range("A1").End(xlDown).Address).Select在图1所示的工作表中运行上述代码,将选择单元格区域A1:A6。

例5:选择一个矩形(规则的)单元格区域

要选择围绕某单元格的一个矩形区域,可以使用CurrentRegion属性。CurrentRegion属性将选择四周被空行和空列围绕的区域,如下面的代码:ActiveSheet.Range("A1").CurrentRegion.Select在图1所示的工作表中运行上述代码,将选择单元格区域A1:C4。也可以使用下面的代码:ActiveSheet.Range("A1",ActiveSheet.Range("A1").End(xlDown).End(xlToRight)).Select或:ActiveSheet.Range("A1:"&ActiveSheet.Range("A1").End(xlDown).End(xlToRight).Address).Select若想选择单元格区域A1:C6,可使用下面的代码:lastCol=ActiveSheet.Range("A1").End(xlToRight).ColumnlastRow=ActiveSheet.Cells(65536,lastCol).End(xlUp).RowActiveSheet.Range("A1",ActiveSheet.Cells(lastRow,lastCol)).Select或:lastCol=ActiveSheet.Range("A1").End(xlToRight).ColumnlastRow=ActiveSheet.Cells(65536,lastCol).End(xlUp).RowActiveSheet.Range("A1:"&ActiveSheet.Cells(lastRow,lastCol).Address).Select[应用16]选择多个不同长度的非连续列

例如,有如下图2所示的工作表:

图2:示例数据

要同时选择A列和C列中的数据,即单元格区域A1:A3和C1:C6,可使用下面的代码:StartRange="A1"EndRange="C1"Seta=Range(StartRange,Range(StartRange).End(xlDown))Setb=Range(EndRange,Range(EndRange).End(xlDown))Union(a,b).Select[应用17]设置当前单元格的前一个单元格和后一个单元格的值SubSetCellValue()MsgBox"将当前单元格中前面的单元格值设为""我前面的单元格"""&vbCrLf_&"后面的单元格值设为""我后面的单元格"""ActiveCell.Previous.Value="我前面的单元格"ActiveCell.Next.Value="我后面的单元格"EndSub[应用18]引用其它工作表或其它工作簿中的单元格区域

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

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

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

此外,要选择同一工作簿中另一工作表上的单元格E6,可以使用下面的代码:Application.GotoActiveWorkbook.Sheets("Sheet2").Cells(6,5)或:Application.Goto(ActiveWorkbook.Sheets("Sheet2").Range("E6"))也可以先激活该工作表,然后再选择:Sheets("Sheet2").ActivateActiveSheet.Cells(6,5).Select同样,例如要选择另一工作簿中某工作表上的单元格F7,可以使用下面的代码:Application.GotoWorkbooks("BOOK2.XLS").Sheets("Sheet1").Cells(7,6)或:Application.GotoWorkbooks("BOOK2.XLS").Sheets("Sheet1").Range("F7")也可以先激活该工作簿中的工作表,然后再选择:Workbooks("BOOK2.XLS").Sheets("Sheet1").ActivateActiveSheet.Cells(7,6).Select又如,要选择同一工作簿中另一工作表上的单元格区域D3:E11,可以使用下面的代码:Application.GotoActiveWorkbook.Sheets("Sheet3").Range("D3:E11")或:Application.GotoActiveWorkbook.Sheets("Sheet3").Range("D3","E11")也可以先激活该工作表,然后再选择:Sheets("Sheet3").ActivateActiveSheet.Range(Cells(3,4),Cells(11,5)).Select要选择另一工作簿中某工作表上的单元格区域E4:F12,可以使用下面的代码:Application.GotoWorkbooks("BOOK2.XLS").Sheets("Sheet1").Range("E4:F12")或:Application.GotoWorkbooks("BOOK2.XLS").Sheets("Sheet1").Range("E4","F12")也可以先激活该工作表,然后再选择:Workbooks("BOOK2.XLS").Sheets("Sheet1").ActivateActiveSheet.Range(Cells(4,5),Cells(12,6)).Select说明:使用Application.Goto方法,如果指定另一工作表(不是当前工作表)中的指定区域,在Range属性中使用两个Cells属性时,则必须包括Sheets对象,如:Application.GotoSheets("Sheet1").Range(Sheets("Sheet1").Range(Sheets("Sheet1").Cells(2,3),Sheets("Sheet1").Cells(4,5)))[应用19]处理三维区域

如果要处理若干工作表上相同位置的单元格区域,可用Array函数选定两张或多张工作表。下例设置三维单元格区域的边框格式。SubFormatSheets()Sheets(Array("Sheet2","Sheet3","Sheet5")).SelectRange("A1:H1").SelectSelection.Borders(xlBottom).LineStyle=xlDoubleEndSub下例应用FillAcrossSheets方法,将Sheet2上区域中的格式和所有数据传送到活动工作簿中所有工作表上的相应区域。SubFillAll()Worksheets("Sheet2").Range("A1:H1")_.Borders(xlBottom).LineStyle=xlDoubleWorksheets.FillAcrossSheets(Worksheets("Sheet2")_.Range("A1:H1"))EndSub[应用20]使用Range对象变量引用单元格

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

以下过程将创建对象变量myRange,然后将活动工作簿中Sheet1上的区域A1:D5赋予该变量。随后的语句用该变量名称代替Range对象,以修改该区域的属性。SubRandom()DimmyRangeAsRangeSetmyRange=Worksheets("Sheet1").Range("A1:D5")myRange.Formula="=RAND()"myRange.Font.Bold=TrueEndSub[应用21]其它的引用方式

对于Excel2007以前的版本来说:

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

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

Excel2007中增加了工作表列数和行数,因此上述限制相应改变。

说明:上面的一些代码在选择单元格或单元格区域时,先激活工作表后选择,这只是为了说明的方便。实际上,在操作单元格时,只要引用了相应的单元格或单元格区域,不必先激活工作表。

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

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

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

下面对Range对象的一些常用属性和方法进行简单的小结。

1、Activate与Select

试验下面的过程:SubSelectAndActivate()Range("B3:E10").SelectRange("C5").ActivateEndSub其结果如下图所示:

图3:Select与Activate

即选取单元格区域B3:E10并将单元格C5选中。

Selection指单元格区域B3:E10,而ActiveCell则是单元格C5;ActiveCell代表单个的单元格,而Selection则可以代表单个单元格,也可以代表单元格区域。

2、Range属性

可以使用Application对象的Range属性引用Range对象,如Application.Range("B2")'代表当前工作表中的单元格B2若引用当前工作表中的单元格,也可以忽略前面的Application对象。Range("A1:D10")'代表当前工作表中的单元格区域A1:D10Range("A1:A10,C1:C10,E1:E10")'代表当前工作表中非连续的三个区域组成的单元格区域Range属性也接受指向单元格区域对角的两个参数,如:Range("A1","D10")'代表单元格区域A1:D10当然,Range属性也接受单元格区域名称,如:Range("Data")'代表名为Data的数据区域Range属性的参数可以是对象也可以是字符串,如:Range("A1",Range("LastCell"))3、单元格引用的快捷方式

可以在引用区域两侧加上方括号来快速引用单元格区域,如:

[B2]

[A1:D10]

[A1:A10,C1:C10,E1:E10]

[Data]

但其引用的是绝对区域。

4、Cells属性

可以使用Cells属性来引用Range对象。如:ActiveSheet.CellsApplication.Cells'引用当前工作表中的所有单元格Cell(2,2)Cell(2,"B")'引用单元格B2Range(Cells(1,1),Cells(10,5))'引用单元格区域A1:E10若想在一个单元格区域中循环时,使用Cells属性是很方便的。

也可以使用Cells属性进行相对引用,如:Range("D10:G20").Cells(2,3)'表示引用单元格区域D10:G20中第2行第3列的单元格,即单元格F11也可使用语句:Range(“D10″).Cells(2,3)达到同样的引用效果。

5、Offset属性

Offset属性基于当前单元格按所给参数进行偏移,与Cells属性不同的是,它基于0即基准单元格为0,如:

Range(“A10″).Cells(1,1)和Range(“A10″).Offset(0,0)都表示单元格A10

当想引用于基准单元格区域同样大小的单元格区域时,则Offset属性是有用的。

6、Resize属性

可使用Resize属性获取相对于原单元格区域左上角单元格指定大小的区域。

7、SpecialCells方法

SpecialCells方法对应于“定位条件”对话框,如图05-02所示:

图4:“定位条件”对话框

8、CurrentRegion属性

使用CurrentRegion属性可以选取当前单元格所在区域,即周围是空行和空列所围成的矩形区域,等价于“Ctrl+Shift+*”快捷键。

9、End属性

End属性所代表的操作等价于“Ctrl+方向箭”的操作,使用常量xlUp、xlDown、xlToLeft和xlToRight分别代表上、下、左、右箭。

例如,下面的代码汇总活动单元格下方列的值:SubSumBelow()DimrngAsRange'汇总活动单元格下方单元格的值WithActiveCellSetrng=Range(.Offset(1),.Offset(1).End(xlDown)).Formula="=SUM("&_rng.Address(RowAbsolute:=False,ColumnAbsolute:=False)&")".CopyDestination:=Range(.Cells(1),.Offset(1).End(xlToRight).Offset(-1))EndWithEndSub10、Columns属性和Rows属性

Columns属性和Rows属性分别返回单元格区域中的所有列和所有行。

11、Areas集合

在多个非连续的单元格区域中使用Columns属性和Rows属性时,只是返回第一个区域的行或列,如:Range("A1:B5,C6:D10,E11:F15").Rows.Count将返回5。

此时应使用Areas集合来返回区域中每个块的地址,如:ForEachrngInRange("A1:B5,C6:D10,E11:F15").AreasMsgBoxrng.AddressNextrng12、Union方法和Intersect方法

当想从两个或多个单元格区域中生成一个单元格区域时,使用Union方法;当找到两个或多个单元格区域共同拥有的单元格区域时,使用Intersect方法。

当然,操作单元格或单元格区域有很多有用的技巧,这需要在实践中总结和归纳。接下来的文章,我们将对Range对象的常用属性和方法进行详解。1.Find方法的作用

使用VBA在工作表或单元格区域中查找某项数据时,我们通常使用For…Next循环,这在小范围中使用还可以,但应用在大量数据中查找时,会耗费较多时间。

而在Excel工作表中,通常使用菜单“编辑>>查找”命令或按Ctrl+F组合键,在“查找和替换”对话框中来迅速查找所需的数据。在VBA中,我们也能使用这种方法,即Find方法,这在下面的内容中介绍。

Find方法将在指定的单元格区域中查找包含参数指定数据的单元格,若找到符合条件的数据,则返回包含该数据的单元格;若未发现相匹配的数据,则返回Nothing。该方法返回一个Range对象,在使用该方法时,不影响选定区域或活动单元格。

为什么要使用Find方法呢?最主要的原因是查找的速度。如果要使用VBA代码在包含大量数据的单元格区域中查找某项数据,应该使用Find方法。

例如,在工作表Sheet1的单元格IV65536中输入fanjy,然后运行下面的代码:SubQuickSearch()IfNotSheet1.Cells.Find("fanjy")IsNothingThenMsgBox"已找到fanjy!"EndSub再试试下面的代码:SubSlowSearch()DimRAsRangeForEachRInSheet1.CellsIfR.Value="fanjy"ThenMsgBox"已找到fanjy!"NextREndSub比较一下两段代码的速度,可知第一段代码运行很快,而第二段代码却要执行相当长的一段时间。

2.Find方法的语法

[语法]<单元格区域>.Find(What,[After],[LookIn],[LookAt],[SearchOrder],[SearchDirection],[MatchCase],[MatchByte],[SearchFormat])[参数说明]

(1)<单元格区域>,必须指定,返回一个Range对象。

(2)参数What,必需指定。代表所要查找的数据,可以为字符串、整数或者其它任何数据类型的数据。对应于“查找与替换”对话框中,“查找内容”文本框中的内容。

(3)参数After,可选。指定开始查找的位置,即从该位置所在的单元格之后向后或之前向前开始查找(也就是说,开始时不查找该位置所在的单元格,直到Find方法绕回到该单元格时,才对其内容进行查找)。所指定的位置必须是单元格区域中的单个单元格,如果未指定本参数,则将从单元格区域的左上角的单元格之后开始进行查找。

(4)参数LookIn,可选。指定查找的范围类型,可以为以下常量之一:xlValues、xlFormulas或者xlComments,默认值为xlFormulas。对应于“查找与替换”对话框中,“查找范围”下拉框中的选项。

(5)参数LookAt,可选。可以为以下常量之一:XlWhole或者xlPart,用来指定所查找的数据是与单元格内容完全匹配还是部分匹配,默认值为xlPart。对应于“查找与替换”对话框中,“单元格匹配”复选框。

(6)参数SearchOrder,可选。用来确定如何在单元格区域中进行查找,是以行的方式(xlByRows)查找,还是以列的方式(xlByColumns)查找,默认值为xlByRows。对应于“查找与替换”对话框中,“搜索”下拉框中的选项。

(7)参数SearchDirection,可选。用来确定查找的方向,即是向前查找(XlPrevious)还是向后查找(xlNext),默认的是向后查找。

(8)参数MatchCase,可选。若该参数值为True,则在查找时区分大小写。默认值为False。对应于“查找与替换”对话框中,“区分大小写”复选框。

(9)参数MatchByter,可选。即是否区分全角或半角,在选择或安装了双字节语言时使用。若该参数为True,则双字节字符仅与双字节字符相匹配;若该参数为False,则双字节字符可匹配与其相同的单字节字符。对应于“查找与替换”对话框中,“区分全角/半角”复选框。

(10)参数SearchFormat,可选,指定一个确切类型的查找格式。对应于“查找与替换”对话框中,“格式”按钮。当设置带有相应格式的查找时,该参数值为True。

(11)在每次使用Find方法后,参数LookIn、LookAt、SearchOrder、MatchByte的设置将保存。如果下次使用本方法时,不改变或指定这些参数的值,那么该方法将使用保存的值。

在VBA中设置的这些参数将更改“查找与替换”对话框中的设置;同理,更改“查找与替换”对话框中的设置,也将同时更改已保存的值。也就是说,在编写好一段代码后,若在代码中未指定上述参数,可能在初期运行时能满足要求,但若用户在“查找与替换”对话框中更改了这些参数,它们将同时反映到程序代码中,当再次运行代码时,运行结果可能会产生差异或错误。若要避免这个问题,在每次使用时建议明确的设置这些参数。

3.Find方法使用示例

3.1本示例在活动工作表中查找what变量所代表的值的单元格,并删除该单元格所在的列。SubFind_Error()DimrngAsRangeDimwhatAsStringwhat="Error"DoSetrng=ActiveSheet.UsedRange.Find(what)IfrngIsNothingThenExitDoElseColumns(rng.Column).DeleteEndIfLoopEndSub3.2带格式的查找

本示例在当前工作表单元格中查找字体为”ArialUnicodeMS”且颜色为红色的单元格。其中,Application.FindFormat对象允许指定所需要查找的格式,此时Find方法的参数SearchFormat应设置为True。SubFindWithFormat()WithApplication.FindFormat.Font.Name="ArialUnicodeMS".ColorIndex=3EndWithCells.Find(what:="",SearchFormat:=True).ActivateEndSub[小结]在使用Find方法找到符合条件的数据后,就可以对其进行相应的操作了。您可以:对该数据所在的单元格进行操作;对该数据所在单元格的行或列进行操作;对该数据所在的单元格区域进行操作。4.与Find方法相联系的方法

可以使用FindNext方法和FindPrevious方法进行重复查找。在使用这两个方法之前,必须用Find方法指定所需要查找的数据内容。

4.1FindNext方法

FindNext方法对应于“查找与替换”对话框中的“查找下一个”按钮。可以使用该方法继续执行查找,查找下一个与Find方法中所指定条件的数据相匹配的单元格,返回代表该单元格的Range对象。在使用该方法时,不影响选定区域或活动单元格。

4.1.1语法<单元格区域>.FindNext(After)4.1.2参数说明

参数After,可选。代表所指定的单元格,将从该单元格之后开始进行查找。开始时不查找该位置所在的单元格,直到FindNext方法绕回到该单元格时,才对其内容进行查找。所指定的位置必须是单元格区域中的单个单元格,如果未指定本参数,则将从单元格区域的左上角的单元格之后开始进行查找。

当查找到指定查找区域的末尾时,本方法将环绕至区域的开始继续查找。发生环绕后,为停止查找,可保存第一次找到的单元格地址,然后测试下一个查找到的单元格地址是否与其相同,作为判断查找退出的条件,以避免出现死循环。当然,如果在查找的过程中,将查找到的单元格数据进行了改变,也可不作此判断,如下例所示。

4.2FindPrevious方法

可以使用该方法继续执行Find方法所进行的查找,查找前一个与Find方法中所指定条件的数据相匹配的单元格,返回代表该单元格的Range对象。在使用该方法时,不影响选定区域或活动单元格。

4.2.1语法<单元格区域>.FindPrevious(After)4.2.2参数说明

参数After,可选。代表所指定的单元格,将从该单元格之前开始进行查找。开始时不查找该位置所在的单元格,直到FindPrevious方法绕回到该单元格时,才对其内容进行查找。所指定的位置必须是单元格区域中的单个单元格,如果未指定本参数,则将从单元格区域的左上角的单元格之前开始进行查找。

当查找到指定查找区域的起始位置时,本方法将环绕至区域的末尾继续查找。发生环绕后,为停止查找,可保存第一次找到的单元格地址,然后测试下一个查找到的单元格地址是否与其相同,作为判断查找退出的条件,以避免出现死循环。

4.2.3示例

在工作表中输入如下图1所示的数据,至少保证在A列中有两个单元格输入了数据“excelhome”。

图1:测试的数据

在VBE编辑器中输入下面的代码测试Find方法、FindNext方法、FindPrevious方法,体验各个方法所查找到的单元格位置。SubtestFind()DimfindValueAsRangeSetfindValue=Worksheets("Sheet1").Columns("A").Find(what:="excelhome")MsgBox"第一个数据发现在单元格:"&findValue.AddressSetfindValue=Worksheets("Sheet1").Columns("A").FindNext(After:=findValue)MsgBox"下一个数据发现在单元格:"&findValue.AddressSetfindValue=Worksheets("Sheet1").Columns("A").FindPrevious(After:=findValue)MsgBox"前一个数据发现在单元格"&findValue.AddressEndSub5.综合示例

[示例1]查找值并选中该值所在的单元格

[示例1-1]SubFind_First()DimFindStringAsStringDimrngAsRangeFindString=InputBox("请输入要查找的值:")IfTrim(FindString)<>""ThenWithSheets("Sheet1").Range("A:A")Setrng=.Find(What:=FindString,_After:=.Cells(.Cells.Count),_LookIn:=xlValues,_LookAt:=xlWhole,_SearchOrder:=xlByRows,_SearchDirection:=xlNext,_MatchCase:=False)IfNotrngIsNothingThenApplication.Gotorng,TrueElseMsgBox"没有找到!"EndIfEndWithEndIfEndSub示例说明:运行程序后,将在工作表Sheet1的A列中查找InputBox函数输入框中所输入的值,并查找该值所在的第一个单元格,如果没有找到该值,则显示消息框“没有找到!”。语句Application.Gotorng,True的作用是将窗口滚动至该单元格,即该单元格位于当前窗口的左上方。

[示例1-2]SubFind_Last()DimFindStringAsStringDimrngAsRangeFindString=InputBox("请输入要查找的值")IfTrim(FindString)<>""ThenWithSheets("Sheet1").Range("A:A")Setrng=.Find(What:=FindString,_After:=.Cells(1),_LookIn:=xlValues,_LookAt:=xlWhole,_SearchOrder:=xlByRows,_SearchDirection:=xlPrevious,_MatchCase:=False)IfNotrngIsNothingThenApplication.Gotorng,TrueElseMsgBox"Nothingfound"EndIfEndWithEndIfEndSub示例说明:与上面的程序不同的是,运行该程序后,将在工作表Sheet1的A列中查找InputBox函数输入框中所输入的值,并选中该值所在的最后一个单元格。请比较代码中Find方法的参数。

[示例1-3]SubFind_Todays_Date()DimFindStringAsDateDimrngAsRangeFindString=DateWithSheets("Sheet1").Range("A:A")Setrng=.Find(What:=FindString,_After:=.Cells(.Cells.Count),_LookIn:=xlFormulas,_LookAt:=xlWhole,_SearchOrder:=xlByRows,_SearchDirection:=xlNext,_MatchCase:=False)IfNotrngIsNothingThenApplication.Gotorng,TrueElseMsgBox"没有找到!"EndIfEndWithEndSub示例说明:运行程序后,将在工作表Sheet1的A列中查找日期所在的单元格,并选中第一个日期单元格。

[示例2]在B列中标出A列中有相应值的单元格SubMark_cells_in_column()DimFirstAddressAsStringDimmyArrAsVariantDimrngAsRangeDimIAsLongApplication.ScreenUpdating=FalsemyArr=Array("VBA")'也能够在数组中使用更多的值,如下所示'myArr=Array("VBA","VSTO")WithSheets("Sheet2").Range("A:A").Offset(0,1).ClearContents'清除右侧单元格中的内容ForI=LBound(myArr)ToUBound(myArr)Setrng=.Find(What:=myArr(I),_After:=.Cells(.Cells.Count),_LookIn:=xlFormulas,_LookAt:=xlWhole,_SearchOrder:=xlByRows,_SearchDirection:=xlNext,_MatchCase:=False)'如要想查找rng.value中的一部分,可使用参数值xlPart'如果使用LookIn:=xlValues,也会处理公式单元格中与条件相同的值IfNotrngIsNothingThenFirstAddress=rng.AddressDorng.Offset(0,1).Value="X"'如果值VBA找到,则在该单元格的右侧列中的相应单元格作上标记Setrng=.FindNext(rng)LoopWhileNotrngIsNothingAndrng.Address<>FirstAddressEndIfNextIEndWithApplication.ScreenUpdating=TrueEndSub示例说明:运行程序后,将查找工作表Sheet2上A列中的每个单元格,并在值为“VBA”所在的单元格的右侧单元格中作出标记“X”。

[示例3]为区域中指定值的单元格填充颜色SubColor_cells_in_Range()DimFirstAddressAsStringDimMySearchAsVariantDimmyColorAsVariantDimrngAsRangeDimIAsLong

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论