ExcelVBA:RangeObject_第1页
ExcelVBA:RangeObject_第2页
ExcelVBA:RangeObject_第3页
ExcelVBA:RangeObject_第4页
ExcelVBA:RangeObject_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、 Microsoft Excel VBA : Range objectRange Object 一Range object表示一或多个 cells,这可以是在一个worksheet上的单个Cell,单个row, 单个Column, 一或多个Areas, 或者在多个worksheets上的同一些cells(3-D range)。 Area: 术语area(或Block)常指由若干行若干列交叉出的那些Cells,它们组成一个矩形区。 Region: 常指这样的Area,它被四周的(一或多个)空行或空列或边界包围着。 Worksheet object和Range object有许多属性都能返回一个R

2、ange object,这些属性包括: Range, Cells, Columns, Rows, Selection 等 ( Application object 也有这些属性,可那不过是ActiveSheet的这些属性的简写。) 自注:其实Range作为method来理解更好些,因为在Range字后必须提供参数,如Range(“B6”), 该“方法”返回一个由参数指定的Range object。 (从技术角度说,方法和Read only属性本来是一回事, 都能返回Object。区别仅在于 方法可以象过程那样调用,而只读属性只能象函数那样出现在表达式里。) 而obj.Cells, Column

3、s 和 Rows属性返回Range object,其范围分别是Worksheet或 已知的Range对象obj上的所有cells,columns,和rows。因此把它们理解成集合更好些 何况还可以引用Rows(i),Columns(j)和Cells(i,j)。可惜Row/Column/Cell不是独立的 objects,从而Rows,Columns,和 Cells也就不是Collections。 Worksheet上有256 columns, 65536 rows和256*65536=16777216 cells。它们的任一部分 或全部都可以构成一个Range object。 如以下语句 Ac

4、tiveSheet.Columns.Font.Bold = True ActiveSheet.Columns.Formula = 5 把所有Cells都送了数5(要执行很长时间,用Rows或Cells属性代替Columns也同义)。 Columns,Rows,Cells返回的Range object有Count属性,Worksheet.Columns.Count=256, Rows.Count= 65536,Cells.Count=16777216。但因为它们不是Collection,因此你不能 声明一个变量为Rows或Row类型的,而只能声明为Range类型的。例如,以下是正确的: Dim

5、r As Range Set r = Application.Columns MsgBox r.Count 256 列数, 同 r.Columns.Count (a) Set r = Application.Rows MsgBox r.Count 65536 行数, 同 r.Rows.Count (b) Set r = Range("B5:D6") MsgBox r.Count 6 Cells数 (c) MsgBox r.Columns.Count 3 列数 MsgBox r.Rows.Count 2 行数 由此看来, Range object应该有一属性指示它的结构特征

6、是Address属性(好象只记下 Reference还不行,如何区分r.Count是Columns,Rows还是Cells的Count?)。 此外,可以用obj.Columns(j),Rows(i),Cells(i,j)引用在range中特定的列,行和Cell 所构成的Range object,其中 i=1,2,, j=1,2,。(但Excel并不限定i和j必须在 obj.Rows.Count和 obj.Columns.Count的范围之内。Range属性 ( for Application, Worksheet, Range objects): Read only。 Syntax 1: ob

7、j.Range( “ <range expr> ”) 返回一个Range Object。 其中range expr可以包括: * A1 style range references, 如 B5, 同 $B$5, B$5 (不管$符号) * 在worksheet上的Named ranges, 如 MyRange1 * Range operators: : range 如 Range(“B5:D4”) ( 同 “D4:B5” ) , union 如 Range(“A1:B2,C3:D4”) (space) intersection 如 Range(“A1:C5 B3:D4”) 即B3:

8、C4 优先级:range,intersection,union,还可以使用圆括号,如 Range("C5:E8,A1:C5 B3:D7") 是 Range( “C5:E8,B3:C5” ) Range("(C5:E8,A1:C5) B3:D7") 是 Range( “C5:D7,B3:C5” ) 注意,在Range()的参数中不能使用R1C1 style参照。 Syntax 2: obj.Range( R1, R2 ) 其中 R1和R2各是一个以矩形(或单个Cell)为范围的range,可以是: Range Object, “Named Range”,

9、“B3”, 或 “D2:E8” 类的range Range(R1,R2)返回一个以矩形为范围的Range object,该矩形的左上角和右下角(或左下角 和右上角)由R1和R2确定,使R1和R2都“刚好”落在其中(“外切”矩形)。 注意, Range(r1,r2)与Range(r2,r1) 同效。 例: Range( “A2”, “F6”) 是 Range( “A2:F6” ),不是 Range( “A2,F6”)。 Range( “A2:D3”, “C4:F6”) 同上,是 Range( “A2:F6” ) Range( “A2:D3”, “MyRange1”), Range(“A2:D3”

10、,r1), Range( r1, “MyRange1”), Range(r1,r2) 这里,MyRange1是Named Range,r1和r2是Range objects 语法1主要用来构造一个Range,它含一个area或由多个 areas的合集(union)组成(虽然也容许 intersection操作),而语法2主要用来根据对角线构造一个矩形Range。 * 如果Obj是Worksheet,在range expr中的A1 style参照是Sheet上的绝对Cell地址。 * 如果Obj是Application,则Application.Range() (通常省写Application.

11、)相当于 Application.ActiveSheet.Range() 但如果当前Active的不是Worksheet(而是Cartsheet),则Error。 * 如果Obj是Range Object,则A1 style参照是相对于该Range左上角而言的,即“A1” 表示Range的左上角cell,以它为坐标原点计列号和行号,如: Set r1 = Range("B3,E5:F8") 坐标原点是B3. r1.Range("A1:B2").Value = 66 A1:B2表示r1的左上角4个Cells。 同 Range(“B3:D4”).Value=

12、66。注意,Range(“B3:D4”)已经不落在r1中了。即r1只是确定了 参照的坐标原点,仅此而已。并不要求r1.Range()的范围属于r1的范围。 在语法1和2中的其他元素仍可用,因为对任何Ranges,Excel总是能把它表示成 A1 style, 这里仅仅是改变了坐标原点。Range()例子: Reference Meaning Range("A1") Cell A1 Range("A1,B5") Cells A1 and B5Range("A1:B5") Cells A1 through B5 (左上角到右下角) Ran

13、ge(“A5:B1”) 范围同上 (左下角到右上角) Range("C5:D9,G9:H16") A multiple-area selection Range("A:A") Column A Range("1:1") Row 1 Range("A:C") Columns A through C Range("1:5") Rows 1 through 5 Range("1:1,3:3,8:8") Rows 1, 3, and 8 Range("A:A,C:C,F:F

14、") Columns A, C, and F Range("Range1,Range2") (Named ranges)Range1 and Range2 (union)Range(“D1:D5,Range1”) Union of two rangesRange(“D1:D5 Range1”) Intersection of two ranges ( 交集!) Range("MyBook.xls!MyRange") MyBook.xls上的RangeRange("Report.xlsSheet1!Sales") Report

15、.xls的Sheet1上的 Range下表假设已定义了Range变量r1,r2: Dim r1, r2, myMultipleRange As Range Set r1 = Sheets("Sheet1").Range("A1:B2") Set r2 = Sheets("Sheet1").Range("C3:D4")Range(“r1,r2”) Error ! Range(“B2”, “D4”) B2:D4Range(“D4”, “B2”) B2:D4 Range(r1,r2) 或 Range(r2,r1) A1:

16、D4 Range(“A2”,r2) A2:D4Range("E2:F5", "B2") B2:F5Range("E2:F5", "G7") E2:G7Range("E2:F5", Range("G7") E2:G7Range(“E2:F5”,r2) C2:F5 Range("E2:F5", Union(r1, r2) A1:F5A1 style ranges和 Named ranges的简写: Worksheets("Sheet1").

17、A1:B5.ClearContents Range1.Value = 30 A1:B3,Range2.Formula= “This”注意,Named ranges是在Worksheet上定义的range名字,不是Range object,不要和上述的r1,r1相混,Range Name是要放在引号中的(简写放在方括号中),而r1不用。用code设置Named range: Range("D4:D9").Select ActiveWorkbook.Names.Add Name:="RangeName1", RefersToR1C1:= "=She

18、et4!R4C4:R9C4"Working with 3-D RangesIf you are working with the same range on more than one sheet, use the Array function to specify two or more sheets to select. The following example formats the border of a 3-D range of cells. Sub FormatSheets() Sheets(Array("Sheet2", "Sheet3&

19、quot;, "Sheet5").Select Range("A1:H1").Select Selection.Borders(xlBottom).LineStyle = xlDouble End SubColumns属性 ( for Application, Worksheet, Range objects):Rows属性 ( for Application, Worksheet, Range objects):Cells属性 ( for Application, Worksheet, Range objects): Read only. 返回Rang

20、e object。 Obj.Columns 返回的Range object(的范围)是Obj的所有的列。 Obj.Rows 返回的Range object是Obj的所有的行。 Obj.Cells 返回的Range object是Obj的所有的cells。 Application.Columns实际是指Application.Activesheet.Columns,另两个属性也类似。 例如, Set r2 = Range("B3:C5,D3:G5") (1) r2.Columns.Value = "7" 同r2.Value= “7” (2) k = r2.

21、Columns.Count Count=2,不是5 作为一个Range,obj.Columns,obj.Rows和obj.Cells的范围都和obj的范围一样,见(1)式。 而Worksheet.Columns/Rows/Cells是整个sheet, 256列,65536行。 通常作为集合使用用它们,但此时如果obj是由多个areas组成时,Columns和Rows只是指obj的 “第一个” area 的列和行,如obj.Columns.Count和objColumns.Count返回第一个area的列数 和行数,见(2)式。 这里,“第一个” area 是指area union中的第一个操作

22、数,而不是union结果 的最左边的area。如: Range("B3:C5,E3:G6").Columns.Count = 2 B3:C5的列数 Range("E3:G6,B3:C5").Columns.Count = 3 E3:G6的列数 你可以如下引用相对于第一个area左上角的列或行: Range("B3:C5,E3:G6").Columns(j) j=1,2, 可以大于Columns.Count Range("B3:C5,E3:G6").Rows(i) i=1,2, 可以大于Rows.Count Exce

23、l并不限制i,j要在给定的range内,可以任意大。 如果写Range("B3:C5,E3:G6").Columns(6).Value = “This”,则是第6列(B作为第1列) 上的3行cells即G3:G5上送了 “This” 。注意这个Columns(6)只含3 cells。如果希望 扩充到整个第G列(65536 cells),应该再用EntireColumn属性。例如: Range("B3:C5,E3:G6").Columns(6).EntireColumn.Cells(1,1).Value = “xx” 是送 “xx” 到G列中。 对于Cel

24、ls,obj.Cells.Count是各Areas的Cells个数之和,不管Areas是否有重叠,如 Range(“B3:C5,C4:D7”).Cells.Count = 6+8 = 14 你可以用Cells(i,j)来引用cell,i,j是以第一个area左上角cell为(1,1)的行列坐标: Range(“C4:D7,B3:B5”).Cells(1,1) 是 C4 Range(“C4:D7,B3:B5”).Cells(1,3) 是 E4 i,j可以任意大(而且可以是0和负数),并不限于obj的范围内,只要还在256列65536行之内,都 能正常执行。 小结: a) obj.Columns/

25、Rows/Cells,作为Range object,其range与obj的range一样,即包含obj 的全部cells,不管obj的 range是否为矩形。 b) 当obj的range是多个areas的Union时(intersection的结果是单个area),Columns. Count和Rows.Count是指第一个area的列数和行数。Cells.Count是各Areas的Cells数 之和。 c) 总是以第一个area左上角cell为原点计算行号列号,原点作为第1行第1列,即(1,1)而 不是(0,0),就象Worksheet中的行列计法那样。你可以写: Obj.Columns(j

26、) j=1,2, Obj.Rows(i) i=1,2, Obj.Cells(i,j) i,j = 1,2, i,j 不受obj范围的限制,而且还可以是0和负数,如 Set r = Range(“C4:D7,”) r.Cells(1,1) 是C4 r.Cells(0,0) 是B3 r.Cells(0,1) 是C3 r.Cells(-1,-1) 是A2 r.Columns(1) 是C4:C7 r.Columns(-1) 是A4:A7 如果obj是单个矩形range,这3个属性可以方便地让你在该range内航行,一列一列地, 或一行一行地。这也是最常用的情况。 因Columns和 Rows是Rang

27、e object,因此你也可以写: r.Columns(“A:A”) 即 Columns(1) r.Columns(“B:D”) 即 Columns的第2至4列 r.Rows(“1:1”), r.Rows(“1:2”), D) Range object有一个Areas Collection,可以用RangeObj.Areas.Count知道该range 所含的areas个数。RangeObj.Areas(i)指向第i个Area,i=1,2,。 Areas(i)也是Range object(因此无Area object一说)。 E) 在Range中的 “交集” 视为一个area,如: Set r

28、 = Range("b2:D6 C3:H8, F1:I5") MsgBox r.Areas.Count 2 MsgBox r.Columns.Count 2 因为 “B2:D6 C3:H8” 是 “C3:D6” MsgBox r.Rows.Count 4 用Union方法构造的Range和用union操作同样处理,如 Set r = Range("b2:D6 C3:H8, F1:I5") Set r = Union(r, Range("J1:K9") MsgBox r.Areas.Count 3 MsgBox r.Columns.Co

29、unt 2 第一个area仍是 “C3:D6” MsgBox r.Rows.Count 4Column,Row属性 (Range object) Long, Read only. 返回Range object的第一个Area的左上角cell在Worksheet上的列号和行号(整数),如 MsgBox Range("C4:D7,B3:B5").Column 3 (C列) MsgBox Range("C4:D7,B3:B5").Row 4Offset 属性 (Range Object) Range object, Read only RangeObj.Off

30、set(RowOffset, ColumnOffset) Offset可正,负,或0。 它返回一个Range object,其range是原整个range按给定Offsets的移动。如(1,1)是向 右下移动1行1列,(-1,-1) 是向左上移动1行1列,(0,0)不动.如: Range("C4:D7").Offset(1, 1) 是 Range( “D5:E8” ) 通常用于相对于ActiveCell选择新的Cell,如 ActiveCell.Offset(rowOffset:=3, columnOffset:=3).Activate 如果原ActiveCell是B2,本

31、语句将激活 E5。 下例选择一range,它去掉了原Regine(例如是一 data list)的头一行(如标题行): Set aList = ActiveCell.CurrentRegion aList.Offset(1, 0).Resize(aList.Rows.Count - 1, aList.Columns.Count).Select Resize方法用来改变Range object自己的范围。EntireColumn属性 (for Range object) Read only,返回一个Range object,它的范围是在Worksheet中原范围所在的全部列。 如 以下语句选择了

32、列C,D,F所组成的Range: Range("C4:D7,F5").EntireColumn.Select 通常用来选择ActiveCell所在的整个列(含65535 cells): ActiveCell. EntireColumn.Select 下例在第1列前加一列,原来的A,B,C,列右移,变成B,C,D,列,新加的列为A: Range(“A1”).EntireColumn.InsertEntireRow属性 (for Range object) 类似。CurrentRegion属性 (for Range object) Read-only. RangeObj.Cur

33、rentRegion返回一个Range object,它的范围是包含该RangeObj的整个region。 被一或连续多个空行和空列包围的Cells构成一个Region。 在worksheet上可以有一或多个regions。 下例选择整个table(即data list)除最上的列标题行以外的部分,假设现在的ActiveCell是 在table之内: Set tbl = ActiveCell.CurrentRegion tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1,tbl.Columns.Count).SelectResize属性 ( Range obj

34、ect) RangeObj.Resize(RowSize, ColumnSize) 返回一新Range Object,它的范围与RangeObj的范围只在行列数上不同,新Range的行列数 由RowSize, ColumnSize给定:从原range的下面加减行,右面加减列。 注意,RangeObj只含单个矩形area才能Resize。 Resize只是改变范围,并未Insert/Delete 任何cells。 例如: Set r1 = Range("B2").Resize(5, 6) r1是Range(“B2:G6”)。 Range().Select (*) Set r2

35、 = Selection.Resize(Selection.Rows.Count+1) r2.Select 现在又比(*)多选了一行,列数未变。 Select方法 (for Worksheet, Range objects等) Obj.Select 本方法使obj被选择。 Select Sheets 在每个打开的Workbook中都可以选择一或多个Sheets,但其中只有一个是Active的。 * 交互式选择: a) 为选择单个 Sheet, 在当前Workbook底部的Tabs Bar上,单击该Sheet的tab。 该Sheet变成Active的。 b) 为选择连续的多个 Sheets, 先

36、单击其中第一个(最左)Sheet tab,然后按住SHIFT键, 再单击最后一个Sheet tab。按住SHIFT键容许你选择不连续的多个 Sheets。第一个选择 的Sheet变成 Active的。你可在选择的sheets中,用单击使别的sheet变成Active的。 (仅当你又选择了另外的sheet,刚才选择的这组Sheets才被deselect。) 你可以在Active sheet上编辑,如输入或Formatting。Excel会在已选择的每个Sheet 上自动重复你在Active sheet上做的changes,如往A3上输入“The”,则在所有选择的 sheets上的A3都输入了”T

37、he”。 注:右击sheet tab,从shortcut菜单中选择“Select All Sheets”,则选择全部sheets。 * 用code选择: 注意,只能在Active的Workbook上选择sheets。用Activate方法“选择”Workbook: Workbooks("Book2").Activate a) 选择单个 Sheet: Worksheets("sheet2").Select Sheet2被选择并Activated。 也可以用 Activate方法选择并激活sheet: Worksheets("sheet2"

38、;). Activate (或 Sheets("sheet2").Select 或 Activate) b) 选择多个Worksheets,用Array()函数: Worksheets( Array("sheet2", "sheet4", “sheet7”) ).Select Sheet2自动变成 Active的。 在选择的sheets中,可以用Activate方法激活其中任何一个。 Select a Range & Activate a Cell RangeObj.Select 只能在ActiveSheet上选择一Range

39、: Workbooks("Book2").Activate Worksheets("sheet2").Select Range( “E3:H7,B2:D4” ).Select 其中第一个area的左上角cell变成Active的,如E3(不是B2)。你可以用Activate方法 使该范围内的其他Cell变成ActiveCell,如: Range(“B2”).Activate 直到在该range以外的Range被选择,这个range才deselected。 在一Worksheet中只有单个Cell是Active的。为选择并激活单个Cell,即可以用Sele

40、ct 方法,也可以用 Activate方法: Range(“F6”).Select 或 Range(“F6”).Activate Activate方法 (for Workbook, Worksheet, Range objects等) 见上。Selection 属性 ( Application object, Window object ) Read only. 返回当前选择的object。(当然包含ActiveCell在其内) 例如当在Worksheet上选择了 a Range,Application.Selection返回的是该Range Object。 Range(“B2:D6”).Se

41、lect Selection.Value = “abc” Selection.Name = “RangeName1” See Name property below Cells B2:D6 都送了值 “abc”, 该 range 被命名为“RangeName1”。 注:用code 给某cell(s)赋值或公式,并不要求一定要先Select或Activate,如可直接写: Range(“B2:D6”).Value = “abc”SpecialCells 方法 (for Range object) 按条件选择Cells的方法。返回Range object。 RangeObj.SpecialCell

42、s(Type, Value) 同Edit -> Goto -> Special操作。 在RangeObj的范围内查找满足给定条件的cells,这些cells构成本方法返回的Range object, 且该Range被选择,其中左上的Cell变成Active的。条件由Type(可能还有Value)来指定。 无满足条件的cell时,原selection 和ActiveCell不变。 (自注:被Select的Range不可以是空集合,因为必须有一个ActiveCell才合理。所以当Select 一个空集Range时会报错。) Type参数(Long)可以是以下之一: XlCellType

43、AllFormatConditions 任何Format的cells xlCellTypeAllValidation 有validation criteria的cells xlCellTypeBlanks 空白 cells xlCellTypeComments 有Comment 的cells xlCellTypeConstants 含常数(不含公式)的cells (可附加Value参数) xlCellTypeFormulas 含公式的cells(可附加Value参数) xlCellTypeLastCell 在曾使用过的范围内,“最后的”cell (最右下角的) xlCellTypeSameFo

44、rmatConditions 和ActiveCell有相同format的cells xlCellTypeSameValidation 和ActiveCell有相同 validation criteria的cells xlCellTypeVisible 全部可见的cells Value参数: Optional Variant 仅当Type参数是 xlCellTypeConstants 或 xlCellTypeFormulas时,Value参数才可有,它可以 是以下常数之和: xlErrors(有错的), xlLogical(逻辑值), xlNumbers(数), xlTextValues(字符串

45、) 指示要查什么类型的常数或公式。如果Value参数省,相当于给出这4个常数之和,即全选。Copy方法 ( for Range, Sheet object等 ) AnyObj.Copy 可用于任何类型的Obj,包括Ranges。把该对象拷贝到Clipboard上。 如果Copy的是Range,可用Range的PasteSpecial方法或Worksheet的Paste方法去粘贴。 最好直接用下面的方法 同时Copy 并Paste 一个 range。 RangeObj.Copy(Destination) 把RangeObj拷贝到Destination Range object上。如: Works

46、heets("Sheet1").Range("A1:D4").Copy Worksheets("Sheet2").Range("E5") 这里的Paste相当于用的是Worksheet的Paste方法,而不是Range.PasteSpecial方法。 SheetObj.Copy(Before, After) 把SheetObj(Worksheet或Chart sheet)到一新sheet上,该新sheet将放到Before之前或 After之后(两者只能给其一)。Before/After是一sheet object

47、。例如: Worksheets("Sheet1").Copy after := Worksheets("Sheet3") 如果Before和After参数都未给,则建立一新Workbook和它的Sheet1来放AheetObj的拷贝。 注:Sheet还有Move方法 SheetObj.Move(Before, After) 与Copy有类似的规定。 例如, Workbooks("Book2.xls").Worksheets("Sheet1").Move 将建立新Book来接收Sheet1。 如果一个Workbook仅有的一个Sheet要被Move,则导致Error 1004,Move不成功。因为 Workbook

温馨提示

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

评论

0/150

提交评论