ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 10996|回复: 20

[分享] Range()方法的科普帖

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2015-3-3 09:30 | 显示全部楼层 |阅读模式
有些新手,对Range()指定单元格范围的用法不太熟悉,我给大家科普一下:

Range指定单元格区域时,可以:
① 1个参数的用法: Range([单元格区域地址])

以【单元格地址】的【字符串变量】为参数,
返回该【地址参数】指定的【一个或多个】(以逗号分隔)的【矩形区域】。
其中,矩形区域是由【1个以上的单元格】组成的【矩形区域】。
矩形区域可以藉由指定【左上、右下】或指定【左下、右上】的两个单元格地址,
以【:】连接作为矩形区域的地址字符串变量。(单个单元格时当然直接地址就可以了)

例如:
  1. Sub test()
  2.     Range("a1").Select '单一单元格区域  
  3.     Range("b2:c3").Select '左上右下的矩形单元格区域
  4.     Range("b3:c2").Select '左下右上的矩形单元格区域
  5.     Range("a1,b2:c3").Select '2个区域
  6.     Range("a1,b2:c3,e4,g5:h8").Select '4个区域
  7.     Range("a1,a1:c3,e4,c2:h8").Select '4个区域、部分重叠
  8. End Sub
复制代码
以逗号分隔的矩形区域个数可能是30个以内或更多(并非无限)
实际相当于把多个矩形区域Union在一起的作用。
…………

其中,列标为合法的英文字母(不区分大小写)【合法是指实际工作表存在的列标】
行标为合法的自然数(>0的正整数)【合法是指实际工作表存在的行】
都可以用变量代替。【字符串变量、或字符以及变量构成的字符串】
最简单的例子是:
t = "A1"
Range(t).Select

以及、
m=100
Range("a" & m).Select
Range("a2:b" & m).Select


^_^ ^_^ ^_^

② 2个参数的用法:Range(Rng1,Rng2)
以Rng1区域 和 Rng2区域为参数,返回由这两个区域的【最大边界】构成的【矩形区域】。
最大边界是指:
两个区域中的最小行到最大行构成行范围、两个区域中的最小列到最大列构成列范围、
由此得到的矩形区域。

例如:
  1. Sub test2()
  2.     Range([a1], [d3]).Select
  3.     Range([d4], [b2]).Select
  4.     Range([b4], [e1]).Select
  5.     Range([a1:b2], [c3:d4]).Select
  6.     Range([b5:c2], [c3:d4]).Select   
  7. End Sub
复制代码
为简化起见,其中的Rng1和Rng2直接使用了[地址]的最简形式。
也可以使用如Range()指定的1个或以上单元格的矩形区域, 或Cells()指定的单个单元格区域。

【注意】
此处的2个参数Rng1和Rng2,必须为有效的【Range范围对象】,不是单元格地址字符串。

如果以字符串变量为参数时,必须外套Range()使之转为有效的Range区域。
不能以Range("地址1","地址2")的方式引用。→ 只能是:Range(Range("地址1"),Range("地址2")) 这样。

注意,我前面代码例子中的[a1:b2]并非字符串格式,而已经是=Range("a1:b2")的单元个区域对象了。

以上科普完毕。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-3-3 09:47 | 显示全部楼层
补充下:

sheets(1).range(sheets(1).range("a1"),sheets(1).range("f5"))
涉及多个sheet下range的调用,需要增加对应sheet

TA的精华主题

TA的得分主题

发表于 2015-3-3 10:19 | 显示全部楼层
个人的见解,愿意学这个的人,大部分都是基础几乎空白的
从初学者角度看,分不清range、cells、[]这三个都是什么东西
还是稍微普及下,说明三者一致,最最基本的表示方式
或者,前后书写一致,都使用range吧

TA的精华主题

TA的得分主题

发表于 2015-3-3 10:28 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-3-3 10:37 | 显示全部楼层
cleverzhzhf 发表于 2015-3-3 10:19
个人的见解,愿意学这个的人,大部分都是基础几乎空白的
从初学者角度看,分不清range、cells、[]这三个都 ...

本帖的初衷,是有些人只知道第1种用法,不知道第2种方法。所以介绍一下。

TA的精华主题

TA的得分主题

发表于 2015-3-3 11:24 | 显示全部楼层
本人还是比较喜欢    range("b2:d10").range("b2")      这种用法
前一个range区域是自己设计需要的特定区域范围,后一个range是以前一个区域的第一个单元格为起点的偏移数。

TA的精华主题

TA的得分主题

发表于 2015-3-3 11:31 | 显示全部楼层
个人意见,初学者要对各种“RANG”详细了解——就象基本变量一样,STRING是什么,INTEGER又是什么——初学者对它(它们)的性质不了解,就容易混淆。

一般说RANGE,是默认的隶属于WORKSHEET之下的“集合性质”的对象。集合本身是对象,大家一般能理解吧,它是“包含了0到若干个子集合的对象”,就象WORKBOOKS,它就包含了“当前EXCEL APPLICATION下面的工作薄”这样子,而WORKBOOK下面的WORKSHEETS或SHEETS“集合对象”,也是包含了 0到某个数量的“ WORKSHEET”对象。

RANGE集合下面的成员是什么?也是RANGE集合
初学者可以这么理解:“人群”是一个集合,它下面可以有数量不等大小不同的“人群”——比如“中国大陆人民”这个“人群”,可以在其下面引用“所有男人”的人群,也可以引用“北京人”的人群,细化到“一个人",就有一种最小的人群,包含了某一个人,但也是”人群“,但没有“具体的一个人“这种非集合对象,只有类似“某学校某班某姓名或学号为某某的人群”,这个人群数的数量为1。

所以RANGE最容易搞混的一个地方,就是它被当成一个“单独的格子”对象,为什么呢,常见类似这样的引用
RANGE("A1").value="1"
初学者一看,啊,这不就是A1吗....其实用起来也没错,能这样写

然则技术上的理解,它应该是“包含了一个单元格的集合”,那为什么能在A1赋值,这就是RANGE集合的那个尿性:对RANGE对象的默认VALUE属性写入,是对所有子成员访问。

这就象“人群”的理解:
“某单位某部门人群”.工资=1500  ‘《==嗯,所有人的工资变成了1500
a=“某单位某部门人群”.工资   '<==这个不好使,假如人群成员的工资不同,取哪个?

比如这个
RANGE("A1:C10").VALUE="7"
大家可以看到A1到C10的方阵被写入7

反过来呢?
msgbox range("a1:c10").value
出错......也就是说它不是可以对称写入的,”最小单位集合“才能访问RANGE集合的值

最后的理解是这个, FOR EACH 遍历,虽然只有一个,但确确实实是做了集合遍历

  1. Sub test()
  2. Range("a1").Value = "hi"

  3. For Each a In Range("a1")
  4.   Debug.Print a.Row, a.Column, a.Value
  5. Next
  6. End Sub
复制代码
然后就是一般初学者容易搞混的RANGE属性:
第1点,WORKSHEET对象有个RANGE属性方法获得”本工作表下的RANGE集合“
set rngX1=sheet1.range("a1")
set rngX2=sheet1.range("a1:c10")
这里是通过"WORKSHEET的RANGE属性"引用得到RANGE集合对象

然后还有一个CELLS属性,很多朋友也会搞混
set rngX=sheet1.cells(1,1)  '<==常用的定位引用,1行1列即A1
但是呢CELLS本身其实是一个RANGE,它与任何RANGE都一样使用:
SHEET1.CELLS.RANGE(“a3") =1              ‘取CELLS RANGE下的A3偏移,即SHEET1实际的A3
SHEET1.range("a5.c20").range("a3")=2   '<==这个引用是对A5的偏移,实际在A7

SHEET1.range("a5.c20").OFFSET(1,1)   ‘相当于SHEET1.range("a5.c20")(1,1),这是默认属性
SHEET1.cells.OFFSET(1,1)                    '<==再注意这个,它同样是默认的,相当于我们常见的SHEET1.CELLS(1,1)

.....没时间了,写这么多吧

TA的精华主题

TA的得分主题

发表于 2015-3-3 21:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
分享香川群子系列。

TA的精华主题

TA的得分主题

发表于 2015-3-3 21:49 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-3-3 22:05 | 显示全部楼层
dajiahaoxinku12 发表于 2015-3-3 11:24
本人还是比较喜欢    range("b2:d10").range("b2")      这种用法
前一个range区域是自己设计需要的特定区 ...

不过用着容易犯晕的
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 20:13 , Processed in 0.049696 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表