分享

Excel 2007 Range对象开发指南-上

 yuxinrong 2010-01-12

Excel 2007 Range对象开发指南-上

2009年2月6日

这个是MSDN上的文章,介绍了Excel中最常用的Range对象的使用方法。也适用于Excel2007之前的版本。

概述

我们在Microsoft Office Excel2007中所做的大部分工作都是和单元格相关。同样,我们对Excel对象所做的大部分事情包括使用区域。一个Range可表示一个单元格、一行、一列或者包含一个或多个连续单元格块的选择、或者一个3-D区域。

Range属性返回一个Range对象。Range属性可以有两种表示方法。

expression.Range(cell1)
expression.Range(cell1,cell2)

在第一个例子中,cell1表示一个单元格的区域;第二个例子中,两个数值表示连续单元格区域。在这些示例中,expression是一个必需的元素,必须是Application对象、Range对象或Worksheet对象的其中之一。如果它被省略,便默认是ActiveSheet对象。在第二个例子中,单元格分隔符可以说对象操作符(冒号),重叠操作符(空格),或合并操作符(逗号)。

今天才知道可以使用空格来做重叠操作,例如Range(”A1:C3 B2:D4)其实就是Range(”B2:C3″)。

在下面的几节中,你将学习使用Excel区域的多种操作方法。然而,这些示例只是你可以操作区域的一部分方法。更多关于Range对象模型成员的资料请参考Range对象成员。

给单元格赋值

给单个单元格赋值很简单。

Worksheets("Sheet1").Range("A1").Value=3.14159

同样,可以使用下面的方法给已命名的单元格赋值。

ActiveSheet.Range("MyCell").Value=1

下面的例子给单元格区域插入同样的一个数值。

Worksheets("Sheet1").Range("A1:B10").Value=1

使用在第一节中介绍过的Range属性第二种表示方法,你可以实现同样的结果。

Range("A1","B10")=1

注意Range引用的对象被省略,因此默认使用当前工作表。还有,Range对象的属性也被省略,则使用默认的Value属性,并赋值为1。

此外,当你使用第二种表示方法时,下面的语句将XYZ值赋给Sheet2的A1、A3和A5单元格。

Worksheets("Sheet2").Range("A1,A3,A5")="XYZ"

下面的例子中,在Sheet1的A1单元格中插入一个公式。

Worksheets("Sheet1").Range("A1").Formula="=10*RAND()"

这个例子遍历Sheet1的D1:D10单元格,如果其中一个单元格的String值等于“For Sale”,代码将替换该值为字符串“Sold”。

For Each c in Worksheets("Sheet1").Range("D1:D10")
If c.Value="For Sale" Then
c.Value="Sold"
End If
Next c

区域的表示方法

有几种方法表示一个区域

  • 通过单元格地址
  • 通过对另外一个单元格的偏移
  • 通过名称
  • 当前的选择

通过使用单元格地址有几种方法直接表示一个区域;通过使用ActiveSheet对象你可以使用绝对引用,或者通过使用ActiveCell对象或其它区域对象你可以使用相对引用。

在工作表中引用区域
当你使用区域时,大部分时间你指的是活动工作表上的一个区域。不过你可以方便的表示一个非活动工作簿中的区域。例如,如下面的例子,你可以使用Range属性表示ActiveSheet上的一个区域,这里指的是B1单元格到B15单元格的区域。

Range("B1:B15").Select

同样,也可以引用另外一个非活动工作表中的同样的单元格区域,你可以指定工作表的序号或名称。

Worksheets(2).Range("B1:B15").Select

你也可以不知道工作表而表示一个非活动工作表的区域,但必须在该区域有唯一名称时才行。

Range("SalesTax").Select

这个技巧不需要关心哪个工作表包含这个已命名的区域。

引用区域中的单个单元格
引用区域中的单元格同引用整个工作簿中的单元格使用同样的方法。例如,假设指定B4:E10为区域。要引用这个区域中的B4单元格,你可以使用Range对象中的A1。要引用这个区域中的D8单元格,你可以使用Range对象中的C5。

使用偏移引用一个区域中的单元格
Offset属性返回一个Range对象,它让你引用相对于另外一个单元格的单元格。通过指定距离指定位置的列和行数,你可以引用这个单元格。语法如下:

Object.Offset(rowOffset, columnOffset)

正值将焦点往下和右移动。负值将焦点往上和左移动。零表示当前单元格。例如,假设开始位置上单元格E5。

第一个语句在E5往下移一行的E6单元格插入1。

ActiveCell.Offset(1,0)=1

这一个语句在E5往右移一列的F5单元格插入1。

ActiveCell.Offset(0,1)=1

这一个语句在E5往左移3列的B5单元格插入1。

ActiveCell.Offset(0,-3)=1

下面的例子使用Offset属性计算一个移动平均值。

Sub MovingAvg()
Dim rng As Range
Dim lngRow As Long
 
Set rng = Range("B1:B3")
 
For lngRow = 3 To 12
Cells(lngRow, "C").Value = WorksheetFunction.Sum(rng) / 3
Set rng = rng.Offset(1, 0)
Next lngRow
 
End Sub

这个代码先设置B列中的前三个单元格为一个区域,将这些值的总和除以3,然后将平均值插入到C3单元格。然后使用Offset属性将该区域往下移动一行,但仍在B列中,这样就计算B2:B4区域中的值得平均值。这个值被插入到C4。这个计算过程一直重复到B12单元格。

引用一个命名区域中的单元格
一个命名区域拥有一个唯一的名称。Excel将定义的区域的名称保存在Names集合中,这个集合是Workbook对象的一个属性。命名区域是Excel中的一个强大的工具,让你可以给一个单元格或一个单元格区域赋予一个有意义的名称。例如,你可以给单元格C1赋予SalesTax的名称,然后在你正常使用单元格C1的任何时候使用SalesTax,例如下面的例子。

Total=Range("A1")*Range("SalesTax")

在文章的后面部分将更详细地讨论命名区域。

选择单元格区域

没有一个ActiveRange对象来表示活动区域,但有其它的方法来使用一个区域:Select方法让你选择一个单元格区域。当一个区域被选择后,你可以使用Selection对象来控制该区域选择的动作。

例如,你可以复制一个区域的值到剪贴板然后插入到一个新的工作表。

Range("D5").Activate
ActiveCell.CurrentRegion.Select
Selection.Copy
Sheets.Add After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "Sample"
Sheets("Sample").Select
Range("D5").Activate
ActiveSheet.Paste

在这个例子中,ActiveCell对象的CurrentRegion属性用来选择一个区域,这个例子中是D1,然后复制内容到剪贴板。一个新的工作表添加到最后一个工作表的后面,并将单元格内容复制到新的工作表。

你还可以对选择的区域执行其它的操作,例如以黑体显示选择的区域。

Selection.Font.Bold=True

下面的语句可以得到同样的结果。

Range("C5:C20").Font.Bold=True

除了CurrentRegion属性,你可以使用Range对象的End方法告诉Excel往哪个方向扩张区域。其中的枚举类型参数表示扩张的方向。

通过End方法返回的Range对象表示位于包含目标区域的范围尾端的单元格。使用End方法等同于按下END+UP键、END+DOWN键、END+LEFT键或END+RIGHT键。这个例子选择包含B4单元格的范围中B列最顶部的单元格。

Range("B4").End(xlUP).Select

这个例子选择包含B4单元格的范围中第4行最尾行的单元格。

Range("B4").End(xlToRight).Select

这个例子从B4单元格将选择扩展到包含数据的第4行最后一个单元格。

Worksheets("Sheet1").Activate
Range("B4",Range("B4").End(xlToRight)).Select

下面的例子使用End方法和方向枚举参数来汇总每一列的值。例如,假设你有很多列的数据,一直从B2单元格到G11,选择B1为活动单元格,运行宏,然后会将总和放到每列的顶端。

Sub SumBelow()
Dim rng As Range
 
' 计算活动单元格下面区域的总和并复制总和到其它的列

With ActiveCell
Set rng = Range(.Offset(1), .Offset(1).End(xlDown))
.Formula = "=SUM(" & _
rng.Address(RowAbsolute:=False, ColumnAbsolute:=False) & ")"
.Copy Destination:=Range(.Cells(1), .Offset(1).End(xlToRight).Offset(-1))
End With
 
End Sub

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多