• VBA常用代码

    定义变量

    注意:变量为工作薄和工作表时必须使用set

    条件语句

    1.单条件

    (1)单行写法 (后面将省去首尾两句)

    使用函数: iif(条件, 真, 假)

    (2)多行写法

    2.多条件

    (1)if ... else if ... else if ... end if

    (2)Select Case ... case Is ... End Select

     

    循环语句

    For ... Next

    For Each ... Next

    Do While ... Loop

    Do ... Loop While

    While ... Wend

    Union(区域1,区域2,.....)联合区域

    结束、终止程序

    1. 终止程序(END)

    End语句可以单独使用,也可以结合部分控制关键字使用,如Function、If、Select、Sub、With等。End语句用于立即结束一个过程或者块,它提供了一种强制中止程序或结束语句块的方法。

    2.退出、跳出(EXIT)

    Exit语句用于强制退出Do-Loop、For、Function函数、Sub过程或者Property等代码块,该语句只有结合其他关键字才可发挥作用。

    (1)For循环的退出

    如果是For to 结构的循环,同样使用Exit For语句来退出。

    (2)Do 或 Do While语句的退出

    (3)退出Sub过程

    (4)退出函数Fuction

    (5)结束本次或跳过

    VBA中没有continue和break,循环的终止通过exit do或exit for实现

    如果仅仅跳出该次循环的话,建议用goto加行号跳转,或者if else 判断的时候不写执行内容实现跳过循环。

    With语句

    重复代码部分的简写

     

    GoTo 语句

    1.基本用法

    GoTo XXX标签

    (1)XXXX参数可以是任意的行标签或行号。

    (2)GoTo 只能跳到它本身所在过程中的行,不能跳转到其它Sub过程中去。

    2. On...GoSub / On...GoTo

    获得错误码代号(数字): Err.number

     

    字典

    1.定义

    2.方法

    字典有6个成员方法:Add、Exists、Keys、Items、Remove、RemoveAll

    (1)添加内容

    (2)d.Exists(key)

    判断键是否存在于字典中;如果存在,返回True,否则返回False。

    (3)d.Keys()

    获取字典所有的键,返回类型是一维数组(数组下标从0开始)

    字典使用for each next结构进行遍历时,返回的是key

    For Each di In d 也可以写成For Each di In d.keys

    (4)d.Items()

    获取字典所有的值,返回类型是一维数组

    (5)d.Remove(key)

    从字典中移除一个条目,是通过键来指定的。如果指定的键不存在,会发生错误。

    (6)d.RemoveAll

    清空字典

    3.属性

    字典有4个属性:Count、Key、Item、ConpareMode。

    (1)Count

    用于统计字典中键-值对的数量。也可以简单理解为统计字典中键的个数。

    (2)Key

    用于更改字典中已有的键。如果指定的键不存在,则会产生错误。

    (3)Item

    用于写入或读取字典中指定键的值,如果指定的键不存在,则会新增。

    (4)CompareMode

    当用字符串做为key时是否区分大小写,如 Dic.CompareMode=1不区分大小写,Dic.CompareMode=0区分大小写;默认是区分大小写的。

    总结:通过key键访问字典元素item值

    4.转置

     

    数组

    静态(常量)数组

    1.直接定义数组有多少个元素。括号里的数值n为上标值,下标从0开始到上标n。

    2.用Array函数创建

    3.调用Excel工作表内存数组

     

    动态数组

    如果定义为 din arr1() as variant 或 dim arr1() 缺省,都会默认为,可以存储变量的数组。

    可直接定义,但是不能直接赋值

     

     

    元素个数

    数组赋值与单元格的维度

    1、一般的赋值

     

     

    2、将单元格写入数组

    将某一个区域中单元格的数值赋给数组,无论是读取一行、一列、多行多列,数组都是二维的。

    3、将数组写入单元格

    (1)写入一行,需要一维或者二维(1,n)

    (2)写入一列,需要二维

    (3)写入多行多列,需要二维

    (4)取一列写入一行,需要转置

     

    4、在二维中取出一行或者一列

    (1)取出一行,结果是一维

    (2)取出一列,结果是二维

    (3)将一列单元格的数值写入一行单元格,需要转置 ,也就是n行1列,转成1行n列。

     

    总结

    (1)一维数组下标默认为 0; 二维数组中下标默认为 1

    (2)一维数组写入单元格时为一行,但一行单元格写入数组时为二维(1行,几列);

    (3)将一行或者一列单元格数值写入数组,都是二维的。

     

    数组的合并(join)与拆分(split)

    数组的筛选(Filter)

    数组维度的转换(Transpose)

    判断元素是否在数组中

    数组只能用循环或者遍历了,如果是excel中的,还可以用worksheetfunction.match 判断元素是否存在,可以考虑把数组转变成字典,字典对于这个问题处理起来就很轻松了。

    判断是一维还是二维

    没有直接的函数,一般用变通的方法,用错误获取。

     

    二维数组

    提取一行或一列转成一维数组

    注意:arr = Range("A1:C1"),是生成二维数组,1行3列,并不是一维的。

     

    行数和列数

    与Index取行取列

     

    关于for each 循环

    1.遍历数组的每一个元素,并不是按行遍历;

    例如:arr(2,3)遍历时会有2*3=6次,即每一个元素。

    2.当二维数组为一列时,刚好每次遍历一行。

    例:arr=range("A1:A10")

     

     

    ReDim Preserve 关键字

    1.如果使用了 Preserve 关键字,就只能重定义数组最末维的大小,且根本不能改变维数的数目。

    2.如果数组就是一维的,则可以重定义该维的大小,因为它是最末维,也是仅有的一维。

    3.如果数组是二维或更多维时,则只有改变其最末维才能同时仍保留数组中的内容。

     

    关于某一行、某一列

    1.选中某一行、某一列

     

    2.根据单元格选中一行一列

    Find 方法返回一个 Range 对象,也就是找到的那个单元格对象,然后再用这个对象的 EntireRow 来引用所在的整行。

    注意,上述代码没有容错判断,如果在指定范围内没有“要查找的值”,代码会出错。

     

    3.最后一行和一列

    方法1

    缺点:有时可能会比实际数大一些,原因是如果你把最后几行(列)数据清除后(非整行或整列删除),用这个命令仍返回未清除前的值。就是说现在虽然是空的,但是你曾经用过也算你的。

    方法2(最常用)

    可以简写为

    缺点:只能计算出一列(行)的最后一个单元格所在的行(列)数。本例是只返回A列最后一个单元格所占的行数。

    4.在最后一个单元格后写入数据

    单元格End属性:xlToLeft , xlToRight , xlUp , xlDown

     

     

    函数Function、过程Sub

    自定义函数、过程

    调用函数、过程

    1.VBA内置的函数

    2.工作表中的函数

    3.调用自定义的函数、过程

    第1种:call 函数名()

    第2种:直接函数名

    (1)function是函数,sub是子程序,都可以传递参数;

    (2)函数允许带一个返回值,过程没有返回值。

    (3)若使用call调用,有参数时必须带括号;

    若直接调用,参数可不带括号。

    1)无参数时

    2)有参数时

    3)函数有返回值,sub没有。

    方法: 函数名称 = 返回的数据

    函数可以有返回值,过程sub不能;Sub只能执行一堆语句而没有返回值。

     

    工作表

    1.新建

    若存在则不建表;若不存在,则新建表并且在1个位置。

    2.删除

    3.引用的3种方法

    4.获取名称

    方法一:

    方法二:

    5.修改名称

    6.激活工作表

    7.复制和移动

    复制:copy,移动:move

    8.隐藏和显示

    9.表的数量

    10.Sheets和Worksheets区别

    Sheets表示工作簿中所有类型的工作表的集合;

    Worksheets表示仅有普通工作表的集合。

    屏幕刷新和警告对话框

    1.屏幕刷新

    2.警告对话框

     

    【打开】对话框

    1.用FindFile方法

    打开在对话框中选中的文件。如果成功打开文件,返回True ;如果取消,返回False 。

    2.用GetOpenFilename方法

    获得在对话框中选中的文件名称(包含路径)。

    当多种类型文件时,用分号隔开。

     

    从全路径中提取文件名称

     

     

    后台打开工作薄并读取数据

    要在VB中操作Excel,需要引用Excel对象模型。 方法,在菜单里选择[工程] -- [引用],在窗口里勾选 Microsoft Excel XX.X Object Library 其中,XX.X取决于你安装的Office的版本号。

    2.使用GetObject读取到数组

     

     

     

     

    Cells、Resize、Offset

    cells(行,列)

    Cells(行,列)

    行号只能是数字,列可以是数字,也可以是字母("A"、"B"、"C" ....)。

    split提取出来的值是字符类型,注意转成数字。

    resize(行,列)

    (1)resize第一个参数表示扩张后的行数,方向是向下; (2)resize第二个参数表示扩张后的列数,方向是向右; (3)resize以该单元格为起点正整数,不支持0和负数。

    offset(参考位置 , 行 , 列 , 高 , 宽)

    语法:OFFSET(reference,rows,cols,height,width)

    offset函数是一个引用函数,表示引用某一个单元格或者区域

    在D3单元格输入公式=OFFSET(A1,2,2,1,1),其中A1是参考系,接着的2,2分别表示下,右移动的行数和列数,同样向上,左则是负数。最后面的1,1表示引用的区域大小是一行一列,也就是一个单元格。

    总结:resize的行列数字只能是正数,不能有负数和0;

    offset的行列数字可以正数、负数和0 。

     

     

     

    筛选与复制

    1.条件筛选并复制

    2.自动筛选和复制

     

    清除内容、格式、公式

     

    字母大小、数字的转换

    1.字母与数字

    (1)数字转换为字母

    数值范围:65~90大写字母;97~122小写字母。 64是@符号

    (2)字母转换为数字

    2.字母大小写

    (1)小写转大写: UCase(string)

    (2)大写转小写: LCase(string)

    UsedRange与CurrentRegion区别

    1. 使用区域:UsedRange

    (1)工作表worksheet属性;

    (2)当前工作表已经使用的单元格组成的矩形区域。

    1. 当前区域:CurrentRegion

    (2)单元格所在的周围以空行和空列隔开的区域。

     

    粘贴和选择性粘贴

    打印 PrintOut/Debug.Print

     

    模糊查找(是否包含关系)

    Expression可以是超链接所在的WorkSheet,函数有两个参数是必须的,Anchor是超链接所在的详细区域位置, Address是超链接所要跳转的目标地址。ScreenTip:停留时提示文字;TextToDisplay:超链接的文字

    1.跳转到某个网址

    直接在Address中写上网址字符串即可。

    2.跳转到表格

    (1)表格的位置是常量

    一般情况下,不使用Address,而是将Address置为空,将目标表格地址放到SubAddress中。

    注意SubAddress的值必须是"Sheet2!A1"才行。

    (2)表格的位置是变量

    如果跳转的目标位置的Sheet是一个变量,那么将Sheet的名字写到Variant1中即可,如果目标表格的行号是一个变量,那么将行号写到Variant2即可。上图中的代码,点击汇总表的第i行第3列,将会跳转到名称为Variant1的Sheet的第Variant2行,第C列中。

     

     

    MsgBox

    1.基本用法

    MsgBox(Prompt[,Buttons][,Title][,Helpfile,Context])

    1. Prompt,必需的参数,为字符串,作为显示在消息框中的消息文本。其最大长度约为1024个字符,由所用字符的宽度决定。如果prompt的内容超过一行,则可以在每一行之间用回车符(Chr(13))、换行符(Chr(10))或是回车与换行符的组合(Chr(13)&Chr(10))将各行分隔开来。

    2.Buttons,可选的参数,为数值表达式的值之和,指定显示的按钮的数目及形式、使用的图标样式、缺省按钮及消息框的强制回应等,可以此定制消息框。若省略该参数,则其缺省值为0。设置值见下表。 3.Title,可选的参数,表示在消息框的标题栏中所显示的文本。若省略该参数,则将应用程序名放在标题栏中。 4.Helpfile,可选的参数,为字符串表达式,提供帮助文件。若有Helpfile,则必须有Context。 5.Context,可选的参数,为数值表达式,提供帮助主题。若有Context,则必须有Helpfile。

    2.再次确认框

     

    引用单元格

    1. 一般使用

    Cells(行号,列标)

    使用方括号[ ]时,里面不能使用变量。

    所有的行和列

    单元格的End属性:xlToLeft , xlToRight , xlUp , xlDown

     

    2. 多个区域

    (1)并集 ,在双引号内用逗号分隔

    (2)交集 ,在字符串内用空格分隔

    (3)矩形区域,在双引号外用逗号分隔

    3. 混合引用

    4. 单元格属性

    (1)End属性:xlToLeft , xlToRight , xlUp , xlDown

    (2)值Value、个数Count、地址Address

    (3)Activate、Select

     

     

     

    工作簿

    1.获取文件信息

    2.创建工作簿

    1.创建空白工作簿

    2.将某个工作簿文件作为新建工作簿的模板

    可以省略参数名称Template

    3.打开open和关闭close

    (1)打开时,必须是全路径(路径 + 文件名

    (2)关闭

     

    (3)关闭窗体和Excel文件

    UserFrom的事件:Terminate、Querylose

     

    4.保存和另存文件

    如果省略路径,默认保存在当前文件夹中。

    5.激活Activate/当前工作薄

    6.最小化

    7.判断是否打开

    有没有不用遍历所有打开的工作簿就能知道工作簿是否打开呢?就好比在一群人中找到姓名为张三的小伙伴,是通过在一群人中一个一个去问,还是通过广播直接找张三呢。谁快谁慢,相必大家了然于胸,那VBA代码该如何去写呢?详细代码如下所示:

    方法一(报错,更快些)

    方法二(遍历)

     

    Workbooks下标越界,提取文件名称

    Workbooks表示当前所有打开的工作薄的对象集合,与sheets用法一样。

    workbooks带上路径就出错,下标越界,只写文件名就没有问题;

    解决:取得最右边“\”的右边部分,也就是文件名称。

     

    判断单元格是否为空

    (1)IsEmpty()函数

    空为True,否则为False

    (2)其它方法

    判断数据类型

    (1)isdate函数

    判断一个数据是否为日期类型;是,返回true;不是,返回false

    (2)isnumeric函数

    (3)并不是每一个数据类型都有对应的数据类型判断函数

    stringt和boolean没有函数

    (4)typename函数

    返回数据的类型名称。

    如typename(8),返回字符串“Integer”。注意返回的数据类型的字符串中首字母是大写的。

     

    日期和时间

    三个无参数函数:Date、Time、Now,分别返回当前电脑系统的日期、时间、日期+时间

    单元格设置成文本格式

     

    内置函数

    1.使用方法

    VBA中有许多内置函数,但要使用工作表中函数,Application对象的WorksheetFuntion属性。

    例:统计A1:B10单元格中大于100的个数

    2.常见内置函数

    1. MsgBox

    2. InputBox

    3. 舍入函数:Fix 向0取整, Int向下取整, Round四舍五入

    4. Rnd: 返回0-1内的单精度随机数

    5. mid:字符串函数

    6. Filter:对字符串的一维数组的过滤

    7. InStr([Start, ],[, Compare])与InStrRev: 查找子串

    8. Len:字符串长度

    9. Join:与split完全相反;连接一维数组中的所有子字符串,默认空白(“ ”),

       

    10. Left,Right,Mid: 截取子字符串

    11. Space(数值) :生成空格字符串

    12. Ucase,Lcase:大小写转换函数

    13. Ltrim, Rtrim,Trim :删除首尾空格

    14. Replace():替换

    15. Split:分割一个字符串成为一维数组

    16. StrComp:字符串比较

    17. StrConv:字符串转换

    18. String(number, character):制定字符重复若干次

     

    用户窗体设计

    修改显示的文字(名称)

    1.caption是显示在窗体中给用户看的;

    2.(名称)是代码中识别要操作的窗口;

    如果在调用窗体的Show方法前窗体没有加载,Excel会自动加载。

    3.UserForm借助initialize事件初始化窗体

     

    4.打开Excel就自动打开窗体

    选择ThisWorkbook→Workbook~open事件

    模式窗体是指不能执行窗体之外的对象。

    禁用窗体中的【关闭】按钮

     

    关闭窗体和Excel文件

    1.窗体内按钮的单击事件

    2.用户窗体的 Terminate 事件中

    双击单元格事件

    1.选择“Worksheet”中的“BeforeDoubleClick”事件

    2.利用If指定执行代码的单元格;

    3.设置Cancel=True,利用Call执行宏。

    获取窗体控件内容(值)

    列表框

     

    1.常用功能

    参数详解

    (1)ListBox1.ListCount '列表总行数

    (2)ListBox1.ListIndex '返回当前选中的列表的行数,从0开始,0是第一行

    (3)ListBox1.Selected(i) = True

    '判断列表第几行是否被选定,值为True时是选定,False没选定,变量“i”是索引值,从0开始,0是第一行

    (4)ListBox1.MultiSelect = 1

    '0或fmMultiSelectSingle不允许多项选择,1或fmMultiSelectMulti,简单的多项选择,即用鼠标单击或用空格键光标键操作,2或fmMultiSelectExtended 扩充多项选择,即用Shift键和Ctrl键配合操作,可手动在列表属性框提前设置好,或在窗体初始化时加载代码,总之要在使用前生效

    (5)ListBox1.List(i) '返回当前行的值,这是单列的,如果是多列ListBox1.List(行,列)

    (6)ListBox1.Liststyle=0

    '列表风格,可多选时有效,0是标准风格,值为1时,前每项前加一个小方框,选择时打上勾。

    (7)ListBox1.ColumnCount = 6 '把列表框设为6列

    (8)ListBox1.RowSource = "A1:F5" '把当前表格A1:F5内容显示在列表框中,列表框要选择设置好列数

    (9)ListBox1.ControlSource = "A6"

    '表格上的A6不能已经使用,不然会报错,把列表框当前选择的某一值在单元格A6中显示,这个值通过BoundColumn指定列加上选择的行数选择。

    (10)ListBox1.BoundColumn = 0

    '值为0是把当前选择的行数索引号(从0开始)返回到ControlSource参数指定的单元格,值为大于0的整数,则把相应列的选择行对应的值显示在ControlSource参数指定的单元格

    (11)ControlTipText = “把鼠标移动当前控件上的时候显示的提示文字”

     

    举例

    (1)列表框可多选时,反选的方法

    (2)列表框可多选时,全选的方法

    (3)列表框可多选时,重置选择的方法

    (4)显示多列数据

    2.列表框添加数据三种方法

    (1)使用RowSource属性

    这是一个字符串属性,而不是单元格区域

    (2)使用List属性或Column属性

    List(行,列) Column(列,行)

    (3)Additem方法

    此方法在列表中添加一行,并且只能放置一个新值在第一列中;在多列时,需要使用List或Columnn属性放置新置。

     

     

     

     

     

     

    VBA中常见对象

    对象说明
    Application应用程序
    Workbook工作簿
    Worksheet工作表
    Range单元格

     

    获取文件夹下的所有文件名和修改日期

    关键点:若要包含文件夹,则带上vbDirectory参数。

    实例详细:

     

    Dir函数

    1.返回一个文件夹下一个文件的名字(包含后缀)

    (1)dir后面的参数应该以反斜杠“\”结尾,这样才能返回该文件夹下的文件名称。否则“新建文件夹”会被当成一个文件名进行处理。

    (2)Dir运行一次只能得到一个文件名。为得到下一个文件名,代码应该这样写:filename = Dir

    (3)Dir后面不写任何参数,如果写了与前面相同的参数"F:\userdata\Desktop\新建文件夹",则会重新扫描该文件夹,又得到第一个文件名,如果更改为其他文件夹,就扫描该文件夹,得到它的第一个文件名。

    (4)如果文件夹中有n个文件,或者说有n个符合条件的文件,那么当Dir运行第n+1次时,则返回一个空字符串,代表已经查找完所有的文件。Dir运行第n+2次时,程序将报错。

    1. 扫描一个文件夹下所有文件的通用模板

    2. Dir扫描符合条件的文件名(通配符*)

      示例:扫描所有后缀为.xls的文件。

    3. 判断一个文件是否存在

      如果文件123.xls存在,则返回字符串123.xls,如果不存在,则返回空字符串。

    4. 扫描文件和子文件夹名称

      (1)一般情况下,Dir函数只返回文件名,而不返回子文件夹名。如果想要两者都返回,则需要加上vbDirectory参数。示例代码如下:

      (2)特别要注意的是,子文件夹包括“.”和“..”两个特殊名字,分别代表本目录F:\userdata\Desktop\新建文件夹\及其父目录F:\userdata\Desktop\。

      (3)Dir函数只能返回第一层的子文件夹和文件名,子文件夹下的文件与文件夹不返回。

     

    去重复项RemoveDuplicates

    其中Columns参数指定要删除重复项的列,如果是1的话,那么第一列中重复项所在行都会被删除,如果是2则只有1,2两列均重复的行才会被删除,以此类推,你的区域5列,那么只有5列均重复的行会被删除。

    如果想在1,2列中只根据某几列的重复来删除,比如,1 3 5列。那么参数写为Columns:=Array(1,3,5)

    案例:仅根据第1列重复项删除整行

    总结:

    1)去重时忽略大小写;

    2)前或后带空格的项却不做为重复项,无法去重,见上面案例。----- 关于这一点,经验验证:WPS 2019 --- 数据 --- 删除重复项 也是无法去除的,因此RemoveDuplicates 方法和工具菜单的方式去重是一样的效果。

     

     

    遍历单选按钮