相关文章推荐

原标题: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】,欢迎加入《数说》学习,公众号私信回复 “ 数说 ” ,给你看一个 超高性价比 巨无霸 的《数说》内容大纲。 返回搜狐,查看更多

    责任编辑:

    声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
     
    推荐文章