一个最基本的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

最新文章

  1. 从display:run-in;中学习新技能
  2. BZOJ3438 小M的作物(最小割)
  3. C# 工作中遇到的几个问题
  4. 复旦大学2015--2016学年第二学期高等代数II期末考试情况分析
  5. 自定义getElementByClass
  6. LeetCode126:Word Ladder
  7. error C3163: “_vsnprintf”: 属性与以前的声明不一致
  8. StringUtils判断字符串是否为空的方法
  9. 安装centos 7 体验安装过程
  10. 宏ut_2pow_remainder
  11. Palindrome
  12. 蓝牙芯片NRF51822入门学习1:时间管理
  13. jQuery 事件——关于select选中
  14. Spring两种代理区别
  15. TP框架Ajax如何使用
  16. css控制元素高度自适应
  17. Sprite子节点透明度不能跟随父节点变化的问题求解(转)
  18. Linux内核 实践二
  19. ThreadPoolExecutor线程池的分析和使用
  20. eclipse格式化代码样式

热门文章

  1. windows+jenkins+iis 部署
  2. Scrum冲刺_Day06
  3. MySQL日期和时间函数汇总
  4. CF1320 Div1 D.Reachable Strings 题解
  5. 【WC2014】紫荆花之恋(替罪羊重构点分树 & 平衡树)
  6. 【MySQL】Novicat 连接mysql 报错1251的问题处理,Novicat12 破解方法
  7. Fastjson 1.2.47 远程命令执行漏洞复现
  8. Bug java 安全证书
  9. vue第十八单元(单向数据流 vuex状态管理)
  10. k8s之深入解剖Pod(二)