引言:我是从百度百科上整理的内容,感觉对自己这种零基础学习的人有帮助,并且用这种笔记的方式来记录自己的学习所得。
VB语言的一种,寄生于Microsoft office软件的一种编程语言,俗称excel遥控器,要比直接使用excel封装好的内置函数更为快捷高效。个人感觉使用EXCEL的必备技能包,尤其是数据处理上,直接基于Microsoft office进行编程处理,省略中间N多个环境搭载流程,可视化效果较强。再说就是吹牛逼了,毕竟新手。
即Primary Type Data,下述列表的括号内为字节数 [2] :
• Byte :无符号数类型,取值范围0-255
• Boolean (2)
• Integer(2)
• Long (4)
• Single (4)
• Double (8)
• Currency (8)
• Decimal (14)
• Date (8)
• String
• Object (4)
• Variant (根据分配确定) [2]
相当于C语言的struct [2] ,例如:Type 自定义类型名 元素名 As 类型 … [元素名 As 类型] End Type
VBA数组
• Option Base 0 :数组索引值从0开始 [2]
• Option Base 1 :数组索引值从1开始
• Dim MyArray(10) :声明一个数组变量,10是最大的可用的数组索引值
• MyArray(5) = 101 :给数组的元素赋值
• Dim Data(10,5) :声明一个二维数组变量
• Data(1,1) = “A001” :给数组元素赋值
• Dim cArr(-11 To 20, 1 To 3) As String :声明一个数组,定义数组索引值的上下界
• Dim dArr() As String :声明动态数组
• ReDim dArr(0 To 5, 1 To 2) :改变动态数组的尺寸默认把原数据清除。如果保留原来的数据,必须加上参数
• Preserve:使用Preserve参数时只能改变最后一位的大小
• If UBound(vTemp) = -1 Then:判断数组变量vTemp是否为空数组
• End If Erase MyArrar, Data Erase语句清除数组元素,释放变量占用的空间 [2]
系统定义常量有3个:True、False和Null。 [4]
固有常量是编程时引用的对象库定义的常量。所有固有常量都可以在宏或VBA代码中使用。通常,固有常量通过前两个字母来指明定义该常量。来自VB库的常量则以“vb”开头。来自Access的常量以“ac”开头。可以使用对象浏览器来查看所有对象库中的固有常量列表。 [4]
在VBA中,常量的数据类型有整型、长整型、单精度型、双精度型、字节型、货币型、字符型、日期型和逻辑型。一个整型数据就是一个整型常量,一个长整型数据就是一个长整型常量。例如,12%、-1%是整型常量,32768&、10000000&是长整型常量,-2.5 1、3.14是单精度实型常量,3.1415926#是双精度实型常量,China、Shanghai是字符型常量,#07/13/2001 11:45PM#是日期常量,由符号 “ # ” 将字符括起来。 [4]
可以自行定义的常量即符号常量,必须先定义,后使用。可见,需要声明的常量都是符号常量。 [4]
(1) 基本语法格式:
1 [ Publicr/ Private] Const 常量名[As 类型]=表达式
如:Global Const 符号常量名称 = 常量值 [4]
(2) 语句功能:
定义一个符号常量,并将指定表达式的值赋给符号常量。 [4]
(3) 语句说明如下: [4]
1)“常量名”指定符号常量的名字。符号常量名可以由字母、数字和下画线组成,但只能以字母开头,不能含有空格。 [4]
2)“表达式”指定符号常量的值。该表达式通常由数值型、字符型、逻辑型或日期型数据以及各种运算符组成,但在表达式中不能出现变量和函数。 [4]
3) public用来表示这个常量的作用范围是整个数据库的所有模块。 [4]
4) private则表示这个常量只在使用该声明常量语句的模块中起作用。 [4]
(4) 说明:
1)除用户定义的符号常量外,VBA还提供了许多符号常量,我们可以直接使用。 [4]
2)对数码比较长,并且在程序中多次使用的常量,通常使用符号常量代替。运行程序时,系统自动把程序中的所有符号常量换为赋给它的值。 [4]
与常量一样,变量也是一块内存空间,用于保存程序运行过程中可能变化的数据。变量的名称是用户定义的一个标识符。 [5]
在代码中需要使用该变量时,只需引用相应的标识符即可,而不用管变量当前的值具体是什么。 [5]
与用户自定义的常量相似,变量在使用之前都需要声明,在VBA中声明变量的语法格式有以下几种: [5]
• 关键字变量名 AS 数据类型
• 关键字变量1,变量2 … 变量n AS 数据类型
• 关键字变量1 AS 数据类型,变量2 As 数据类型, … ,变量n AS数据类型
在第二种语法格式中, “变量n”的数据类型为AS关键字后定义的数据类型,而“变量1”、“变量2”、…的数据类型为变体型。 [5]
在VBA中,可用Dim、Private、Public和Static这4个关键字来声明变量,使用不同关键字声明的变量其含义也有所不同。 [5]
◆ 利用Dim关键字声明变量:Dim关键字主要用来在内存中分配一块空间,并为该空间命名,是VBA中声明变量最常用的关键字。使用Dim关键字声明的变量只能在当前过程或模块中使用。 [5]
◆ 利用Private关键字声明变量:Private关键字用于在类模块中声明一个私有变量,它只能在当前的类模块中使用。当定义变量的位置同处于类模块中时,其使用效果与使用Dim关键字定义的变量相同。 [5]
◆ 利用Public关键字声明变量:利用Public关键字声明的变量可以在程序的任何地方调用,而与声明变量的位置无关。 [5]
◆ 利用Static关键字声明变量:Static关键字用于声明静态变量,即变量的值在整个代码运行期间都能被保留。 [5]
变量在使用时还需要对其进行赋值。在VBA中对变量进行赋值可通过 “ = ” 符号或 “ Set ” 关键字进行。通过 “ = ” 符号对变量赋值的语法格式有以下几种。 [5]
变量名=数据
变量1=变量2 运算符 数据
变量1=变量2 运算符 变量3 … 运算符 变量n
如果在定义变量时指定了变量的数据类型,则为变量所赋的值也必须是该数据类型的值。如果变量定义为Integer类型,而在赋值时却给了变量一个String类型的数据,则在编译运行的过程中将弹出错误弹框。 [5]
运算符是在程序中执行计算功能的某些特殊符号,它是程序代码的重要组成部分。在程序代码中,运算符不能单独使用,必须与其操作数共同组成表达式后才具有运算意义。VBA中的运算符包含算术运算符、连接运算符、比较运算符和逻辑运算符等。 [4]
算术运算符主要用于执行四则运算,仅用算术运算符连接起来的表达式称为算术表达式。算术运算符及其作用与示例如表所示。 [5]
注意:
在执行算术运算时,运算符两侧操作的数据类型必须相同,否则会出现“类型不匹配”的错误提示。当“+”运算符左右两侧都是字符串类型的操作数时,执行的是连接运算,如表达式“"Pass+"word"的计算结果为字符串“ PassWord ”。 [5]
连接运算符
连接运算符的作用是将运算符两侧的操作数连接成一个数,其操作数的数据类型通常都为String类型。VBA中的连接运算符有“&”和“+”两种,由于使用“+”执行连接运算时,容易与加法运算混淆,所以通常都采用“&”进行连接运算。 [5]
比较运算符
比较运算符可以对运算符两侧的操作数执行比较运算,其返回结果为Boolean类型的True或False。比较运算符的操作数通常为具体的数值,当操作数为字符串或其他符号时,是根据该符号的ASCII码进行比较的。VBA中的比较运算符及其作用与示例如表所示。 [5]
注意:
在执行算术运算时,运算符两侧操作的数据类型必须相同,否则会出现“类型不匹配”的错误提示。当“+”运算符左右两侧都是字符串类型的操作数时,执行的是连接运算,如表达式“"Pass+"word"的计算结果为字符串“ PassWord ”。 [5]
连接运算符的作用是将运算符两侧的操作数连接成一个数,其操作数的数据类型通常都为String类型。VBA中的连接运算符有“&”和“+”两种,由于使用“+”执行连接运算时,容易与加法运算混淆,所以通常都采用“&”进行连接运算。 [5]
比较运算符可以对运算符两侧的操作数执行比较运算,其返回结果为Boolean类型的True或False。比较运算符的操作数通常为具体的数值,当操作数为字符串或其他符号时,是根据该符号的ASCII码进行比较的。VBA中的比较运算符及其作用与示例如表所示。 [5]
逻辑运算符用于对运算符两侧的操作数执行逻辑运算,参与逻辑运算的操作数本身可以是逻辑表达式(表达式的最终结果为True或 False),也可以是算术表达式(表达式的最终返回值为0或非0)。 [5]
在逻辑运算中,数值0与逻辑值 False相同,表示逻辑假;非0数值与True相同,表示逻辑真。逻辑运算符及其含义与示例如表所示。 [5]
(1) if 语句
if 条件1 then 语句1
elseif 条件2 then 语句2
elseif ...
...else 语句
nend if
(2) Select Case 语句
Select Case 表达式 Case 表达式列表1
语句1
Case 表达式列表2
语句2
... Case 表达式列表n 语句nEnd Select
其中的表达式列表可以为: [5]
Do While或Until 条件 语句块1 Exit Do 语句块2Loop
(4) For…Next语句
Do 语句块1 Exit Do 语句块2Loop While或Until 条件
(5) For Each … Next语句
For 循环控制变量=初值To 终值Step 步长 语句块 ‘Exit For语句可以跳出循环体Next
(6) 跳出本次循环的continue语句
For 循环控制变量=初值 To 终值 Step 步长 Do '用于模拟continue 语句块 If 条件 Then Exit Do '用于模拟continue 语句块 Loop While False '用于模拟continue Next
(7) With语句
With 对象引用 语句块End With
(8) On Error语句
On Error Goto 出错处理语句的label '跳转到出错处理语句
或
On Error Resume Next '遇到错误,不管错误,继续往下执行
(9) 具有控制作用的函数
常用语法案例参考
Dim sheet As Worksheet
Dim i As Integer
'for循环用法
For i = 1 To Worksheets.Count
Set sheet = Worksheets(i)
Debug.Print sheet.Name
Next i
'while用法
i = 1
While i <= Worksheets.Count
Set sheet = Worksheets(i)
'if用法
If sheet.Name <> "Sheet1" And sheet.Name = "Sheet2" Then
'Cells用法
Debug.Print sheet.Cells(i, i).Value
End If
i = i + 1
Wend
'do while用法
i = 1
Do While i <= Worksheets.Count
Set sheet = Worksheets(i)
If sheet.Name <> "Sheet1" And sheet.Name = "Sheet2" Then
'range用法
Debug.Print sheet.Range("A" & i).Value
End If
i = i + 1
Loop
【版权声明:本文为CSDN博主「chadm」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42695485/article/details/81571843】
Sub 过程名(参数表) 语句块 Exit Sub 语句块End Sub
Function 函数名(参数表) As Type
语句块
函数名=表达式 Exit FunctionEnd Function
可以是Private、Public、Friend、Static等修饰。 [6]
调用函数/过程时,可以加括号或者不加括号。如果调用表达式作为一行的一部分,那么必须用参数,例如函数调用的返回值赋给变量。 调用过程时, 可以使用/不使用call关键字。使用call语句调用过程,如果无参数,则不加括号;如果有参数,必须加括号。如果调用时用括号包住单个参数,则该参数强行按值传递。需要特别注意,不用call不加括号的调用,形参与实参是传值(passed by value)而不是传引用(passed by reference),这会导致一些对象的方法调用失败。例如: [6]
Dim cn As ADODB.Connection
Set cn = CurrentProject.Connection
Dim rs As New ADODB.Recordset
rs.Open "SELECT * FROM myTable" , cn
Dim ExcelApp As New Excel.Application
Dim ExcelWst As Worksheet
Set ExcelWst = ExcelApp.Workbooks.Add.Worksheets(1)
ExcelWst.Range("A2").CopyFromRecordset(rs) '失败,无法执行该行
ExcelWst.Range("A2").CopyFromRecordset rs '可成功执行该行
[5]
字符串案例: [7]
Function StringTest()
Dim s As String
s = "Hello,world "
'求长度
Debug.Print Len(s)
'去掉两端空格
Debug.Print Len(Trim(s))
'替换s中子串a,用b替代
Debug.Print Replace(s, "world", "chadm")
'从左边取若干字符
Debug.Print Left(s, 5)
'从右边取若干字符
Debug.Print Right(s, 5)
'从中间取若干字符
Debug.Print Mid(s, 1, 5)
's1中查找字符串s2,返回位置
Debug.Print InStr(s, "ll")
'从a位置在s1中查找字符串s2,返回位置
Debug.Print InStr(6, s, "ld")
End Function
日期函数案例: [7]
'now:返回当前的时间,格式是:2018/8/11 0:22:56
'date:返回当前的日期,格式是:2018/8/11
'time:返回当前的时间,格式是:00:00:0
Debug.Print Date
Debug.Print now()
Debug.Print time
读取TXT文档: [7]
Function improtProject()
Dim rLine As String
Dim i As Integer ' line number
Dim j As Integer
Dim k As Integer
Dim file As String
Dim arr
Dim dts As Worksheet
Set dts = ThisWorkbook.Worksheets("Config")
i = 1
k = 4
file = ThisWorkbook.Path + "\" + "config.txt"
Open file For Input As #1
' stay inside the loop until the end of file is reached
Do While Not EOF(1)
Line Input #1, rLine
'debug.Print rLine
i = i + 1
arr = Split(rLine, " ")
Debug.Print arr(0), arr(1)
dts.Range("A" & k).Value = arr(0)
dts.Range("B" & k).Value = arr(1)
k = k + 1
Loop
Close #1
End Function
– Loc:文件指针位置
– LOF:文件打开时的指针位置
– Seek:文件指针定位
– Spc:使用Print做position output
– Tab:用于Print函数
打开excel案例 [7]
Function openExcel(name As String)
Dim wb As Workbook
Dim sheetFrom As Worksheet
'判断文件是否存在
If Dir(name) <> "" Then
Debug.Print name + "文件存在"
Else
Debug.Print name + "不文件存在"
End If
'在vba中,对象的使用需要先初始化
Set wb = Workbooks.Open(name) 'name是表格的完整路径
'sheetName是sheet表名,打开指定的sheet表
Set sheetFrom = wb.Worksheets("sheetName")
End Function
获取当前文件路径: [7]
path = ThisWorkbook.Path
'获取上一级目录
file = Left(ThisWorkbook.Path, InStrRev(ThisWorkbook.Path, "\") - 1) + "\" + "config.txt"
遍历所有EXCEL sheet表单 [7]
Dim sheet As Worksheet
Dim i,row As Integer
For i = 1 To Worksheets.Count
Set sheet = Worksheets(i)
Debug.Print sheet.Name
Next i
获取表格的行数和列数
'使用如下方法获取行数和列,有时可能会比实际数大一些,存在空行空列
row = sheet.UsedRange.Rows.count '表中有多少行
col = sheet.UsedRange.Columns.Count '表格中多少列
操作单元格range和Cells [7]
' 通过range对象来操作
Debug.Print sheet.Range("A" & i).Value
'通过Cells对象来操作
Debug.Print sheet.Cells(i, i).Value
'设置单元格背景颜色
sheet.Cells(i, i).Interior.Color = RGB(100, 255, 255)
'表示一个区域
sheet.range(cells(1,1),cells(3,3))
【版权声明
:本文为CSDN博主「chadm」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42695485/article/details/81571843】
Function getSheetLine(ByRef target As Worksheet, start As Integer) As Integer
Dim count As Integer
count = start
While target.Range("A" & count).Value <> ""
count = count + 1
Wend
getSheetLine = count
End Function
---------------------------------------------------------
需要注意在调用getSheetLine方法的,定义target需要采取如下方式
Dim target As Worksheet
如果定义为
Dim sheet,target As Worksheet
会报byref类型不匹配
----------------------------------------------------------
'第三行第i列的值等,prodts表格的L列里面所有小于等于第二行第i列的值
Cells(3, i) = WorksheetFunction.CountIf(prodts.Range("L:L"), "<=" & Cells(2, i))
Sub Mail_workbook_Outlook_1()
'Working in Excel 2000-2016
'This example send the last saved version of the Activeworkbook
'For Tips see: http://www.rondebruin.nl/win/winmail/Outlook/tips.htm
Dim OutApp As Object
Dim OutMail As Object
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next
With OutMail
.To = "XXXXXX"
.CC = ""
.BCC = ""
.subject = "This is the Subject line"
.HTMLBody = "Dear Customer
" & _
"Please visit this website to download the new version.
" & _
"Let me know if you have problems.
" & _
"Ron's Excel Page" & _
"
Thank you"
.Attachments.Add ActiveWorkbook.FullName
'You can add other files also like this
'.Attachments.Add ("C:\test.txt")
.Send 'or use .Display
End With
On Error GoTo 0
Set OutMail = Nothing
Set OutApp = Nothing
End Sub
由于微软Office软件的普及,人们常见的办公软件Office软件中的Word、Excel、Access、Powerpoint都可以利用VBA使这些软件的应用更高效率,例如:通过一段VBA代码,可以实现画面的切换;可以实现复杂逻辑的统计(比如从多个表中,自动生成按合同号来跟踪生产量、入库量、销售量、库存量的统计清单)等。 [5]
掌握了VBA,可以发挥以下作用: [5]
1.规范用户的操作,控制用户的操作行为; [5]
2.操作界面人性化,方便用户的操作; [5]
3.多个步骤的手工操作通过执行VBA代码可以迅速的实现; [5]
4.实现一些VB无法实现的功能; [5]
5.用VBA制做EXCEL登录系统; [5]
6.利用VBA可以Excel内轻松开发出功能强大的自动化程序。 [5]