初学VBA
一个最基本的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
初学VBA的更多相关文章
- C#研究OpenXML之路(3-OpenXMLSDKToolV25.msi)
一.OpenXMLSDKToolV25.msi 看了几天的OpenXml,感觉如果完全手写代码,将会是一件非常苦逼的事情,即要分析对应xlsx文件层次结构,以及包含的xml文件的xml标签结构,还要关 ...
- VBA取得EXCEL表格中的行数和列数
VBA取得EXCEL表格中的行数和列数 初学EXCEL宏的童鞋,总是很想知道表格中含有数据的行数和列数,尤其是行数和列数不确定的情况下.这样可以避免很多的错误,并且可以提高效率.但每次用到的时候到网上 ...
- Office EXCEL VBA如何取得EXCEL中的行数和列数
VBA取得EXCEL表格中的行数和列数 请注意不要使用Columus等关键字作为变量,例如"Columus = ActiveSheet.UsedRange.Columns.Count&quo ...
- 什么是VBA,他有什么作用
目录 什么是VBA,它有什么作用 VBA在哪里存放的?怎么运行的 什么是宏?宏和VBA有什么关系? 录制一个宏 编写第一个宏 一.什么是VBA,它有什么作用 VBA是一种编程语言,它依托于Office ...
- DDD初学指南
去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...
- gulp初学
原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js 配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...
- 初学seaJs模块化开发,利用grunt打包,减少http请求
原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...
- VBA 格式化字符串 - Format大全
VBA 格式化字符串 VBA 的 Format 函数与工作表函数 TEXT 用法基本相同,但功能更加强大,许多格式只能用于VBA 的 Format 函数,而不能用于工作表函数 TEXT ,以下是本人归 ...
- 初学Vue2.0--基础篇
概述: 鉴于本人初学,使用的编译器是webStorm,需添加对VUE的支持,添加方法可以参考 http://www.jianshu.com/p/142dae4f8b51. 起步: 1. 扎实的 Jav ...
随机推荐
- PyQt(Python+Qt)学习随笔:Qt Designer中spacer部件的orientation属性
在Designer的spacers部件中有2个部件,分别是Horizontal Spacer和Vertical Spacer,这两个部件都有orientation属性,表示Spacer部件的方向. 如 ...
- 再次学习sql注入
爆所有数据库 select schema_name from information_schema.schemata 先爆出多少个字段 id = 1 order by ?; mysql5.0及以上 都 ...
- 区块链产业发展热潮来袭,Panda Global 认为体验、安全是关键词
作为一项近些年才发展起来的新型技术,区块链自诞生之日起就备受关注,凭着去中心化.不可篡改.信息透明等多种关键特点,已成为变革传统产业的一项有力创新手段.当区块链热潮再度袭来之时,知名数字货币交易所Pa ...
- c++笔试题3
一.[阿里C++面试题]1.如何初始化一个指针数组.答案: 错题解析:首先明确一个概念,就是指向数组的指针,和存放指针的数组. 指向数组的指针:char (*array)[5];含义是一个指向存放5个 ...
- Notepad++ 使用步骤,熟练掌握notepad++的使用技巧,无疑会大大提升专业技能。以及快捷键操作
官方下载地址: https://notepad-plus.en.softonic.com/ 1.安装 双击安装包出现以下界面 2.点击我接受 3.安装地址 继续下一步 4.默认即可,继续下一步 5.根 ...
- 宝塔linux面板防护CC设置
使用宝塔linux面板很多用户受到CC攻击不知如何防范. 下面讲下如何利用宝塔自带的功能来进行基本的CC防护. 首先是在nginx上有个waf安全模块,里面有CC防护设置.(要求nginx为1.12版 ...
- 八、TestNG忽略测试
一个TestNG 测试类中如果有的方法不想测试可以使用 enabled 属性 enabled = false 该方法不参与测试 enabled = true 该方法参与测试 @Test 不写en ...
- 三、Jmeter发送请求
Jmeter的使用例子,发送一个get请求 1.打开Jmeter,选中Test Plan右键 选择 "添加"--"线程(用户)"--"线程组" ...
- jmeter接口测试笔记
1.接口测试基础 API:Application Programming Interface,即调用应用程序的通道. 接口测试遵循点 接口的功能性实现:检查接口返回的数据与预期结果的一致性. 测试接口 ...
- Greenplum 性能优化之路 --(二)存储格式
一.存储格式介绍 Greenplum(以下简称 GP)有2种存储格式,Heap 表和 AO 表(AORO 表,AOCO 表). Heap 表:这种存储格式是从 PostgreSQL 继承而来的,目前是 ...