一个最基本的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的更多相关文章

  1. C#研究OpenXML之路(3-OpenXMLSDKToolV25.msi)

    一.OpenXMLSDKToolV25.msi 看了几天的OpenXml,感觉如果完全手写代码,将会是一件非常苦逼的事情,即要分析对应xlsx文件层次结构,以及包含的xml文件的xml标签结构,还要关 ...

  2. VBA取得EXCEL表格中的行数和列数

    VBA取得EXCEL表格中的行数和列数 初学EXCEL宏的童鞋,总是很想知道表格中含有数据的行数和列数,尤其是行数和列数不确定的情况下.这样可以避免很多的错误,并且可以提高效率.但每次用到的时候到网上 ...

  3. Office EXCEL VBA如何取得EXCEL中的行数和列数

    VBA取得EXCEL表格中的行数和列数 请注意不要使用Columus等关键字作为变量,例如"Columus = ActiveSheet.UsedRange.Columns.Count&quo ...

  4. 什么是VBA,他有什么作用

    目录 什么是VBA,它有什么作用 VBA在哪里存放的?怎么运行的 什么是宏?宏和VBA有什么关系? 录制一个宏 编写第一个宏 一.什么是VBA,它有什么作用 VBA是一种编程语言,它依托于Office ...

  5. DDD初学指南

    去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...

  6. gulp初学

    原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js  配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...

  7. 初学seaJs模块化开发,利用grunt打包,减少http请求

    原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...

  8. VBA 格式化字符串 - Format大全

    VBA 格式化字符串 VBA 的 Format 函数与工作表函数 TEXT 用法基本相同,但功能更加强大,许多格式只能用于VBA 的 Format 函数,而不能用于工作表函数 TEXT ,以下是本人归 ...

  9. 初学Vue2.0--基础篇

    概述: 鉴于本人初学,使用的编译器是webStorm,需添加对VUE的支持,添加方法可以参考 http://www.jianshu.com/p/142dae4f8b51. 起步: 1. 扎实的 Jav ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:QTableView的gridStyle属性

    老猿Python博文目录 老猿Python博客地址 概述 gridStyle属性用于控制视图数据网格的样式,此属性只有在showGrid属性为True时才有作用. gridStyle属性取值含义 gr ...

  2. [BJDCTF2020]ZJCTF,不过如此 php伪协议, preg_replace() 函数/e模式

    转自https://www.cnblogs.com/gaonuoqi/p/12499623.html 题目给了源码 <?php error_reporting(0); $text = $_GET ...

  3. C# Email 帮助类 EmailHelper

    1. 配置文件 App.config <?xml version="1.0" encoding="utf-8" ?> <configurati ...

  4. 对网页接口的追踪探索(以b站通过bv号查询av号为例

    对网页接口的追踪探索(以b站通过bv号查询av号为例 序言 本文只提供一种探索网页加载时后端访问接口情况的思路,所举例子没有太大实际用处. 一 自2020年3月23日起,AV号将全面升级到BV号.但是 ...

  5. windows安装程序无法将windows配置为在此计算机上运行

    ----------------------------------------------- 解决办法: 当出现如上提示的时候,按下shift+f10 会打开命令窗口,进入到C:\windows\s ...

  6. Linux相关介绍和安装

    目录 前言 第一章 linux介绍 1.1 linux简介 第二章 Linux起源 2.1 Unix的历史 2.2 Unix操作系统的革命 2.3 Linux系统的诞生 2.4 Linux系统的发展史 ...

  7. VMware Workstation 16中安装macOS Big Sur,AMD版

    VMware Workstation 16中安装macOS Big Sur,AMD版 目录 VMware Workstation 16中安装macOS Big Sur,AMD版 准备阶段 步骤一:安装 ...

  8. Java 8 新特性:Lambda、Stream和日期处理

    1. Lambda 简介   Lambda表达式(Lambda Expression)是匿名函数,Lambda表达式基于数学中的λ演算得名,对应于其中的Lambda抽象(Lambda Abstract ...

  9. 图解Janusgraph系列-图数据底层序列化源码分析(Data Serialize)

    图解Janusgraph系列-图数据底层序列化源码分析(Data Serialize) 大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 整理所有图相关文章,请移步 ...

  10. create-react-app 基于TS的项目

    写在前面 最近在用React,发现百度了很多都没有找到基于TS的React项目搭建,很多是老的方法已经属于不成功的了,今天我把最新的搭建基于ts的React的项目分享出来 create-react-a ...