在Excel 中编写VBA 代码,最常做的事可能就是操作表单中单元格里的数据。 我这里总结一下如何从VBA 代码中操作单元格的数据。

在VBA 代码中操作单元格需要用到Range 对象,Range 是Excel 库(即Excel.exe文件)提供的一个类,封装了对表单中单元格的所有操作。Range 对象可以是一个单元格,一行单元格,一列单元格,或者四方的连续的单元格范围,甚至是几个单元格范围组合在一起。至于一个具体的Range 对象到底代表什么,就看我们怎么构造它了。(注,Range 类不支持New 操作符,在VBA 代码中声明的Range 变量只能是已有的Range 对象的引用。)

在Excel VBA 中给Range 变量赋值时,等号左边是一个Range 对象的引用名,右边是能返回Range 对象的属性或方法。某些能返回Range 对象的属性体现了(构造)函数的多态性。当然,返回值不一定非要赋给某个引用变量名。

Application,Worksheet 等对象的Range 属性可以返回Range 对象。Range 属性的一种形态是: 
Range(String arg)       传递的参数是个字符串。

例如,Worksheets("Sheet1").Range("A5") 表示“Sheet1”表单上的A5 单元格。 
字符串参数的表达方式是很灵活的,除了像上面的例子表示单一的单元格外,还可以表示一块连续的单元格范围。 
例如,Worksheets("Sheet1").Range("A1:B5") 表示“Sheet1”表单上A1到B5 的一块连续的单元格范围。

此外,字符串参数还可以表示不连续的单元格范围组合在一起。 
例如,Worksheets("Sheet1").Range("A1:A10,C1:C10,E1:E10") 表示“Sheet1”表单上A1到A10,C1到C10,E1到E10 三块单元格范围的集合。

注意:在用字符串表示单元格或单元格范围的地址时,要用A1表示法,不能用R1C1表示法。关于Excel 单元格或单元格范围的几种地址表示法,可以看一下我的另一篇文章。

Range 属性的字符串参数不仅可以表示单元格或单元格范围的地址,如果你在表单里定义了单元格或单元格范围的名称,我们还可以用已定义的名称来访问表单上的单元格。

例如,我们在“Sheet1”表单上选择A1到B5这样一块连续单元格,在“Name Box”里输入Sample,这样就给A1:B5 这个范围起了个名字“Sample”。此时,使用 Worksheets("Sheet1").Range("Sample") 表示的单元格或范围跟使用 Worksheets("Sheet1").Range("A1:B5") 是等价的。

Range 属性也是类的成员,因此,我们可以省略它的限制符,写成:

Range("A1:B5") ,Range("Sample") ,Range("A5") 等等。

当不加对象限制符时,Range 属性返回活动表单上的单元格或范围。如果活动表单不是工作表(Worksheet)的话,比如是Chart Sheet ,这条语句就会出错。加上对象限制符是良好的编程习惯。

Range 属性的另一种形态是: 
Range(Range Cell1, Rang Cell2)        cell1 和 cell2 两个参数都是 Range 对象,表示一块连续单元格中位于对角线两头的单元格,即左上角和右下角的两个单元格。

例如,Range(Range("A1"), Range("C5")) 表示 A1:C5 的单元格范围,跟 Range("A1:C5") 是等价的。所以,我们通常不把 Range 属性这样嵌套起来用,下面讲的Cells 属性经常跟 Range 的这种实现结合在一起用。

Application,Worksheet,Range 等对象的Cells 属性返回的也是 Range 对象,但是Cells 属性返回的是单一的单元格。Excel 库中并没有Cell 这个类,表示单一的单元格和一块单元格范围都并在 Range 这个类中了,就看我们把它初始化成多大。Cells 属性的语法是:

Cells(rowcolumn)        row 表示单元格位于第几行,column 表示单元格位于第几列。

Worksheets(1).Cells(1, 1).Value = 24 ——这行代码把A1 单元格的值设成24

Cells 属性也是类的成员,我们也可以省略它的限制符,默认为活动表单上的单元格。

Cells(2, 1).Formula = "=Sum(B1:B5)"   ——设置活动表单上 A2 单元格的公式

Range("A1")和 Cells(1,1) 都表示单元格A1,但是Cells 属性在编程上有优势,它的行和列参数可以是变量。虽然我们可以通过字符串连接给 Range 属性传递参数,到底是麻烦一些。

Range 属性和Cells 属性结合起来的例子,Range(Cells(1, 1), Cells(5, 3)),表示A1:C5 连续的一块单元格范围,跟 Range("A1:C5") 是等价的。再看个例子:

With Worksheets(1)
    .Range(.Cells(1, 1), .Cells(10, 10)).Borders.LineStyle = xlThick
End With

注意每个Cells 属性前的句点,此时,返回的单元格是第一张工作表上的单元格。如果去掉句点,返回的则是活动表单上的单元格。(第一张工作表不一定是活动表单)

假设 rowindex 和 columindex 是例程里的两个变量,下面一段代码根据用户输入的行数和列数,从A1单元格一直到 rowindex 和columindex 交叉处的单元格,从1 开始,按行每格递增1填上数字。

rowindex = Val(InputBox("Please enter row number.", , 1))
columnindex = Val(InputBox("Please enter column number.", , 1))
For i = 1 To rowindex
    For j = 1 To columnindex
        Cells(i, j) = (i - 1) * columnindex + j
    Next j
Next i

Cells 属性用在Range 对象时,行数和列数的参照系是Range 对象,也就是说,行和列是相对于Range 对象左上角的单元格开始数的。

例如,Worksheets(1).Range("C5:C10").Cells(2, 1) 指的是第一张表单上的C6 单元格。

Range 对象的 Offset 属性返回当前 Range 对象偏移指定的行数和列数后的一个Range 对象,大小不变,只是位置发生变化。语法:

Offset( row, column)     row 和 column 是行和列的偏移数

Application 和类的方法成员 Union(range1, range2, ...) 可以把多个单元格范围组合在一起作为一个Range 对象。

Excel 2003 中如何用VBA 代码访问单元格里的值及操作单元格 - 唐诗宋词的专栏 - 博客频道 - CSDN.NET的更多相关文章

  1. 知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET

    知道创宇爬虫题--代码持续更新中 - littlethunder的专栏 - 博客频道 - CSDN.NET undefined 公司介绍 - 数人科技 undefined

  2. java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET

    java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了!      社区福利快来领取免费参加MDCC大会机会哦    Tag功能介绍—我们 ...

  3. 采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET

    采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET undefined

  4. HTML5绘制矩形和圆形并且还有获取在这个图层内的坐标的思路和代码 - feilong_12的专栏 - 博客频道 - CSDN.NET

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  5. 在MyEclipse8.6中设置jQuery自动提示 - 肖飞figo的云计算专栏 - 博客频道 - CSDN.NET

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  6. OpenStack手动从数据库中删除实例 - ugyn109的专栏 - 博客频道 - CSDN.NET

    由于某种原因我将OpenStack的一个计算节点移除了,但移除前并没有删除在其上运行的实例,后来想通过dash删除这些实例,于是N天过去了,我的dash还显示如下内容:很碍眼是不是?于是我打算手动从数 ...

  7. C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET

    C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET C++ STL中Map的相关排序操作:按Key排序和按Value排序 分类: C ...

  8. JS获取整个HTML网页代码 - Android 集美软件园 - 博客频道 - CSDN.NET

    JS获取整个HTML网页代码 - Android 集美软件园 - 博客频道 - CSDN.NET JS获取整个HTML网页代码 分类: Android提高 2012-01-12 23:27 1974人 ...

  9. php学习笔记:foreach循环访问关联数组里的值

    foreach循环可以将数组里的所有值都访问到,下面我们展示下,用foreach循环访问关联数组里的值. 例如: $fruit=array('apple'=>"苹果",'ba ...

随机推荐

  1. DP:Space Elevator(POJ 2392)

    太空电梯 题目大意:一群牛想造电梯到太空,电梯都是由一个一个块组成的,每一种块不能超过这个类型的高度,且每一种块都有各自的高度,有固定数量,问最高能造多高. 这题就是1742的翻版,对ai排个序就可以 ...

  2. Code(poj 1850)

    大致题意:(与POJ1496基本一致) 输出某个str字符串在字典中的位置,由于字典是从a=1开始的,因此str的位置值就是 在str前面所有字符串的个数 +1 规定输入的字符串必须是升序排列.不降序 ...

  3. (八)STM32的CAN模块实验

    bxCAN是基本扩展CAN(Basic Extended CAN)的缩写,它支持CAN协议2.0A和2.0B.它的设计目标是,以最小的CPU负荷来高效处理大量收到的报文.它也支持报文发送的优先级要求( ...

  4. Linux下如何查找可执行文件

    Linux下的可执行文件 Linux下如何查找可执行文件,作为一个Linux小菜刚刚有了这个问题, 在windows中,可以通过后缀名判断是否是可执行文件,比如.exe,.bat等是可执行文件,但是在 ...

  5. Android开发规范——命名 (转)

    转自: http://blog.sina.com.cn/s/blog_3f5dd7810101j4u2.html 在讲解命名规范前,先初略介绍下当前主要的标识符命名法和英文缩写规则. 标识符命名法 标 ...

  6. loj 1034(最小点基)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25911 思路:强连通缩点,在新图中找入度为0的点的个数即可. #i ...

  7. hdu2955

    #include<bits/stdc++.h> using namespace std; struct Bank { double cau; int money; }bank[]; ]; ...

  8. 资产移动盘点手持机PDA系统

    手持机PDA系统功能 PDA初始化 从后台管理机系统中预先设置的众多操作人员列表中下载当前PDA的使用人员: 系统支持多用户使用同一台PDA情况下的用户认证登陆,每一用户根据后台管理机系统设置与安全管 ...

  9. DP URAL 1244 Gentlemen

    题目传送门 /* 题意:已知丢失若干卡片后剩余的总体积,并知道原来所有卡片的各自的体积,问丢失的卡片的id DP递推:首先从丢失的卡片的总体积考虑,dp[i] 代表体积为i的方案数,从dp[0] = ...

  10. BZOJ4068 : [Ctsc2015]app

    对于一个所选任务集合,如果对于任意时刻$i$,$i$前面所选任务数都不超过i的话,那么这些任务可以全选. 维护一棵线段树$T$,第$i$个位置一开始为$i$,每使用一个任务,$[t,T]$都要减$1$ ...