带你入门VBA如何控制单元格.docx
- 文档编号:4088170
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:14
- 大小:153.68KB
带你入门VBA如何控制单元格.docx
《带你入门VBA如何控制单元格.docx》由会员分享,可在线阅读,更多相关《带你入门VBA如何控制单元格.docx(14页珍藏版)》请在冰豆网上搜索。
带你入门VBA如何控制单元格
带你入门VBA,第五讲:
如何控制单元格
单元格是我们平时接触最多的,所以此讲专门介绍和练习单元格的使用和控制。
马上就要开始。
。
。
在VBA中,单元格常用的表示方法有两种,
一种是RANGE
如A1在VBA的表示方法是Range("a1")
A1:
100的表法方法是:
Range("A1:
A100")
和以前一样,大家先在工作表中插入一个矩形作为执行宏的按纽
在按纽上单击右键,单击指定宏,再单击新建,在VBE窗口中的代码窗口会出现
Sub矩形1_单击()
EndSub
在两句中间输入
Range("a1")=1000
Range可以代表一个单元格区域,也可以代表一个单元格,通过
Range("a1")=1000也可以看出,它的用法是Range后括号中带上"A1"就可以表示我们平时在工作表用到的中的A1单元格了,
它在表示一个连续区域时是这个的,Range("区域的左上角单元格:
区域的右下角单元格")
请把刚才的代码再加上一句:
Range("a1:
a10")=1000
对,如果是不连续的单元格多个区域,它是这样表示的:
Range("单元格区域1,单元格区域2.....")
把刚才的代码替换为:
Range("a1:
a10,c1:
c10,e1:
e10")=100再试试
以下是引用matsumi在2004-10-2521:
35:
00的发言:
[a1]=1000与Range("a1")=1000有何区别?
[A1]是Range("A1")的简写.二者在用法上没有什么区别,但在输入时有点不同,如当你输入[A1]后加点时,后面不会出现属性和方法列表,而输入Range("A1")加点后则会出现属性列表供你选取
以下是引用gvntw在2004-10-2521:
40:
00的发言:
也可以这样吧:
Union([a1:
a10],[b3:
c10],[d5:
f7])=100
Union是求多个单元格区域的并集,用法是Union(单元格区域1,单元格区域2.....)
它返回的是所有区域的所有单元格集合
请运行下面的一句:
Application.Intersect(Range("a1:
a10"),Range("a3:
c4")).Select
这句有个Select,它是单元格被选取的意思。
在我们录制宏时,会出现大量的select,其实在程序中多数Select是多余的,它影响速度又会影响程序的运行。
如:
Range("C16").SelectActiveCell.FormulaR1C1="100"Range("C11").Select
其实我只是在C16单元格中填入数值100,就会出现这么一大堆代码,这此代码可以优化为:
Range("C16").="100"
以下是引用兰色幻想在2004-10-2521:
51:
00的发言:
下面请运行下面的一句:
Application.Intersect(Range("a1:
a10"),Range("a3:
c4")).Select
这一句的意思是选中区域A1:
A10和A3:
C4重叠的区域,即两个区域共有的区域,此名代码运行的结果是选中区域A3:
A4
注意Intersect方法是一个非常实用的一个方法,比如我们在动态选取工作表Sheet1A列中已存在数据的区域时,就会用到它。
在介绍这个用法前还要介绍一下另一个工作表中非常实用的属性:
Usedrange
你可以选试着运行一下:
Activecell.usedrange.Select
运行Activecell.usedrange.Select你会发现,在当前工作表中的所有用过的区域全被选中了。
你明白了吗,其实usedrange就是工作表中所有已存在内容的矩形区域,为什么不说是存在内容的单元格呢?
原因是比如你在一个空工作表中的B3和C5单元格任意输入一个数值,运行Activecell.usedrange.Select后选取的不只是B3和C5单元格,而是B3:
C5单元格区域
以下是引用gvntw在2004-10-2522:
42:
00的发言:
Sheet1.UsedRange.Select
我们平时在程序中会看到
Activesheet
worksheets("sheet1")
sheet1
sheets("sheet1")
Sheets
(1)
顺便说一说他们的区别
Activesheet是指当前活动工作表,即你正在操作的工作表
worksheets("sheet1")等同于sheets("sheet1")是特指工作表Sheet1,注意这时的Sheet1是工作表的名子,就如同"员工工资表"一样是工作表的名称,而Sheet1和Sheets
(1),不管你如何命名,Sheet1和Sheets
(1)就只代表第一个工作表,Sheet2和Sheets
(2)代表第二个工作表。
。
。
。
下面以一个实例说明如何动态选取一个区域:
要求:
无论工作表中所有单元格如何填入,运行程序后要选取A列已用所有区域:
代码如下:
Intersect(Range("a:
a"),Sheets("sheet1").UsedRange).Select
Range("a:
a")是A列,Sheets("sheet1").UsedRange是工作表sheet1已使用的所有单元格区域,用Intersect求二者的共有区域,结果就是我们所要的A列已用所有区域
Sub矩形1_单击()
Application.Intersect(Range("a:
a"),Sheets("sheet1").UsedRange).Select
EndSub
以下是引用先锋在2004-10-2523:
27:
00的发言:
结果不是的。
你把A9,A10,A11内容删掉,再运行它仍然选A3:
A12这个区域?
其实这中间有个规律:
如果你输入的是非数字的字符,即使你删除了,也被当做已用区域(已用过的区域),而当你删除的是你输入的数字时则不受这个限制)
以下是引用先锋在2004-10-2613:
01:
00的发言:
兰老师:
还是不明白?
输入非数字的字符时,确实是这样。
但是当输入的数字时,有时还是受这个限制的,如附件中的A3删掉后,怎么还选呢?
应该是受“Sheets("sheet1").UsedRange是工作表sheet1已使用的所有单元格区域”的影响吧,结果只是二者的共有区域,并不是我们所要的A列已用所有区域。
因为这个区域是矩形区域,在其他列第三行已填有内容,所以A3即使删除也属已用区域。
你可以再试着在C20填入任意一个内容,A列选取的也是到20行
如果只是简单的给单元格赋值就还是用[]的好,快捷.如果还要有其他控制最好还是用range().
以下是引用wuaza在2004-10-2620:
48:
00的发言:
考一下大家,sheet1.rows
(2).range("a3").select是选中哪个单元格?
其实它和这句一样的效果:
sheet1.Range("a2").Range("a3").Select
这种表示方式是对工作表区域重新进行定位坐标,原来默认是以A1为坐标右上端点,而Range("a2").Range("a3")则重新新定义以A2为右上角顶点坐标,在这种坐标系下的A3当然是A4了,再如:
Range("B2").Range("a3")的结果是以B2为右上端点,这种坐标下结果就为B4了
sheet1.rows
(2).range("a3").select是以第二行最右端点为新坐标顶点
说了这么多还没有介绍到另一个单元格的表示方式:
CellS
CellS(行数,列数)
如A1:
Cells(1,1)用range表示:
range("a1")
b2:
cells(2,2)用range表示:
range("b2")
c100:
cells(100,3)用range表示:
range("c100")
cells也是一个常用的单元格表示方法,它和Range在表示单元格时有什么共同点和区别呢?
Range可以表示单元格,也可以表示单元格区域cells也是这样,但除了cells作为一外集合对象外其他只能表示一个独立的单元格,如:
Cells.select选取工作表所有单元格
Cells(2,2).select选取B2单元格
所以在表示单元格区域时,除表示全部单元格外,其他均需用Range来表示如:
range("a1:
b20").
选中A列连续数据区域中最后一个单元格:
cells(range("a1").CurrentRegion.Rows.count,1).select
以下是引用612321在2004-10-2711:
44:
00的发言:
老师,我要为我的VBA程序设置密码保护的怎么设置啊?
在点击VBE编辑器菜单的工具---VBAProject属性---保护
以下是引用wuaza在2004-10-2711:
34:
00的发言:
再讲一讲offset和resize的用法吧。
offset是单元格或单元格区域的移动offset(移动行数,移动列数)
resize是单元格或单元格区域的行数和列数重新设置后范围大小resize(变动后行数,变动后列数)
例:
Range("A1:
B2").Select
选取A1:
B2区域
Range("A1:
B2").Offset(3,0).Select
A1:
B2区域向下移动三行,结果是选中A4:
B5区域
Range("A1:
B2").Resize(2,4).Select
A1:
B2区域重新设置,行数为2,列数为4,结果为选取A1:
D2
Range("A1:
B2").Resize(Range("A1:
B2").Rows.Count+2,Range("A1:
B2").Columns.Count+4).Select
A1:
B2区域重新设置,在原来行数的基础上加2行,在原来列数的基础上加4列,运行结果为:
结果是选取A1:
F4
Sub矩形1_单击()
Range("A1:
B2").Offset(3,0).Select
EndSub
Sub矩形2_单击()
Range("A1:
B2").Select
EndSub
Sub矩形3_单击()
Range("A1:
B2").Resize(2,4).Select
EndSub
Sub矩形4_单击()
Range("A1:
B2").Resize(Range("A1:
B2").Rows.Count+2,Range("A1:
B2").Columns.Count+4).Select
EndSub
以下是引用hpw在2004-10-2717:
14:
00的发言:
不好意思,上面说的太罗索
我其实就是想把上面说的第一步要操作的内容都去掉,只保留0.690,然后改成p=0.690,放到表格的标题后面就可以了.
呵呵,不知道这次说清楚了没有.一直等待........
OnErrorResumeNext如出错误,执行下一句K=-9设置变量K的初始值,设置K目的是控制在"购买可能性"后添加数的位置EEE=Application.CountIf(Columns
(2),"Crosstabs")EEE为循环的次数,有多少个"Crosstabs"就行循环多少次"ForI=1ToEEE设置循环K=K+12因为每个PearsonChi-Square相隔12行,所以设置循环一次加12AAA=Application.Match("Crosstabs",Columns
(2),0)计算Crosstabs的位置BBB=Application.Match("Tables",Columns
(2),0)计算Tables的位置CCC=Application.Match("PearsonChi-Square",Columns
(2),0)计算PearsonChi-Square的位置DDD=Format(Cells(CCC,5),"0.000")把相应PearsonChi-Squar的数值赋予DDD,如第一个是0.690Range(Cells(AAA,1),Cells(BBB,1)).EntireRow.Delete把Crosstabs和Tables之间的行删除(包括含Crosstabs和Tables的行)Cells(K,2)="附表单位购买的可能性(P="&DDD&")"在表头加入相应的内容Next
以下是引用hnymlzs在2004-10-2722:
14:
00的发言:
兰大侠你好:
能把下的代码给解释一下?
PrivateSubWorkbook_BeforeClose(CancelAsBoolean)TerminateSetappTime=NothingSetobjBtn=NothingEndSub
PrivateSubWorkbook_Open()Init(1000)EndSub
PrivateDeclareFunctionSetTimerLib"user32"(ByValhWndAs_Long,ByValnIDEventAsLong,ByValuElapseAsLong,_ByVallpTimerFuncAsLong)AsLong
PrivateDeclareFunctionKillTimerLib"user32"(ByValhWndAs_Long,ByValnIDEventAsLong)AsLongDimhTimerPublicobjBtnAsCommandBarControl
SubTimerProc(ByValhWnd&,ByValMsg&,ByValidEvent&,ByValdwTime&)DoEventsOnErrorResumeNextRange("A1")=Format(Now,"hh:
mm:
ssAM/PM")EndSub
SubInit(Interval&)hTimer=SetTimer(0,0,Interval,AddressOfTimerProc)EndSub
SubTerminate()CallKillTimer(0,hTimer)EndSub
学得可真快,都到API啦,我也不太懂,跟着学……
上传的代码可能只是一部分,蓝色部分放入thisworkbook模块,褐色部分在普通模块。
作用:
类似电子时钟,每秒(1000毫秒)更新一次时间。
工作表打开时运行Init(1000),即运行SetTimer(0,0,Interval,AddressOfTimerProc),其中Interval为Init传来的1000;
SetTimer:
API函数,用来分配定时器,周期性地在指定间隔的时间过去时调用过程;
有四个参数:
第三个参数指定时间间隔,以毫秒为单位(此处1000);第四个参数指定函数的过程实例,即按定时器的通知调用过程,此处调用TimerProc过程。
TimerProc过程将系统时间(now)写入A1单元格,由于定时器的设定,每秒写一次。
关闭工作簿时运行Terminate,KillTimer也是API函数,用于清除定时器,终止调用。
以下是引用hnymlzs在2004-10-2722:
14:
00的发言:
兰大侠你好:
能把下的代码给解释一下?
PrivateSubWorkbook_BeforeClose(CancelAsBoolean)TerminateSetappTime=NothingSetobjBtn=NothingEndSub
PrivateSubWorkbook_Open()Init(1000)EndSub
PrivateDeclareFunctionSetTimerLib"user32"(ByValhWndAs_Long,ByValnIDEventAsLong,ByValuElapseAsLong,_ByVallpTimerFuncAsLong)AsLong
PrivateDeclareFunctionKillTimerLib"user32"(ByValhWndAs_Long,ByValnIDEventAsLong)AsLongDimhTimerPublicobjBtnAsCommandBarControl
SubTimerProc(ByValhWnd&,ByValMsg&,ByValidEvent&,ByValdwTime&)DoEventsOnErrorResumeNextRange("A1")=Format(Now,"hh:
mm:
ssAM/PM")EndSub
SubInit(Interval&)hTimer=SetTimer(0,0,Interval,AddressOfTimerProc)EndSub
SubTerminate()CallKillTimer(0,hTimer)EndSub
学得可真快,都到API啦,我也不太懂,跟着学……
上传的代码可能只是一部分,蓝色部分放入thisworkbook模块,褐色部分在普通模块。
作用:
类似电子时钟,每秒(1000毫秒)更新一次时间。
工作表打开时运行Init(1000),即运行SetTimer(0,0,Interval,AddressOfTimerProc),其中Interval为Init传来的1000;
SetTimer:
API函数,用来分配定时器,周期性地在指定间隔的时间过去时调用过程;
有四个参数:
第三个参数指定时间间隔,以毫秒为单位(此处1000);第四个参数指定函数的过程实例,即按定时器的通知调用过程,此处调用TimerProc过程。
TimerProc过程将系统时间(now)写入A1单元格,由于定时器的设定,每秒写一次。
关闭工作簿时运行Terminate,KillTimer也是API函数,用于清除定时器,终止调用。
以下是引用兰色幻想在2004-10-2522:
56:
00的发言:
我们平时在程序中会看到
Activesheet
worksheets("sheet1")
sheet1
sheets("sheet1")
Sheets
(1)
顺便说一说他们的区别
Activesheet是指当前活动工作表,即你正在操作的工作表
worksheets("sheet1")等同于sheets("sheet1")是特指工作表Sheet1,注意这时的Sheet1是工作表的名子,就如同"员工工资表"一样是工作表的名称,而Sheet1和Sheets
(1),不管你如何命名,Sheet1和Sheets
(1)就只代表第一个工作表,Sheet2和Sheets
(2)代表第二个工作表。
。
。
。
sheet1和sheets
(1)不同,sheet1是工作表的对象实例名称,在工作表属性中可以修改,也就是说只要不出现重名,sheets
(2)的实例名称也可以是Shee
以下是引用啊一在2004-10-2813:
40:
00的发言:
比如我在SHEET1中放置一个按扭,单击就选定没有数据的行,当然了要VBA自己判断到底到哪一行有数据,然后选择剩下没有数据的空白行.
Range("A1:
A1000").SpecialCells(xlCellTypeBlanks).EntireRow.Select
点击浏览该文件SpecialCells方法
此对象代表与指定类型及值相匹配的所有单元格。
语法
expression.SpecialCells(Type,Value)
expression必选。
该表达式返回一个Range对象。
TypeLong类型,必选。
要包含的单元格。
可为以下XlCellType常量之一。
常量
说明
xlCellTypeAllFormatConditions
任意格式的单元格
xlCellTypeAllValidation
具有有效条件的单元格
xlCellTypeBlanks
空单元格
xlCellTypeComments
包含注释的单元格
xlCellTypeConstants
包含常量的单元格
xlCellTypeFormulas
包含公式的单元格
xlCellTypeLastCell
已用区域的最后一个单元格
xlCellTypeSameFormatConditions
具有相同格式的单元格
xlCellTypeSameValidation
具有相同有效条件的单元格
xlCellTypeVisible
所有可见单元格
ValueVariant类型,可选。
如果Type为xlCellTypeConstants或xlCellTypeFormulas之一,此参数可用于确定结果中应包含哪几类单元格。
将某几个值相加可使此方法返回多种类型的单元格。
默认情况下将选定所有常量或公式,对其类型则不加区别。
可为以下XlSpecialCellsValues常量之一:
xlErrors、xlLogical、xlNumbers或xlTextValues。
注:
上面的常量是和编辑菜单---定位---定位条件相对应的,说白了,就是通过VBA来控制定位功能
以下是引用yigepure在2004-10-2821:
55:
00的发言:
CurrentRegion这个不是取它周围的单元格区域吗.为什么不连续就不行呢.
A列最后一个单元格可以用
Range("A65536").end(xlup).select
以下是引用啊一在2004-10-2912:
35:
00的发言:
兰老师(我知道你不喜欢这样的称呼可我不知道你的性别和年龄)!
我的意思是选取数据区域之外的行,就是有数据的行的下一行到65536行之间的所有行。
我这样写了,也能实现但是是我自己摸索的肯定不是规范的语法,不是最快捷的,请兰老师看看有没有更好的办法:
Sub隐藏()DimiAsIntegeri=Application.WorksheetFunction.Max(Range(Range("B9"),Range("B65536").End(xlUp)))Range(Cells(i,256),Cells(65536,256)).EntireRow.Hidden=TrueEndSub
Range(Cells(Range("A65536").End(xlUp).Row+1,1),Cells(65536,1)).EntireRow.Hidden=True
我们平时一个文件来回修改的久了体积就会变的很大,比如我做的那个成绩册,没多少代码竟然1.47M,后来我想了一个办法把体积缩小了40多倍。
方法:
1、打开那个比较大的文件,再重新打开一个EXECL应用程序,把工作表中的所有控件复制到新的工作表中,然后按原来的宏指定,因为复制过来的时候宏是不能跟着过来的。
2.把那个大
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 入门 VBA 如何 控制 单元格
![提示](https://static.bdocx.com/images/bang_tan.gif)