初学VBA
山水有相逢 人气:0一个最基本的VBA程序
Sub test() //宏开始 Dim ge As Range //定义变量 For Each ge In Range("a1:a10") //从a1到a10遍历 ge = 1//对每个单元格进行赋值 Next//循环结束标志 End Sub//宏结束标志
基本语法:(对VBA来说,没有大小写之分,一律认为是小写,保留字等会在写完之后自动改变大小写)
1.判断:
if (判断条件,例:i = 1)Then
(判断成立后执行)
ElseIf (判断条件,例i=3) Then
(判断成立后执行)
Else
(以上全不成立时执行)
End if
2.循环:
a.for循环:(相当于java里的for循环)
for (初始值,例:i=1) to (循环结束条件,例:i=5)step (步长,可不写,例:2,相当于for循环中的i+=2)
(循环运行代码)
next
b.for each循环:(相当于while循环,一般是遍历时使用)
for each (变量,例:ge(变量定义在dim里,如:dim ge as Range)) in (遍历范围,例:Range("a1:a10"))
(循环运行代码)
next
3.with语句:
(大概类似于css里的style属性吧)
with (单元格或表或其他属性的设置,例:sheet1(表1)/cells(所有单元格))
(对于单元格等其他的设置,例:.Range("a1")=1 .Range("a3")=5(注意前面有点))
end with
4.对文件操作:
a.打开一个文件:
Workbooks.Open Filename:="(文件路径,例:C:\Users\zhengww\Desktop\MoveRule.xlsx)"(注意在等号之前有和冒号)
b.对当前打开文件进行操作:
ActiveWorkbook.Sheets(1).Range("a1") = "2222"(将当前文件的sheet1的单元格a1赋值为2222)
c.保存文件:
ActiveWorkbook.Save
ActiveWorkbook.SaveAs Filename:="(文件路径,例:C:\Users\zhengww\Desktop\MoveRule.xlsx)" (相当与另存为)
d.关闭文件:
ActiveWorkbook.Close
e.新建文件:
Workbooks.Add
5.Dir函数:
a.验证文件是否存在:
Dir((文件的路径,例:"C:\Users\zhengww\Desktop\MoveRule.xlsx")) (若该文件存在,返回值为文件名,若不存在,则返回空值,支持通配符*,类似正则)
在使用通配符时,若存在多个文件符合的,第二个接受时可不带参数,直到没有文件符合时,会返回空值,若再写,则程序出错
//如存在文件MoveRule.xls和MoveRule.xlsx两个文件 Sub test() //会返回MoveRule.xls(根据文件的先后顺序) Range("a1") = Dir("C:\Users\zhengww\Desktop\MoveRule.xls*") //返回MoveRule.xlsx Range("a2") = Dir //返回空值 Range("a3") = Dir End Sub
6.数组:
a.数组的定义:
dim arr() (不固定大小,一般将区域赋值给数组)
dim arr(1 to 4) (表示数组大小是4,是将数值赋值给数组)
b.数组的使用:
存值:arr=Range("a1:d9") (表示将单元格a1到d9里所 有的值赋给数组)
取值:Range("a12")=arr(5,1) (相当于一个二维数组)
c.数组的范围:
数组的上限:UBound(arr) (返回值为数组结束下标)
数组的下限:LBound(arr) (返回值为数组开始的下标)
7.单元格的常用操作:
a.单元格的引用方式:
以下都表示单元格a10,[a10](里面只能用固定的值,不能用定义的变量)、
cells(10,1) (两个值都可以是变量,前面表示列,后为行),
range("a10")(只有后一个值为变量,前一个不能为变量),range("a10").value(带value表示单元格的值,默认情况下不带时也表示单元格的值)
b.单元格的相对引用:
range("a1").offset(0,-1)(表示单元格a1左边的单元格),
Range("a65536").End (xlUp(上边界)\xlDown(下边界)\xltoLeft(右边界)\xltoRight(左边界)),(通常用来表示计算使用多少单元格,
例:Range("a65536".)End (xlUp),a65536表示以后缀xls结束的文件最长有65536行,这句话就表示最后一行的上边界,即有值的地方,若遍历时,就可以遍历全部有值的单元格)
c.扩散单元格的范围:
range("a1").resize(1,4).select (表示以单元格a1为头,扩散为四行一列并选中)
Range("a1").EntireRow.select (表示选择单元格a1所在的整行)
d.单元格的复制:
range("h7:l7").copy range("n7") (表示单元格h7到n7复制到n7及之后的位置,但需要能放得下)
e.单元格的合并:
Range("a1:a2").Merge (表示合并单元格a1和a2)\
f.单元格的查找:
Range("(查找范围,例:d:d)").Find("(查找的内容,例:Name)") (其返回值是一个单元格,即可以使用单元格的属性)
g.单元格的清空:
Range("a1").ClearContents (将单元格a1的内容清空)
8.对sheet的操作:
a.对表的筛选:
sheets(1).range("(筛选范围,例:a1:f1048)").AutoFilter field = (列号,例:4,即表示以第四列筛选), criterial:=(筛选的值,例:"1111",表示第四列等于"1111"时的所有数据)
b.新建表:
sheets.add after := Sheets(sheets.count) (在表的最后面新建表(即新建sheet))
9.事件的处理:
a.建立事件程序:(在VBA编辑界面,点击要执行事件的表(sheet)或工作簿(ThisWorkbook),将上面的(General)改为Worksheet,在他的右边可以设置事件类型,如选区变化时执行等等)
(注意:需要让excel表打开,不是最小化,最小化可能点击表格时无效)
b.事件类型:
Change(表中任一单元格内容被改变时触发)
SelectionChange(表示选取发生改变)
Active(当前表被激活,即为点击表,该表变为当前工作表)
c.常用事件函数:
ActiveWorkbook.RefreshAll (刷新全部内容)
d.保存副本:
点击BeforeSave事件,利用SaveCopyAs "(保存路径地址,例:C:\data)" (工作簿才有的事件类型,一般用于备份文档,只是将保存的文件备份到其他地址,不影响当前改的文档)
10. 控件
a. 插入控件的方式:在开发模式工具栏中,点击插入,可以看到两列可插入的控件,选择ActiveX下的控件插入,写事件时可以和9相似,找到在那个表里添加的控件
b. 控件的一些属性:
Sheets(1).CommandButton1.Caption (可以更改控件按钮上的文字,也可以得到控件按钮上的文字)
Sheets(1).OptionButton4.Visible = False(隐藏控件,此为单选控件,其他控件类似)
下拉框添加内容:ComboBox1.AddItem "昆山";
//根据TextBox1输入的内容联想表格sheets(1)里a栏的内容,在输入四个以上字符时开始查找,
//如果有则让文本栏中出现所有的含有输入字符的内容,
//如果没有则不显示文本栏,每次改变TextBox1就会自动运行这个事件
Private Sub TextBox1_Change() Dim i As Integer Me.ListBox1.Clear//清空文本栏 Me.ListBox1.Visible = False//隐藏文本栏 If Len(Me.TextBox1) > 3 Then//当当前输入的字符大于3个时才会开始查找 For i = 1 To 7 If InStr(Sheets(1).Range("a" & i), Me.TextBox1.Value) Then//匹配输入字符 Me.ListBox1.AddItem Sheets(1).Range("a" & i)//将符合条件的添加到文本栏中 End If Next End If If Me.ListBox1.ListCount Then Me.ListBox1.Visible = True//当文本栏里有内容时,显示文本栏 End If End Sub
c. 界面布置:
ca.创建方式:与之前插入模块类似,点击插入窗口,即可开始编写窗口;窗口打开时,禁止点击下层的方法:将属性ShowModal改为false
cb.关于界面设置的一些方法:
cba. 隐藏excal表格,只显示窗口:Application.Visible = False隐藏某个表:Sheets(2).Visible = False或者Sheets(2).Visible = xlSheetHidden,显示某个表:Sheets(2).Visible = true或者Sheets(2).Visible = xlSheetVisible
cbb. 关闭excel表格: Application.Exit
cbc. 在打开excel工作簿时打开窗口:在thisworkbook里的open事件写 UserForm1(窗口的名字).Show
cbd. 解开被保护的表:Sheets(2).Unprotect "test" ; 开启保护的表:Sheets(2).Protect "test"
cbe. 输入框TextBox设置成输入类似于输入密码的设置方式,在属性PasswordChar 改为 " * "
11.常用的一些小方法:
a. 关闭excel里删除表格时要点确认:Application.DisplayAlerts = False(打开时将值改为true)
b. 关闭屏幕更新:Application.ScreenUpdating = False(打开时将值改为true,因为打开文件关闭文件时,会出现屏幕闪烁的问题,关闭屏幕更新就能解决这个问题)
c. 选中某个单元格:Range("a1").select
d. 删除某个单元格:Range("a1").delete(删除单元格或者删除sheet时,切记要从后向前删或者其他方法,因为若将单元格a1删除,之前的a2将变成a1)
e. 恢复筛选前或开始筛选状态:sheet1.range("a1:f1048").AutoFilter
f. 弹出框的使用:msgbox "(弹出文字,例:hello!)"'
以下为可选属性:
使用方法: i=MsgBox("你好吗?",1+48) (表示弹出框里的文字是"你好吗?",弹出框的样式是带有是和否两个按钮,带有警示图标,i可以接收用户点击是或否的按钮,返回值为6或7,i也可不写)
g. 输入框:InputBox "(输入文字,例:hello!)",可直接定义变量接收,
例:Dim i As Integer
i = InputBox("hello?")
h. 将一个对象赋值给另一个对象,需要使用set
例:(新建一个sheet)
Sub test() Dim s As Worksheet Set s = Sheets.Add s.Name = "Name" End Sub
i. 循环退出:Exit For ,结束程序 Exit Sub
j. 截取字符串函数split("(字符串,例:Name.xlsx)","(截取标志,例:.)")(0) (表示Name.xlsx以.截取,要第一段Name)
k. 对象判空方式:
Sub test() Dim rng As Range If (Not) rng Is Nothing Then//判断单元格是否为空值,若加上Not表示不为空时 End If End Sub
l. 查找数组里的最大值:Range("a1").Application.WorksheetFunction.Max (arr) (arr是一个数组)
m. 以值查找数组下标,返回第一个为该值的下标:
Range("c1")=Application.WorksheetFunction.Match((查找的值,例:Range("a4")), (从该数组中查找,例:arr), (查找到该值第几次出现,0就是第一次出现的位置,例:0))
n. 使用函数时,类似于C语言中的 函数名(),利用call 关键字,例:call (函数名,例:gys(gys是函数名,也就是sub gys() end sub))
o. 停止事件响应:Application.EnableEvents = False (一般用于change事件时,单元格一旦改变就会引发change事件,打开时改为true)
p. 获得当前时间函数:Now();修改时间的格式:Format(Now(), "(时间的格式,例:yyyy-mm-dd hh:mm:ss)")
q. 计算指定表格的总数:
计算非空表格的总数:Application.WorksheetFunction.CountA ((表格的范围,例:Range("a:a"))) (可简写时去掉Application)
计算指定内容表格的总数:Range("d1") = Application.WorksheetFunction.CountIf((计算的范围,例:Range("a:a")),(指定查找的内容,例:"1"))
r. 查询表:
在某张表中查找对应的单元格Range("c1")= Application.WorksheetFunction.VLookup((要查找的东西,例:sheet1.Range("a1")),(查找的范围,例:sheet2.Range("a:h")),(从这一列得到对于的值,例:5),(是否精确查找,例:0))
Sub test()//在二表中查找一表a2值所对应的列,返回二表第二列对于的值,精确查找 Range("c1") = Application
.WorksheetFunction.VLookup(Sheets(1).Range("a2"), Sheets(2).Range("a:b"), 2, 0) End Sub
s. 错误回避:On Error Resume Next (代码出错时,一般用于会返回空值时,代码运行中断,使用这句话遇见错误不会中断代码,跳过运行下一句话)
t. 判断一个没有定义的变量类型的变量是否为数字类型:VBA.Information.IsNumeric ((定义的变量,例:a)) (返回值为false或true,可简写为IsNumeric())
u. 将变量转化为数字型变量:a=val(a),也可以写为a=a*1
v. 查找文本里的某个字符所在的位置:
Range("c1") = VBA.Strings.InStr((查找单元格的内容,例:Range("b1")),(要在Range("b1")中查找的字符位置,例:"@"))
Range("d1") = Application.WorksheetFunction.Find((要查找的字符,例:"@"), (查找单元格的内容,例:Range("b1")))
w. 支持函数的写法:
Function test()//可带参,可不带参,在sub里可以直接调用 End Function
-------------------------
//带有返回值的写法
Sub zimu()//主程序
For i = 1 To 6
Range("c" & i) = test(Range("a" & i))
Next
End Sub
Function test(str As String)//处理函数
If str = "1" Then
test = "A"//返回值的写法
Else
test = "B"
End If
End Function
x.单元格内容的长度:len((单元格,例:Range("a1"))) (返回值为整数)
y.
易错点:
a.选择某个excel里的某个sheet里面的某个单元格进行操作时,不能直接写Sheets(j).Range("a1").Select,必须先选中sheet,即先写Sheets(j).Select
b.定义sheet时,要用Dim she As Worksheet
加载全部内容