VAB学习之我见.docx
《VAB学习之我见.docx》由会员分享,可在线阅读,更多相关《VAB学习之我见.docx(37页珍藏版)》请在冰豆网上搜索。
![VAB学习之我见.docx](https://file1.bdocx.com/fileroot1/2022-11/21/3aae026d-5d2e-4baa-afb5-f7ea450a3602/3aae026d-5d2e-4baa-afb5-f7ea450a36021.gif)
VAB学习之我见
VAB学习之我见
1、单元格附值
a.[A1]=100'在A1单元格输入100。
b.[A2:
A4]=10'在A2:
A4单元格输入10。
c.Range("B1")=200'在B1单元格输入200.
d.Range("C1:
C3")=300'在C1:
C3单元格输入300。
e.Cells(1,4)=400'在D1单元格输入400.
f.Range(Cells(1,5),Cells(5,5))=50'在E1:
E5单元格输入50。
2、读取其他单元格数值
a.Cells(1,4)=Sheet4.Cells(1,4)'把Shee4工作表(只能是原始名字,sheet改名后不可用)单元格D1数据,读到D1单元格。
b.Cells(1,4)=worksheets
(2).Cells(1,4)'把第2个sheet(从左向右数)工作表单元格D1数据,读到D1单元格。
也可以写成Cells(1,4)=sheets
(2).Cells(1,4)
c.Cells(1,4)=Sheet4.Cells(1,4)'把Shee4工作表单元格D1数据,读到D1单元格。
d.Range(Cells(1,5),Cells(5,5))=Sheets("name").Cells(1,1)'读取名字为name工作表单元格A1数据。
e.i=activecell.Row’是把当前单元格的行数,指定给变量i。
j=activecell.Column’是把当前单元格的栏数,指定给变量j。
f.vba中range(cells,cells)插入变量,选择不连续单元格区域的问题
就是我编vba的时候,通过录制发现Range("A1:
B4,D1:
E4").Select可以选取不连续的单元格区域。
但是我实际上单元格区域是不定的,比如A1:
B4中的行4是不定的,我用i=range("A65536").end(xlup).row计算的。
所以当我现在选取这些不连续单元格区域的时候,就有变量了
首先我把4改成i,那么就变成了range("A1:
Bi,D1:
Ei"),当然这句话肯定是错的,于是又改成range(""A1:
B"&i,"D1:
E"&i"),还是错的,又改成range("'A1:
B'&i,'D1:
E'&i"),但变量在""中似乎不能识别。
于是去掉外面的""后就成了range("A1:
B"&i,"D1:
E"&i),这样又成了连续的单元格区域,我实在晕死,不知道怎么办了,我的区域很多,操作的变量不止i一个,而且后面操作的代码一大串。
所以请问高手如何解决插入变量,选择不连续单元格区域的问题啊
最佳答案
你的意思是想在range中插入变量对吧?
你的原来写法是:
range(""A1:
B"&i,"D1:
E"&i")
你把它改成:
Range("a1:
b"&i&",d1:
e"&i&"")看看
你一定要分清这串字符串中的变量和字符
要了解双分号和&的用法
记得要在&和i中间加入空格
3、Worksheet_SelectionChange
a.PrivateSubWorksheet_SelectionChange(ByValTargetAsRange)Target=100EndSub
‘利用Worksheet_SelectionChange输入数据,Target指的是你鼠标所选的单元格,Worksheet_SelectionChange()事件的参数。
可以是一个也可以是好几个单元格。
Range是Excel特有的变量形态,叫范围。
TargetAsRang是把Target这个参数设定为Range变量形态。
Target=100是把你点选的单元格输入数字100。
b.PrivateSubWorksheet_SelectionChange(ByValTargetAsRange)IfTarget.Row>=2AndTarget.Column=2ThenTarget=100EndIfEndSub
‘Target.Row>=2,指的是鼠标选定的单元格的行数大于或等于2。
Target.Column=2,指的是鼠标选定的单元格的列数等于2。
IfTarget.Row>=2AndTarget.Column=2Then指的是(Target.Row>=2)为True及(Target.Column=2)为True时,才执行B栏第二行及以下行用鼠标被点选时,才会被输入100,其它单元格则不被输入数据。
等同方法:
利用CommandButton1_Click()
PrivateSubCommandButton1_Click()
IfActiveCell.Row>=2AndActiveCell.Column>=3Then
ActiveCell=100
EndIf
EndSub
4、Worksheet_Change()
PrivateSubWorksheet_Change(ByValTargetAsRange)
DimiRow,iColAsInteger
iRow=Target.Row
iCol=Target.Column
IfiRow>=2AndiCol=2AndTarget<>""
Then
Application.EnableEvents=False
Cells(iRow,iCol+1)=Cells(iRow,iCol)*2
Application.EnableEvents=True
ElseIfiRow>=2AndiCol=2AndTarget=""Then
Cells(iRow,iCol+1)=""
Else
Cells(iRow,iCol+1)=""
EndIf
EndSub
Application.EnableEvents=False与Application.EnableEvents=True,这是个成双的程序,当你用了前者记得在执行其他程序後要写上後面的程序。
它的目的在抑制事件连锁执行。
简单的说就是,在B字段所触发的事件,不愿在其它单元格再触发另一个Worksheet_Change()事件。
5、Worksheet_Activate()
6、Worksheet_Calculate()
7、Worksheet_BeforeRightClick()
PrivateSubWorksheet_BeforeRightClick(ByValTargetAsRange,CancelAsBoolean)
IfNotApplication.Intersect(Target,Range("D8"))IsNothingThenCancel=True
MsgBox("TargetisRangeD8andCancelisTrue!
")
Else
Cancel=False
EndIf
EndSub
‘在D12按鼠标右键将呈现正常的右键菜单;在D8按鼠标右键将呈现一个对话框并且屏闭掉右键菜单。
8、Worksheet_FollowHyperlink()
9、Worksheet_BeforeDoubleClick()
10、语句和语法
A、if----then-------
else
endif
B、selectcase
SelectCaseActiveCell.Value
CaseIs<60
Cells(ActiveCell.Row,ActiveCell.Column+1)="不及格"
Case60To89.9
Cells(ActiveCell.Row,ActiveCell.Column+1)="良"
CaseElse
Cells(ActiveCell.Row,ActiveCell.Column+1)="优"
EndSelect
C、DoUntil
Loop
11、设置忽略错误
语句1:
OnErrorResumeNext
表示:
若发生错误,则忽略它,跳到下一条语句继续执行。
语句2:
OnErrorGoTo行号(或标号)
表示:
若运行有错,则跳到标号指定位置,转去执行错误处理例程。
获取错误信息在宏执行过程中,可以通过专用调试对象Err的属性值来了解是否发生实时错误以及发生了什么样的错误。
若Err.Number值为0,则表明没有产生错误,反之有错误。
下面通过两个例子说明如何使用错误捕获技术。
例1,假设有一学生档案工作簿StudentBook,其中已有若干学生档案工作表Student1、Student2……以及其它一些工作表。
现需要建立一个新的Student学生档案工作表,但又不想删除已有的Student工作表,如同Excel增加新工作表一样,只将工作表名称的后缀加1。
SubMakeNextStudent()
DimSheetAsWorksheet
DimBaseAsString
DimSuffixAsInteger
SetSheet=WorkSheets.Add
Base=“Student”
Suffix=1
OnErrorResumeNext
Sheet.Name=Base&Suffix
DoUntilErr.number=0
Err.Clear
Suffix=Suffix+1
Sheet.Name=Base&Suffix
Loop
EndSub
MakeNextStudent宏的执行过程是:
先建立一个新工作表,再试着以Student为基本名、1为后缀构成的名称给新工作表命名。
OnErrorResumeNext语句的作用是:
若已有同名工作表存在,Excel不能给新工作表命名时,VisualBaisc并不终止所执行的程序,而是自动给Err对象的Number属性赋值,设置出错信息代码,执行DoUntil循环。
DoUntil循环首先检查命名是否成功,若不成功,则增加后缀值,再试着重新命名,再检查……直到没有产生错误(即重新命名成功Err.Number=0),才结束循环。
Do语句后面的Err.Clear语句的作用是将出错信息代码重新置为0,让VisualBaisc忘记曾经发生的错误。
例2,下面宏的功能是:
当试图删除打开的文件时,错误处理例程先调用MsgBox函数提示用户文件正在使用,让用户确认是否要删除该文件,再作相应的处理。
SubKillFile()
OnErrorGoToKillFile_Err
Open"MyFile"ForOutputas#1
Kill"MyFile"
ExitSub
KillFile_Err:
myCheck=MsgBox("MyFile文件正在使用,是否要删除?
",vbYesNo)
IfmyCheck=vbYesThen
Close#1
Kill"MyFile"
EndIf
EndSub
12、数值调节钮和滚动条控件
从“视图”菜单中选“工具栏”命令,单击“控件工具箱”。
单击“控件工具箱”中的“数值调节钮”控件,然后在周期单元格的右侧拖拽出一个大小合适的“数值调节钮”。
单击“控件工具箱”上的“属性”按钮,在出现的属性窗口中设置Max属性值为30,Min属性值为5,LinkCell属性值为C4(它使得单击“数值调节钮”时,C4单元格的内容会相应变动),SmallChange属性值为5(它使得每单击“数值调节钮”一次,C4单元个的值增加或减少5)。
如果数值增减幅度很小,再使用数值调节钮不太方便。
故使用滚动条控件。
同样可以设置Max、Min、SmallChange的属性值。
如果在C4单元格输入一个数,将清除单元格中的公式,导致相应的滚动条失效。
如果简单地将将工作表保护起来,虽然会避免用户输入无效值,但工作表被保护起来的同时,连ActiveX控件也不能改变相应单元格的值了。
现采用另一种方法,既可以保护工作表,又能用VisualBasic程序改变单元格的值,这就是用事件控制程序。
首先,把与控件相连的单元格清除,即不用控件往单元格内填值,转而用事件控制程序往单元格内填写值。
进入“设计模式”。
选定第一个滚动条,将其的LinkCell属性清空。
再单击“查看代码”按钮,在名为PrivateSubScrollBar1_Change()的事件控制程序中,添加下述语句:
Range("C3").Value=ScrollBar1.Value/10000
类似地清除“数字调节钮”和第二个滚动条的LinkCell属性,在ScrollBar2_Change()事件过程中添加语句:
Range("C5").Value=ScrollBar2.Value
在SpinButton1_Change()事件过程中添加语句:
Range("C4").Value=SpinButton1.Value
这些事件控制程序使得单元格中的值随着控件的变化而变化。
这时可以保护工作表了。
在“工程”窗口中双击“ThisWorkbook”对象,进入“代码”窗口。
在Workbook_Open()事件控制程序中加入下述语句:
Sheets(“Sheet1”).ProtectUserInterfaceOnly:
=True
Workbook_Open事件过程是工作簿的默认事件,每当工作簿打开时执行。
该语句的UserInterfaceOnly参数使得宏可以改变那些用户和控件不能改变的单元格。
这样用户就不能往工作表中输入内容了,实际上也不必输入,只要用鼠标简单操作哪些控件就可以了。
图形用户界面最大的好处是将可选功能限制于那些有效功能之间,因此减少,甚至杜绝了用户出错的机会。
13、添加新菜单
例子1.
PrivateSubWorkbook_Open()
'CreatemainmenuontheCommandBar
MenuBars(xlWorksheet).Menus.AddCaption:
="&Creat文件"
WithMenuBars(xlWorksheet).Menus("Creat文件")
'Addsubmenuandsubmenuitems
.MenuItems.AddCaption:
="&打开文件",OnAction:
="Userform1show"
'需要在模块中添加相应的宏subuserform1show()
EndWith
EndSub
14、选择类
选择带有数的连续区域
Rows("3:
3").Select
Range(Selection,Selection.End(xlDown)).Select
选择第三行向下所有的连续带数值的行。
如何选择当前工作表中的单元格?
例如,可以使用下面的代码选择当前工作表中的单元格D5:
ActiveSheet.Cells(5,4).Select或:
ActiveSheet.Range("D5").Select
如何选择同一工作簿中其它工作表上的单元格?
例如,要选择同一工作簿中另一工作表上的单元格E6,可以使用下面的代码:
Application.GotoActiveWorkbook.Sheets("Sheet2").Cells(6,5)
或:
Application.Goto(ActiveWorkbook.Sheets("Sheet2").Range("E6"))
也可以先激活该工作表,然后再选择:
Sheets("Sheet2").Activate
ActiveSheet.Cells(6,5).Select
如何选择不同工作簿中的单元格?
例如,要选择另一工作簿中的一个工作表上的单元格F7,可以使用下面的代码:
Application.GotoWorkbooks("BOOK2").Sheets("Sheet1").Cells(7,6)
或:
Application.GotoWorkbooks("BOOK2").Sheets("Sheet1").Range("F7")
也可以先激活该工作簿中的工作表,然后再选择:
Workbooks("BOOK2.XLS").Sheets("Sheet1").Activate
ActiveSheet.Cells(7,6).Select
如何选择当前工作表中的单元格区域?
例如,要选择当前工作表中的单元格区域C2:
D10,可以使用下面的代码:
ActiveSheet.Range(Cells(2,3),Cells(10,4)).Select
或:
ActiveSheet.Range("C2:
D10").Select
或:
ActiveSheet.Range("C2","D10").Select
如何选择同一工作簿中另一工作表上的单元格区域?
例如,要选择同一工作簿中另一工作表上的单元格区域D3:
E11,可以使用下面的代码:
Application.GotoActiveWorkbook.Sheets("Sheet3").Range("D3:
E11")
或:
Application.GotoActiveWorkbook.Sheets("Sheet3").Range("D3","E11")
也可以先激活该工作表,然后再选择:
Sheets("Sheet3").Activate
ActiveSheet.Range(Cells(3,4),Cells(11,5)).Select
如何选择不同工作簿中工作表上的单元格区域?
例如,要选择另一工作簿中某工作表上的单元格区域E4:
F12,可以使用下面的代码:
Application.GotoWorkbooks("BOOK2").Sheets("Sheet1").Range("E4:
F12")
或:
Application.GotoWorkbooks("BOOK2").Sheets("Sheet1").Range("E4","F12")
也可以先激活该工作表,然后再选择:
Workbooks("BOOK2").Sheets("Sheet1").Activate
ActiveSheet.Range(Cells(4,5),Cells(12,6)).Select
如何在当前工作表中选择命名区域?
例如,要选择当前工作表中名为“Test”的区域,可以使用下面的代码:
Range("Test").Select
或:
Application.Goto"Test"
如何选择同一工作簿中另一工作表上的命名区域?
例如,选择同一工作簿中另一工作表上名为“Test”的区域,可使用下面的代码:
Application.GotoSheets("Sheet1").Range("Test")
也可以先激活工作表,再选择:
Sheets("Sheet1").Activate
Range("Test").Select
如何选择与当前单元格相关的单元格?
例如,要选择距当前单元格下面5行左侧4列的单元格,可以使用下面的代码:
ActiveCell.Offset(5,-4).Select
要选择距当前单元格上方2行右侧3列的单元格,可以使用下面的代码:
ActiveCell.Offset(-2,3).Select
注意:
一定要保证当前单元格与所选单元格之间的距离在工作表范围内,否则会出错。
如何选择与另一单元格(不是当前单元格)相关的单元格?
例如,要选择距单元格C7下方5行右侧4列的单元格,可以使用下面的代码:
ActiveSheet.Cells(7,3).Offset(5,4).Select
或:
ActiveSheet.Range("C7").Offset(5,4).Select
如何选择一个指定的区域并扩展区域的大小?
例如,要选择当前工作表中名为“Database”区域,然后将该区域向下扩展5行,可以使用下面的代码:
Range("Database").Select
Selection.Resize(Selection.Rows.Count+5,Selection.Columns.Count).Select
如何选择一个指定的区域,再偏离,然后扩展区域的大小?
例如,选择名为“Database”区域下方4行右侧3列的一个区域,然后扩展2行和1列,可以使用下面的代码:
Range("Database").Select
Selection.Offset(4,3).Resize(Selection.Rows.Count+2,Selection.Columns.Count+1).Select
如何选择两个或多个指定区域?
例如,为了同时选择名为“Test”和“Sample”的两个区域,可以使用下面的代码:
Application.Union(Range("Test"),Range("Sample")).Select
注意,这两个区域须在同一工作表中,如下面的代码:
Sety=Application.Union(Range("Sheet1!
A1:
B2"),Range("Sheet1!
C3:
D4"))
但Union方法不能处理不同工作表中的区域,可下面的代码:
Sety=Application.Union(Range("Sheet1!
A1:
B2"),Range("Sheet2!
C3:
D4"))
将会出错。
如何选择两个或多个指定区域的交叉区域?
例如,要选择名为“Test”和“Sample”的两个区域的交叉区域,可以使用下面的代码:
Application.Intersect(Range("Test"),Range("Sample")).Select
注意,两个区域必须在同一工作表中。
下面的示例使用了如下图所示的工作表。
如何选择连续数据列中的最后一个单元格?
例如,要选择一个连续列中的最后一个单元格,可以使用下面的代码:
ActiveSheet.Range("a1").End(xlDown).Select
该代码使用在上面的工作表中,单元格A4被选择。
如何选择连续数据列底部的空单元格?
例如,要选择连续单元格区域下面的单元格,可以使用下面的代码:
ActiveSheet.Range("a1").End(xlDown).Offset(1,0).Select
该代码使用在上面的工作表中,单元格A5被选择。
如何选择某列中连续数据单元格区域?
例如,要选择一列中的连续数据单元格区域,可以使用下面的代码:
ActiveSheet.Range("a1",ActiveSheet.Range("a1").End(xlDown)).Select
或:
ActiveSheet.Range("a1:
"&ActiveSheet.Range("a1").End(xlDown).Address).Select
该代码使用在上面的工作表中,单元格区域A1:
A4将被选择