一、单元格常见表达方式
基础方式 | 扩展方式 | 备注 |
[A8] | | 不支持变量表达方式,不常用 |
Range("A8") | Range("A1:k1"),Range("A1:A8") | (1)支持变量表达方式"A"&i (2)range(cells(1,1),cells(2,2)) |
Cells(8,1) | cells(序号) | 支持变量表达方式cells(i,j) |
注:Range("A8")大多数时候可等价于Range("A8").value,即大多数时候写Range("A8")默认取的是Range("A8").value,但有少数例外:
(1)若Range("A8")中的value是“A公司”,而有一张工作表的名字也是“A公司”,则可用sheets(Range("A8").value)引用该表,但不能用sheets(Range("A8"))引用该表;
(2)For Each rng In range("a1:a8") rng=1 next,该程序不能运行,因程序不知道rng是什么,有两种修改方式让程序知道rng代表单元格:(a)Dim rng as Range (b)rng.value=1
二、基于选定单元格进行重定位(1、2是定位用,3、4是重选区域)
属性名 | 示例 | 备注 |
.Offset(x,y) | Range("A1").Offset(2,1) Range("A1:k1").Offset(2,1) | (1)(2,1)表示下移2行右移1列;若表示上移2行左移1列,则用(-2,-1) (2)应用场景:For Each rng In Range("a1:a8") if rng.Offset(0,1)="男" then rng="先生" else rng="女士" end if 根据单元格右边列的数据进行填充 |
.end(direction) | Range("B4").End(xlUp) | 演示“双击选中单元格的各边框后的反应”; 常用形式Range("B4").End(xlUp).offset(1,0) |
.EntireRow | Range("A1").EntireRow | .entirerow是range对象,支持.select等方法; Range("A1").row不是range对象,不支持对象方法,返回的是该区域的行号 |
.resize(x,y) | Range("A1").Resize(2, 3) | 返回range对象,自"A1"单元格起下2行右3列的区域 |
三、其他一些基于单元格的操作
用录制宏观察语法:Select(选中) Delete(删除) Copy(复制) ClearContents(清空) AutoFilter(自动筛选) |
Range("A1:D4").Copy Destination:= Range("E5") <=> Range("A1:D4").Copy |
Range(“a1:f100”).AutoFilter field:=4, Criteria1:=“五车间" |
四、练习
(1)将“B2:F2”区域中每个单元格与其下面对应的一个单元格合并 (先用录制宏看看合并怎么写)
Dim rng as Range for each rng in range("B2:F2") rng.resize(2,1).merge next
(2)将一张表中的数据,按某列(如部门)拆分到以部门命名的各张表中去
for 表2 to 表.count (先将目标表除表头外清空call qk) for 行2 to 末行 判断:if 行值 = 表名 then (计算目标表有多少行k 将该行copy到目标表的k+1行) next next
练习1:写清空的宏 sub qk() .clearcontents
练习2:如何根据数据中的部门列,为每个部分新建一张表,并以公司名字命名?
步骤1:将数据拆分到多张表:双重循环:每个表格与表名循环判断是否相同,相同则复制粘贴;
步骤2:复制粘贴前需清空已有内容,因此写qk的宏,call qk
思考:上述方法运行速度太慢,若先筛选再copy,速度会大大提升,如何做?
步骤3:用autofilter重写步骤1。
加大难度:上述步骤的前提是已建好表,现考虑自己根据源表新建表:
增加步骤:选择源表某列,依次循环单元格-->循环表名,看该单元格是否已有对应的表,以参数k记录-->若k表示无对应表,则add表
增加步骤:进一步地,p=InputBox("请确认你要按第几列拆分:"),以按需拆分(将range改为cells,注意要dim p as integer)
增加步骤:按需拆分数据前,要将已有的表格全部删除(注意去掉alert);结束时:msgbox "已处理完毕"
最后步骤:添加按钮,关联宏
注:有时不能定义inputbox的数据类型,希望输入的是整数,可用k= inputbox("请输入:") val(k)将k强制转换为整数。