原标题:Excel最常见的单元格,在VBA中竟是入门拦路虎?!
很多刚接触VBA的朋友,对于VBA
单元格
的指定方式,会有些搞不清楚,甚至因为网络上的资料不多,有些老手也是知其然,不知其所以然。
本期我特意进行了总结,看完本文你就明白了,同时也会让你对VBA对象体系有更清晰的了解!( 学习过VBA对象体系视频后,再看本文效果最佳!加入《数说》我带你从零开始学VBA,私信回复“数说”给你看巨无霸大纲~ )
首先我们必须有VBA对象体系的概念基础,因为这是VBA的架构根基!
Excel 前端基本的对象层次:
Excel 程序 → 工作簿 → 工作表 → 单元格
Application → Workbook(s) → WorkSheet(s) → Range
以上相信大家都能明白,但是怎么解释以下这些
单元格
的表示方法 (下列的代码,都是给活动工作表的B2单元格写入100这个数字) :
Range(
"B2:D5"
).Range(
"A1"
)=
100
Range(
"B2:D5"
)(
1
) =
100
Range(Range(
"B2"
), Range(
"D5"
)).Range(
"A1"
) =
100
Cells(
2
,
2
) =
100
Range(Cells(
2
,
2
), Cells(
5
,
4
)).Range(
"A1"
) =
100
。。。其实还有几种,先不列了,本文重点理解上面7种方式,助你解开一直的困惑!
首先应该要理解
,上面7种写法中,RangeCells前面都没有"
.
" (对象限定符) ,这样的使用方法,其实是相当于
ActiveSheet.Range
(返回活动工作表中的某个Range;如果活动工作表不是工作表,则此属性表示方法将会无效!)
然后我们来逐一解释
上面的7种写法。
基础知识:
● Workbooks("文件.xlsx")
表示名称为【文件】的一个Workbook
(工作簿)
● Worksheets("数据源")表示名称为【数据源】的一个Worksheet
(工作表)
● Range("A1")表示名称为【A1】的一个Range
(单元格)
Workbooks,Worksheets都是以s结尾
(复数)
,但唯独Range有不一样的地方:
没有用Range s 复数表示集合
Range 属性的语法是 Range(Cell1,[Cell2]) ,表示最少一个参数,最多支持2个参数,且Cell1和Cell2参数既可以是字符串String,也可以是变体Variant
Range
(
"B2"
).
Value
=
100
解释:
Range
("
B2
")是指
B2
单元格对象,“
.
”是一个对象限定符,即“
.
”号前面就是对象,“
.
”后面就接着对象的方法、属性。
使用Range对象的Value属性,可以返回该
Range
对象的值。而且当
Range
属性后面没有再接其他属性时 (或使用Set语句时) ,VBA会默认理解为
Range
.value
即当你写
Range
("
B2
")=
100
时,VBA就自动理解为了
Range
("
B2
").Value=
100
Range
(
"B2"
)
=
100
解释:
VBA自动理解为
Range
("
B2
").
Value
=
100
Range
(
"B2:D5"
).
Range
(
"A1"
)
=
100
解释:
看到这个表述,很多人都会有点懵!这样来理解 → 首先
ActiveSheet
的
Range
("
B2:D5
")属性返回了一个
Range
对象,而
Range
对象它自己也有一个属性叫
Range。
即
Range
.
Range
(
Cell1
,[Cell2]),它是可以返回基于前一个
Range
对象的
Range
对象 (有点绕,没事,直接看下方的示范) ,例如:
●
Range
("
A1
").
Range
("
A1
"),这个是指
A1
单元格,因为是基于
A1
单元格为起始点的
A1
(第1行,第1列)
●
Range
("
B1
").
Range
("
A1
"),这个则是指
B1
单元格,因为是基于
B1
单元格为起始点的
A1
(第1行,第1列)
●
Range
("
B1
").
Range
("
B1
"),这个则是指
C1
单元格,因为是基于
B1
单元格为起始点的
B1
(第1行,第2列)
依此类推……
(其实和Offset相似)
这种表述有什么用?当我们要从VBA把值输出到单元格时,我们有时会用到这样的代码,比起你用
offset
或双循环会更方便一些!
Range
(
"B2:D5"
)(
1
)
=
100
解释:
这种表述,其实和
Range
("
B2:D5
").
Range
("
A1
")=100有点接近,直接在
Range
对象后面接上( ),然后括号中写上一个序号,其实和
Worksheets
(1)是类似的意思,前面我们讲过因为
Range
没有用复数,所以其实不太方便我们理解。
当你写成
Range
("
B2:D5
")(
1
)时,其实VBA就自动理解为
Range
("
B2:D5
").
Item
(
1
)。
Range
的
Item
属性也是返回一个
Range
对象,Item属性的语法是
Item
( RowIndex 、 [ColumnIndex] ),也可以使用类似于上面的相对行列,例如
Range
("B2:D5").
Item
(
2,1
)就表示B3单元格 (基于B2:D5的第2行第1列)
Range
(
Range
(
"B2"
),
Range
(
"D5"
)).
Range
(
"A1"
)
=
100
解释:
前文提过,
Worksheet
的
Range
属性语法是
Range
(
Cell1
,[Cell2]),其中的Cell1和Cell2参数既可以是字符串String,也可以是变体Variant。
所以这种表示方式,
Range
("
B2
")就表示一个单元格对象,
Range
("
D5
")则表示另一个单元格对象,
Range
(
Range
("
B2
"),
Range
("
D5
"))就是表示
B2:D5
这个单元格区域了,相当于Range("
B2:D5
")。
所以
Range
(
Range
("
B2
"),
Range
("
D5
")).
Range
("
A1
") =
100
,其实就是
Range
("
B2:D5
").
Range
("
A1
")=
100
Cells
(
2
,
2
)
=
100
解释:
Cells
也是
Worksheet对象
的一个属性,可以返回工作中
所有的单元格
,即返回的也是一个
Range
对象。我们前面就讲过,
Range
对象,就是可以直接带上( ),用相对的行列号来进行具体的索引。
因为Cells返回的是工作表中所有的单元格,所以
Cells
(
1,1
)很自然就是表示着工作表的第1行和第1列交叉的位置,即A1单元格。
Cells
(
1,1
)其实就是
Cells
.
Item
(
1,1
)的缩写,
Cells
(
2, 2
) =
100
最完整的意思就是
Cells
.
Item
(
1,1
).
Value
=
100
于是看到这里,我们可以这样小结一下:
通过
Range
("
A1
")形式,用单元格名称去指代单元格
(双引号内是字符串,也可以接受自定义的单元格名称)
通过
Cells
(
1,1
)形式,用行列的数字索引来指代某个单元格
在实际编程中,使用
Cells
属性去表示单元格会比较常用,因为可以很方便地把变量用于行、列,尤其是列!
因为用
Range
的话,列标是英文字母,而使用
Cells
,列标则可以是数字,写循环将会更方便。
Range
(
Cells
(
2
,
2
),
Cells
(
5
,
4
)).
Range
(
"A1"
)
=
100
解释:
通过上面的内容,相信大家都能理解这种写法了,
Range
属性里面用2个
Cells
返回2个
Range
对象组成了单元格区域
Range
("
B2:D5
")
然后其实就是
Range
("
B2:D5
").
Range
("
A1
")=
100
,这个上面已经解释过了。
虽然上面的内容不多,但要深刻理解还需要多读一下,以及实操尝试。其实不仅仅是学习VBA,我们在学习很多知识的时候,如果条件允许,还是建议大家追求:
知其然,更应知其所以然
,这样的好处是一方面锻炼你的探索能力,另一方面是理解后可以印象更深刻也会能更好地应用,使你变得更专业。
例如回想起读书时期,我在学习唐诗、宋词时,大多数情况下也主要以“背”为主,而未能真正理解作者的意思,想想还是有点遗憾……
再总结一句:
知其然,更应知其所以然
,其实是需要经过深入探索,或深入思考的,这样做会让你更好地掌握知识,也能帮助你逐渐走向专家的道路,共勉!
有些人可能会问,VBA还值得学习吗?我的建议是值得学习,在数据分析相关的板块,VBA可以做很多事情,例如:
想了解更多VBA的内容,可以看我的另一篇文章:
VBA已死 ?我来谈谈要不要学VBA的问题
数据化管理《数说》,近期正在更新VBA系列的内容,如果你有兴趣学习【业务思维】+【分析方法】+【进阶Excel】,欢迎加入《数说》学习,公众号私信回复 “
数说
” ,给你看一个
超高性价比
,
巨无霸
的《数说》内容大纲。
返回搜狐,查看更多
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。