基础知识预览
if 语句
-
注意结合 and 和 or
句式1
if con1 then pass elseif con2 then pass elseif con3 then pass elses pass end if
句式2
if con then pass else pass end if
句式3+句式4
if con1 then result1 if con1 then result_Y else result_false
for循环
-
注意和 step 调整步长;
-
注意 exit for 可以结束循环;
句式1 for i = 1 to 2 step 2 pass next
句式2 for i= 20 to 1 step -1 pass next
句式3 for each rng in range("a1:a100") pass next
工作簿
-
注意常用的方法;open, save , saveas, close
dim sht as worksheet 注意,只有声明了变量之后加点才会有对应的提示方法出来;
-
注意关闭刷新和警告,最后需要开启;
application.screenupdating = False 关闭屏幕刷新;
application.displayalert = False 关闭警告提示;
application.screenupdating = True 开启屏幕刷新;
application.displayalert = True 开启警告提示;示例:
sub test()
application.screenupdating = False
application.displayalter = False
workboks.open filename:= "d:\123.xlsx"
activeworkbook.sheets(1).range(“a1”) = "到此一游"
activeworkbook.save
activeworkbook.close
application.screenupdating = True
application.displayalter = True
end sub
工作表
-
搞清楚 对象,属性 ,方法
对象是 工作簿,工作表,单元格,变量需要用set赋值;
属性就是本身自由的特性,例如 名称,颜色;
方法 就是可以针对对象做的动作; add, close, move;
-
常用的方法属性:
-
after/before
-
count
-
select
-
delete
-
copy
-
name
-
示例
sub 一表拆多文件()
dim sht as worksheet
for each sht in sheets
sht.copy '利用copy的方法特性,直接复制成独立的表格
activewokrbooks.saveas filename:= "d:\data\" & sht.name & ".xlsx"
activeworkbook.close
next
end sub
单元格
单元格表示
[a10] -- 不支持变量
cells(10,1)
range("a10")
range("a10").value 一般情况默认.value, 如果没有定义变量,直接引用的话不会默认,因为系统不能识别具体类型;
range("a1").offset(10,0)
range("a10").end(xlup)
range("a10").entirerow
range("a10").resize(1,10)
range("a10").copy
注意日常应用的知识点:
-
call + 过程名 调用另一个过程;
-
msgbox "你好" -- 弹出引号中的内容,作为提示;
-
inputbox, 如果不赋值给变量,就直接用 inputbox "" , 如果赋值给变量要添加括号 i= inputbox("请输入内容")
-
批量建表时候,回避表 重名的问题;
-
批量粘贴时,考虑用筛选然后粘贴;
sub test()
ActiveSheet.Range("$A$1:$B$3").AutoFilter Field:=1, Criteria1:="加拿大"
Selection.AutoFilter '取消筛选
end sub
拆分单元格注意事项:
-
输入i 列拆分i列;
-
避免重名,先把无意义的表格删除。注意停止删除警告,删除完成后恢复;
-
根据列拆分单元格;注意用cells(l,i)代替 range()
-
筛选,复制,粘贴;
程序事件
工作簿事件--thisworkbook
工作表事件--在对应的sheets中添加;
程序事件,可以在事件过程中直接写代码;也可以在标准模块中写好代码,然后通过call 调取过程;
公式
instr() - num = instr(abc,"D") 有返回索引,没有返回0;
split()
on error resume next 遇到错误跳过继续执行;
isnumeric() 是否是数字
val() 返回包含于字符串内的数字,字符串中是一个适当类型的数值。
引用公式有两种方式:引用Excel自带的公式,引用vba函数
-
引用Excel自带的公式:
application.workfunction.函数名;
-
引用vba函数;
vba.函数 或者 vba.可以省略
-
自定义函数
function 函数名(参数)
函数名 = (代码过程)
end function
注意:
自定义函数必须在标准模块中;
自定义函数可以再excel中直接调用,也可以再sub过程中直接调用;
在工作表中调用vba函数,可以把vba函数添加进参数自定义函数中,然后调用;
function jqzf(str1,str2,i)
jqzf = split(str1,str2)(i-1)
end function
带参数的过程,需要被调用才能执行;
带参数的函数,需要给函数传入值才能调用;
加载宏
加载宏设置4步骤:(写入代码,放入加载库中,打钩,放入快速访问工具栏)
-
编辑好代码;
-
新建空白excel,把代码拷贝至该文件的标准模块中,另存为 加载宏的 .xla 加载宏 .xlam
-
开发工具--加载宏--在刚才保存的文件名钱打钩;
-
关闭工作表,然后重新打开。 文件--选项--快速访问工具栏--下拉框 宏--添加到快速访问工具栏即可;
将对象赋值到变量
利用set, 将 工作簿、工作表、单元格赋值到变量;
dir函数验证是否存在某个文件;多值符合时候,取值如下;
str=dir() --第一次取值;
str=dir 第二次取值,取到的是匹配的第二个值;
日常用的场景:多文件合并; 多个文件每个文件一张表; 多个文件,每个文件若干个表; 合并后命名;
sub shshi()
dim str1 as string
dim wb as workbook
str1 = dir("d:\工作项目\*.xlsx")
for i = 1 to 100
if str1="" then
exit for
end if
set wb = workbooks.open("d:\工作项目\" & str1)
"该干啥干啥;"
wb.close
str1 = dir
next
end sub
数组
涉及内容:
-
什么是数组;
-
如何定义数组;
-
动态数组和静态数组;
-
计算数组的大小lbound和ubound
-
重新定义数组 redim [preserve] arr(10)
如何把区域赋值给数组--不用定义大小,直接赋值; arr = range("a1:a10")
数组的维度;
给数组赋值和取值;
把表格横着的一维区域放到数组中得到的是二位数组;
dim arr()
range("a1") = arr(2,1)
arr = range("a1:a10") --把区域赋值给数组;
dim arr(10,2) --定义数组
ubound(arr) 和 lbound(arr) --数组上标和下标
redim [preserve] arr(10) --重新定义数组
使用数组的优势--效率高,节省时间
timer 取时间
goto 100 分支流程
控件
控件是 表格中的控件
按钮 commandbutton: enabled, caption,visible
标签 Lable: enabled,caption,visible
单选按钮 optionbutton: caption, enabled, groupname,value,visible
微调按钮 spinbutton: enabled, value, visible,min, max 通过写入 change 事件写入
所有的东西组合在一起,一定要注意逻辑的缜密;
窗体
通用属性
enabled
caption
visiable
showmodal
show
hide
文本框 textbox: enabled, value, visiable, passwordchar, tabindex
复选框 checkbox: enabled, value, visiable,
list数据源列表;
additem ,添加一个下拉项目
removeitem, 移除一个项目;
clear,清空列表;
列表框控件 listbox: enabled, value, visible ,
columncount 列,
list 数据源列表;
additem ,添加一个下拉项目
removeitem, 移除一个项目;
clear,清空列表;
用户信息交互
msgbox
msgbox(提示文字,按钮类型,标题文字,帮助文件,帮助文件索引)
有返回值,对应的按钮类型;
inputbox
application.inputbox --可以自行选择单元格
inputbox(提示文字,标题文字,默认值,左边距,上边距,帮助文件,帮助文件索引,输入类型)
application.getopenfilename
application.getopenfilename("Excel文件,*.xls*")
application.getopenfilename("Excel文件,*.xls*,word,*.html",1,"快特么的选",”确定“,False)
application.getopenfilename("类型1名,.后缀,类型2名,.2后缀",用数字表示哪个值作为默认值,标题,”“,是否多选)
getopenfilename 选择后返回文件完整路径,如果是多选,得到的返回值是所有路径的数组,而且下标是从1开始的;循环遍历操作对应的文档;
操作excel中所有的对话框 application.dialogs
ADO通道
四步走:
-
添加工具: 工具-引用- Microsoft ActiveX Data Objects 6.1 library
-
创建连接,并打开数据库
dim conn as new ADODB.Connetion
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:\123.xlsx;Extended Properties=""excel 12.0;HDR=YES""" -
增删改查;
sql = "select * from [Sheets$]"
range("a1").copyFromRecordset conn.Execute(sql) -
关闭
conn.close
代码示例:
sub test()
' 工具-引用- Microsoft ActiveX Data Objects 6.1 library
dim conn as new ADODB.Connection
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:\123.xlsx;Extended Properties=""excel 12.0;HDR=YES"""
sql = "select * from [Sheets$]"
range("a1").copyFromRecordset conn.Execute(sql)
conn.close
end sub
思路:
可以把查询结果放到表格中;
可以把查询结果放到数组中;
知识点:
-
excel 文件,必须要添加扩展代码;extended properties="excel 12.0;HDR=YES" ,其他的文件不需要
-
只有excel文件中的表格需要添加美元符合; 其他不需要;
-
在excel中无法执行删除语句 delete; 其他文件可以;
-
注意vba 中多重引号的添加: msgbox "一个叫““张三””的人"
关于shape大家族
图形,图片,表单控件;
shapes 依存于sheet ,所以shapes 句柄要有sheet作为依附;
sheet3.range("a" & i ) = shp.name
sheet3.range("b" & i ) = shp.type
sheet3.range(“C” & i ) = shp.topleftcell.address
根据姓名插入图片
shp.addpicture "name",msoCTrue,msoFalse,20,20,400,400
当对象赋值变量的时候,这个后边的参数需要用括号括起来,并且变量的前面要加 set;
set shp1 = shp.addpicture("name",msoctrue,msofalse,20,20,400,400)
重命名文件 name 文件路径+名称 as 文件路径+名称;
name "c:\123.xlsx" as "c:\新建文件夹\456.xlsx"
like+通配符
*,任意字符;
?,一位字符;
#,表示任意数字;
!, 表示非逻辑;
[A-Z],表示大写字母中的任意一位;
[A-Za-z],任意字母;
[0-9],数字;
[!A-Z]非大写字母;
[!0-9]非数字;
触类旁通
private sub--私有过程,可以再内部跨过程调用;
public sub --共有过程,默认的;可以跨模块调用;
public i 慎用,可以用自定义函数调用来取代;
类模块的理解;
类模块.方法
类模块.属性
public property get fadg() as variant
end property
do while 条件
loop
学习vba的三靠
靠帮助;
靠录制宏;
靠猜测;
字典
sub test()
set dict1 = createobject("scripting.dictionary")
dict1("szd") = 1'赋值,更改;
dict1("szd2") = 2
dict1("szd3") = 3
a = dict1.keys '调用keys数组;
b = dict1.items '调用items数组
dict1.remove("szd3") '移除
end sub
正则表达式
sub test()
set regex = createobject("vbscript.regexp")
abc = "szdgadgadadgakg啊拿冠军阿214嘎435啦果aga"
regex.global = True
regex.pattern = "\d"
set abt = regex.execute(abc)
a = abt.count
b = abt.item(0)
end sub
with简化;
sub test()
set regex = createobject("vbscript.regexp")
with regex
.global = True
.pattern = "\d"
end with
abc = "szdgadgadadgakg啊拿冠军阿214嘎435啦果aga"
set abt = regex.execute(abc)
a = abt.count
b = abt.item(0)
end sub
取指定字符串中间的部分
sub 固定字符串中间的部分()
dim str1 as string
set regex = createobject("vbscript.regexp")
str1 = "sagja gagagalkgjag 案件刚刚 agaklgjag 爱干净啊 gagja gljaglakjgaljg 2325h"
with regex
.global = True
.pattern = "sagja gagagalkgjag (.*?) agaklgjag 爱干净(.*?) gja gljagla(.*?) jg 2325h"
end with
set ttt = regex.execute(str1)
ttter = ttt(0).submathes(1)
end sub
标签:end,sub,--,基础知识,application,range,内容,数组 From: https://www.cnblogs.com/szd001/p/18395414