vba基础知识汇总
1.工作簿事件写到THISWORKBOOK中,工作表事件写到sheet中,其他通用代码和函数子程序之类的写到模块中,窗体代码写到对应的窗体中,类相关的代码写到类模块中。
Worksheets.Add before :=Worksheets( 1) '在最前面添加一个工作表
Worksheets.Add after :=Worksheets( "sheet2") '在工作表 sheet2之后添加一个工作表"
Worksheets.Add after :=Worksheets( Worksheets.Count) '在最后面添加一个工作表
Worksheets.Add before :=Worksheets( 1) '在最前面添加一个工作表
ActiveSheet.Name = "abc" '将新建的工作表更名为“ abc”
等同
Worksheets.Add (before:= Worksheets(1)). Name = "abc" ' 在最前面添加一个名称为“ abc”的工作表
Worksheets.Add Count :=3 '添加三个工作
If Worksheets (" 清镇市外") Is Nothing Then '判断是否存在“清镇市外”工作表 ,不存在就新建
Set c_coll = New Collection
2.If 句法,
if 有两种写法,单行和块结构。
1、If 条件 Then 符合条件后的语句
2、If 条件 Then
符合条件后的语句
End If
其实就是if语句语法规则的问题。if和end if之间的语句,都算是这个if语句块之间的内容。
对于if true then exit sub这样的语句,因为在if判断后,只要执行一个操作“exit sub”所以并不需要end if,编译的时候能自动分析出,exit sub这句是属于这个if块的,当然VB规定这样的情况,要写成一行。
如果if判断后,要执行多个操作,按照VB的语法规则,就要把每个操作写一行,并在最后用end if表示这个if块结束。这样编译的时候,才能正确分析出,这些操作属于这个if块。
3. = 和 := 的区别
通常给变量及属性赋值时不用“:”号
。只有给参数赋值时才使用“:”号。
比如说:expression.Copy(Before, After),当你要给Before和After两个可选参数赋值且不用考虑顺序时,就要使用“:”号,就像Worksheets("Sheet1").Copy After:=Worksheets("Sheet3"),否则你就必须使用如下的格式:
Worksheets("Sheet1").Copy ,Worksheets("Sheet3")。“,”号前面表示Before参数的位置,“,”号后面才表示是After变量。
4.sub auto_open()要放在新模块中才会自动执行。
5.易失性函数 application.volatile Ture 放在函数第一行,数据更新,函数立即更新
6.application.ScreenUpdating = False 屏幕更新不显示
7.数据类型 类型符
Integer %
Long &
Single !
Double #
Currency @
String $
String*size $
声明变量时可以直接用类型符,比如Dim a As Integer可以直接写成Dim a%
8.把Sheet1里的第一行数据复制到Sheet2的第一行
Sheets("sheet1"). Rows(1). Copy Sheets("sheet2"). Rows(1)
Sheets("sheet2"). Rows(1). Value = Sheets ("sheet1" ).Rows(1).Value
9.新建工作表
Worksheets.Add before :=Worksheets( "sheet2") '在工作表 sheet2之前添加一个工作表Worksheets.Add before :=Worksheets( 1) '在最前面添加一个工作表
Worksheets.Add after :=Worksheets( "sheet2") '在工作表 sheet2之后添加一个工作表"
Worksheets.Add after :=Worksheets( Worksheets.Count) '在最后面添加一个工作表
Worksheets.Add before :=Worksheets( 1) '在最前面添加一个工作表
ActiveSheet.Name = "abc" '将新建的工作表更名为“ abc”
等同
Worksheets.Add (before:= Worksheets(1)). Name = "abc" ' 在最前面添加一个名称为“ abc”的工作表
Worksheets.Add Count :=3 '添加三个工作
If Worksheets (" 清镇市外") Is Nothing Then '判断是否存在“清镇市外”工作表 ,不存在就新建
Worksheets.Add (after:= Worksheets(Worksheets.Count )).Name = " 清镇市外"
10.Columns(5).EntireColumn.AutoFit
自动调整列宽以显示内容,相当于在列的分隔线上双击鼠标左键
11.如果有几个区域,如B3:C4, E5:F6, 怎么样把它们表示在一个RANGE()里面 -------------感觉要用union,union(range("b3:c4"),range("e5;f6")) 424楼的朋友说的Range("B3:C4" ,"E5:F6"),就该表示的是range("b3:f6"),不是两个区域。
12.Application.WorksheetFunction.Transpose(arr)转置函数
(1)一维数组写入单元格区域时,这个单元格必须是水平方向的,也就是一个一行多列的单元格区域,如果想写入垂直区域,必须使用工作表的Transpose函数转换一下;
(2)和工作表的多单元格数组公式一样,数组写入单元格时,单元格的区域必须和数组的大小一致。
13. Sheets(sh.Name).Range("b3:b" & aa).Copy 这句是复制B3到B至aa行的区域
Sheets("外在本就读花名册").Cells(bb, 2).PasteSpecial (xlPasteValues) Pastespecial(xlPasteValues) 只粘贴内空不把底色抹去
14.我希望在录入数据后,单元格的边框线会自动随着数据的增加而增加,无须设置。 ————用VBA的话,在每一次添加之后都将添加的行设置上边框或相应的格式就可以了。个人觉得这个问题用条件格式会简单点,方法为,选中工作表(比如全部),条件格式公式设置为:=AND($A1<>"",A$1<>""),然后再设置好相应的格式即可。
15.工作表隐藏
SHEET1.VISIBLE=XLVERYHIDDEN
SHEET1.VISIBLE=XLSHEETVERYHIDDEN
第一个是“深度隐藏”,深度隐藏就是不能通过菜单里的“格式——工作表——取消隐藏”恢复,必须使用VBA修改才能恢复显示。
16.设置单元格背景颜色
range("a7").interior.colorindex =7
17.end(3)代表end(xlUp)
xlToLeft ,xlToRight,xlUp ,xlDown 对应 1,2,3,4
18.修改第3列,自动把时间写入第4列
Private Sub Worksheet_Change( ByVal Target As Range)
'当被修改的单元格只有一个,且列号等于3,行号大于2时执行程序
If Target.Count = 1 And Target.Column = 3 And Target.Row > 2 Then
Target.Offset (0, 1) = Date '被修改的单元格的右面一个单元格的值为当前日期
End If
End Sub
19.选区只能选中第1个单元格
Private Sub Worksheet_SelectionChange( ByVal Target As Range)
Target.Cells(1).Select
End Sub
20.如何让修改程序只运行一次呢?有办法,使用Application.EnableEvents = False语句即可。使用了这句语句后,就禁止了事件的发生,当你在修改单元格的数值后就不会再触发工作表的Change事件了。使用它后将不会出现事件的“连锁反应”,就不会重复执行程序了。但要注意的是,在程序结束时需要用 Application.EnableEvents = True把它的属性改回来,因为Excel不会自动去替我们修改它。
Private Sub Worksheet_Change( ByVal Target As Range)
Application.EnableEvents = False
Target.Value = Target.Value & "公司"
Application.EnableEvents = True
End Sub
21.标注选区内A字母为红色
Sub Worksheet_SelectionChange(ByVal Target As Range )
Dim rng As Range, i As Integer
For Each rng In Selection
i = 1
Do While InStr(i, rng , "A") > 0
rng.Characters (InStr( i, rng, "A" ), 1). Font.ColorIndex = 3
i = InStr( i, rng, "A" ) + 1
Loop
Next
End Sub
22.是不是需要其他事件如SELECTIONCHANGE事件来做配合啊!
—是的,很多时候都需要这两个事件配合起来用,比如上面说的加“公司”,还有单元格数据的累加时候都可能会需要到。还是加“公司”的例子,当你输入“皮包”后,回车,单元格会自动变为“皮包公司”,可当我们再一次双击该单元格,但并不对单元格进行值的修改时,也会变为“皮包公司公司”,而实际上我们并没有修改它的值。那么,我们就可以用这个事件配合Change事件判断单元格的值是否修改了。
代码可为:
Dim x '定义一个公共变量,让两个程序都可以用
Private Sub Worksheet_Change( ByVal Target As Range)
If Target.Value = x Then Exit Sub '如果修改的单元格的值等于变量x的值,退出程序
Application.EnableEvents = False
Target.Value = Target.Value & "公司"
Application.EnableEvents = True
End Sub
Private Sub Worksheet_SelectionChange( ByVal Target As Range)
x = Target.Value '将选中的单元格的值赋给变量x
End Sub
23. sheet1和sheets(1)区别
sheet2属于CodeName属性,如:sheets("myname").codename
sheets(2)中的2是index属性,如:sheets("myname").index
24.区域选择
mxrow = Range("a1"). CurrentRegion.Rows.Count + 1 ' 行号
mxcol = Range("a1"). CurrentRegion.Columns.Count + 1 ' 列号
Cells(mxrow, mxcol ).Select ' 选中单元格
Set rng = Range("a1", Cells(mxrow, mxcol)) '也可以写成:Set rng = [a1].Resize(mxrow, mxcol)
rng.Select '选中组成区域
rng.EntireRow.RowHeight = 20 '设置行高
rng.EntireColumn.ColumnWidth = 10 '设置列宽
25. 打开一个指定的工作表,并将其中sheet(1)工作表的A1单元格数据复制到当前工作薄中sheets(2)工作表的B2单元格。
Sub test()
Application.ScreenUpdating = False ' 关闭屏幕更新
Dim Filename As String ' 定义一个字符串变量
Filename = Application.GetOpenFilename '选择一个 Excel文件(如果文件是已知的,可以直接打开)
Workbooks.Open Filename '打开选择的文件
ThisWorkbook.Sheets(2).Range( "b2").Value = ActiveWorkbook.Sheets(1).Range ("a1" ).Value '将打开的文件的 sheet(1)工作表里的A2单元格数值赋给当前工作薄 sheets(2)工作表的B2 单元格
ActiveWorkbook.Close '关闭选择打开的工作表
Application.ScreenUpdating = True ' 打开屏幕更新
End Sub
26.set 主要作用于对象类型的变量的初始化,如:
Dim c_coll As CollectionSet c_coll = New Collection
27.call用来执行子程序
28.加载宏的特点
A、 隐藏的
B、 一打Excel程序就会打开
加载“加载宏”
A、 Office按钮——>>Excel选项——>>加载项——>>转到——>>加载项对话框——>>勾起“加载项名”前面的勾——>>确定
29. 对象实例
A. Workbooks 代表工作簿集合,所有的工作簿,Workbooks(i),表示已打开的第i个工作簿
B. Workbooks ("汇总表") 代表“汇总”工作簿
C. ActiveWorkbook 当前正在操作的工作簿
D. ThisWorkBook 代码所在的工作簿
E. Sheets("汇总") 代表“汇总”工作表
F. Sheet1表示第一个插入的工作表,Sheet2表示第二个插入的工作表.......
G. Sheets(i) 表示按排列顺序,第i个工作表
H. ActiveSheet 表示当前活动工作表
I. Worksheet 也表示工作表,但不包括图表工作表、宏工作表等。
J. Cells 所有单元格
K. Range ("单元格地址")
L. Cells(行数,列数)
M. Activecell 当前选中的单元格
N. Selection 被选中的单元格或者单元格区域
30.变量强制声明
A. 变明使用前声明是一个好习惯,但我们会忘记,怎么办呢
B. 方法一 Alt+F11——>>工具菜单——>>选项——>>编辑器选项卡中——>>勾起“要求变量声明”复选框
C. 方法二 在代码模块顶端输入 Option Explicit
31.变更作用域
A. 过程变量:定义变量是写在过程中的,其作用是在过程运行中,当过程结束变量也就销毁了。
B. 模块级变量:定义变量写在模块的顶端,在此模块中可以调用此变量,其值还是存在,别的模块就不行了
C. 全局性变量 也是定义变量写在模块的顶端,不过就不是用Dim来定义了,要用Public,这个变量就在所有的模块都可以调用,也就是这个变量值一直存在,直到把Excel程序关闭,变量值才会销毁。
32. &符号的两端没有空格会造成语法错误
33.Range("a1").Select报错"类range的select方法无效"
1. 在代码行 “Sheets(1).Range("A1").Select ”
之前加下面这个语句
Sheets(1).activate
回答:选择单元格前要激活所在工作表
2. Sheets(1).Range("A1").Select 改为 application.goto Sheets(1).Range("A1")
回答:激活工作表和选择单元格在同一语句完成
34.重定义动态数组时,要想保持数组中原有的数据,只能修改最后一维的维数
35.currentregion只的是连续单元格组成的矩形区域,除了边界的单元格,一般单元格有8个相邻单元格,(下图中红线区域)
usedrange是当前工作表已经使用的单元格组成的矩形区域,设置格式也属于已经使用(下图中的兰线区域)
这两个区域有时相同,有时不同,本图中,二者结果不同的原因在于黄色区域是空白的