本章目标掌握 VBA 基础语法理解变量声明、数据类型选择、运算符使用为编写高质量代码打下坚实基础。一、变量基础1.1 什么是变量变量是程序中用于存储数据的容器。想象它是一个贴有标签的盒子你可以往里面放东西也可以随时取出查看或修改。┌─────────────────────────────────────────┐ │ 变量名: userName │ │ 数据类型: String │ │ 值: 张三 │ │ │ │ ┌─────────────────────────────────┐ │ │ │ │ │ │ │ 张三 │ │ │ │ │ │ │ └─────────────────────────────────┘ │ └─────────────────────────────────────────┘1.2 变量命名规则必须遵守的规则规则正确示例错误示例必须以字母开头userName,age1stName,2count只能包含字母、数字、下划线first_name,item2first-name,item2不能包含空格userNameuser name不能使用保留字-Sub,Function,If推荐命名规范规范说明示例驼峰命名法首单词小写后续单词首字母大写userName,totalAmount匈牙利命名法前缀描述strName,intCount见名知意名称能表达变量用途salesData优于sd常见保留字不能用做变量名And As Boolean ByRef Byte ByVal Call Case Catch CBool CByte CCur CDate CDbl CDec Const Date Dim Do Double Else ElseIf End Enum Erase Error Exit False For Function GoTo If In Integer Long Loop Me Mod New Next Not Object On Option Or Private Public ReDim Resume Return Select Set Single Static Stop Sub Then To True Type Until Variant Wend While With二、变量声明2.1 Dim 语句使用Dim关键字声明变量Dim 变量名 As 数据类型示例Sub VariableDemo() 声明不同类型的变量 Dim userName As String 字符串 Dim age As Integer 整数 Dim salary As Double 双精度小数 Dim isActive As Boolean 布尔值 Dim birthDate As Date 日期 赋值 userName 张三 age 28 salary 15000.50 isActive True birthDate #1995-3-15# 输出 MsgBox 姓名: userName vbCrLf _ 年龄: age vbCrLf _ 薪资: salary End Sub2.2 强制声明Option Explicit强烈建议在每个模块顶部添加Option Explicit Sub Demo() Dim x As Integer x 10 ✓ 正确 y 20 ✗ 编译错误y 未声明 End Sub开启自动添加 Option Explicit工具→选项→编辑器→ 勾选要求变量声明┌─────────────────────────────────────┐ │ 选项 │ ├─────────────────────────────────────┤ │ 编辑器 │ │ │ │ ☑ 自动语法检查 │ │ ☑ 要求变量声明 ← 勾选此项 │ │ ☑ 自动列出成员 │ │ ☑ 自动显示快速信息 │ │ │ └─────────────────────────────────────┘为什么要用 Option Explicit问题示例避免拼写错误userName误写为userNmae未声明会创建新变量提高性能显式声明的变量类型确定运行更快便于维护代码更清晰易于理解2.3 同时声明多个变量 正确每个变量都有类型 Dim x As Integer, y As Integer, z As Integer 错误只有 z 是 Integerx 和 y 是 Variant Dim x, y, z As Integer 推荐写法更清晰 Dim x As Integer Dim y As Integer Dim z As Integer2.4 变量的作用域 模块级变量模块顶部所有过程可访问 Dim moduleVar As String Sub Procedure1() 过程级变量仅本过程可访问 Dim localVar As Integer moduleVar 可在其他过程访问 localVar 100 End Sub Sub Procedure2() MsgBox moduleVar ✓ 可以访问 MsgBox localVar ✗ 编译错误localVar 未定义 End Sub作用域关键字对比关键字作用域生命周期Dim过程/模块过程结束/模块卸载Private模块模块卸载Public整个工程Excel 关闭Static过程程序结束三、数据类型详解3.1 常用数据类型┌─────────────────────────────────────────────────────────┐ │ VBA 数据类型 │ ├──────────────┬─────────────┬────────────────────────────┤ │ 类型 │ 占用空间 │ 取值范围 │ ├──────────────┼─────────────┼────────────────────────────┤ │ Byte │ 1 字节 │ 0 ~ 255 │ │ Boolean │ 2 字节 │ True / False │ │ Integer │ 2 字节 │ -32,768 ~ 32,767 │ │ Long │ 4 字节 │ -2,147,483,648 ~ │ │ │ │ 2,147,483,647 │ │ Single │ 4 字节 │ 约 -3.4E38 ~ 3.4E38 │ │ Double │ 8 字节 │ 约 -1.8E308 ~ 1.8E308 │ │ Currency │ 8 字节 │ -922,337,203,685,477.5808 ~ │ │ │ │ 922,337,203,685,477.5807 │ │ Date │ 8 字节 │ 100年1月1日 ~ 9999年12月31日 │ │ String │ 变长 │ 约 20 亿字符 │ │ Variant │ 变长 │ 任意类型 │ │ Object │ 4 字节 │ 对象引用 │ └──────────────┴─────────────┴────────────────────────────┘3.2 数值类型选择指南场景推荐类型原因年龄、数量小整数Integer节省内存大整数如身份证号Long避免溢出财务计算Currency精确到小数点后4位科学计算Double高精度浮点百分比、比率Single精度足够节省空间示例Sub NumberTypes() Dim count As Integer 计数器 Dim totalRows As Long 大表行数 Dim price As Currency 价格 Dim rate As Double 利率/比率 count 100 totalRows 1000000 price 1999.99 rate 0.0356 Debug.Print Count: count Debug.Print Total Rows: totalRows Debug.Print Price: Format(price, Currency) Debug.Print Rate: Format(rate, Percent) End Sub3.3 字符串类型Sub StringDemo() Dim firstName As String Dim lastName As String Dim fullName As String firstName 三 lastName 张 字符串连接 fullName lastName firstName 结果: 张三 fullName lastName firstName 结果: 张三不推荐 字符串函数 Dim text As String text Hello World Debug.Print Trim(text) Hello World Debug.Print Left(text, 5) Hel Debug.Print Right(text, 5) rld Debug.Print Mid(text, 3, 5) Hello Debug.Print Len(text) 15 Debug.Print UCase(text) HELLO WORLD Debug.Print LCase(text) hello world End Sub常用字符串函数函数功能示例Len(s)返回字符串长度Len(ABC)→ 3Left(s, n)取左边 n 个字符Left(ABC, 2)→ “AB”Right(s, n)取右边 n 个字符Right(ABC, 2)→ “BC”Mid(s, start, len)从 start 取 len 个字符Mid(ABC, 2, 1)→ “B”Trim(s)去除首尾空格Trim( ABC )→ “ABC”UCase(s)转大写UCase(abc)→ “ABC”LCase(s)转小写LCase(ABC)→ “abc”InStr(s1, s2)查找子串位置InStr(ABC, B)→ 2Replace(s, f, r)替换子串Replace(ABC, B, X)→ “AXC”3.4 日期时间类型Sub DateTimeDemo() Dim today As Date Dim meetingTime As Date 日期赋值使用 # 包围 today #2024-1-15# meetingTime #3:30:00 PM# 获取当前日期时间 Dim nowTime As Date nowTime Now 当前日期和时间 日期函数 Debug.Print Date 当前日期 Debug.Print Time 当前时间 Debug.Print Now 当前日期时间 Debug.Print Year(Date) 年 Debug.Print Month(Date) 月 Debug.Print Day(Date) 日 Debug.Print Weekday(Date) 星期1周日 日期计算 Dim future As Date future Date 7 7天后 Debug.Print 一周后: future 日期差 Dim daysDiff As Long daysDiff #2024-12-31# - Date Debug.Print 距离年底还有 daysDiff 天 End Sub常用日期函数函数功能示例Date当前日期2024/1/15Time当前时间14:30:15Now当前日期时间2024/1/15 14:30:15Year(d)提取年份Year(#2024-1-15#)→ 2024Month(d)提取月份Month(#2024-1-15#)→ 1Day(d)提取日期Day(#2024-1-15#)→ 15Weekday(d)星期几Weekday(Date)→ 1-7DateAdd(interval, n, d)日期加减DateAdd(d, 7, Date)DateDiff(interval, d1, d2)日期差DateDiff(d, Date1, Date2)Format(d, format)格式化日期Format(Date, yyyy-mm-dd)日期格式字符串格式结果示例yyyy-mm-dd2024-01-15yyyy年m月d日2024年1月15日mm/dd/yyyy01/15/2024ddddMondaymmmJan3.5 Variant 类型Variant是 VBA 的万能类型可以存储任何数据Sub VariantDemo() Dim v As Variant v 100 存储整数 v Hello 存储字符串 v 3.14 存储小数 v True 存储布尔值 v #2024-1-15# 存储日期 可以存储数组 v Array(1, 2, 3, 4, 5) 可以存储对象 Set v Range(A1) End Sub⚠️ 注意虽然 Variant 灵活但会占用更多内存运行速度较慢可能引发类型错误建议明确指定数据类型只在必要时使用 Variant。四、常量4.1 声明常量使用Const声明常量Sub ConstantsDemo() 声明常量 Const PI As Double 3.14159265359 Const COMPANY_NAME As String ABC科技有限公司 Const MAX_USERS As Integer 100 Const TAX_RATE As Currency 0.13 使用常量 Dim radius As Double Dim area As Double radius 5 area PI * radius * radius MsgBox 圆面积: area vbCrLf _ 公司名称: COMPANY_NAME End Sub4.2 常量命名规范全部大写单词间用下划线分隔见名知意Const MAX_ROW_COUNT As Long 1048576 Const DEFAULT_SHEET_NAME As String Sheet1 Const VERSION_NUMBER As String 1.0.04.3 内置常量VBA 提供了大量预定义常量MsgBox 常量 按钮类型 vbOKOnly 只显示确定按钮 vbOKCancel 确定和取消 vbYesNo 是和否 vbYesNoCancel 是、否、取消 图标类型 vbCritical 错误图标 (X) vbQuestion 问号图标 (?) vbExclamation 警告图标 (!) vbInformation 信息图标 (i) 返回值 vbOK 1 vbCancel 2 vbYes 6 vbNo 7颜色常量vbBlack 0 vbRed 255 vbGreen 65280 vbYellow 65535 vbBlue 16711680 vbMagenta 16711935 vbCyan 16776960 vbWhite 16777215使用示例Sub MsgBoxDemo() Dim result As VbMsgBoxResult result MsgBox(确定要删除吗, vbYesNo vbQuestion, 确认) If result vbYes Then MsgBox 已删除, vbInformation Else MsgBox 已取消, vbInformation End If End Sub五、运算符5.1 算术运算符Sub ArithmeticOperators() Dim a As Integer: a 10 Dim b As Integer: b 3 Debug.Print a b 13 (加法) Debug.Print a - b 7 (减法) Debug.Print a * b 30 (乘法) Debug.Print a / b 3.333... (除法) Debug.Print a \ b 3 (整除) Debug.Print a Mod b 1 (取余) Debug.Print a ^ b 1000 (幂运算) End Sub运算符名称示例结果加法5 38-减法5 - 32*乘法5 * 315/除法5 / 22.5\整除5 \ 22Mod取模5 Mod 21^幂运算2 ^ 385.2 比较运算符Sub ComparisonOperators() Dim x As Integer: x 10 Dim y As Integer: y 20 Debug.Print x y False (等于) Debug.Print x y True (不等于) Debug.Print x y True (小于) Debug.Print x y False (大于) Debug.Print x y True (小于等于) Debug.Print x y False (大于等于) End Sub5.3 逻辑运算符Sub LogicalOperators() Dim a As Boolean: a True Dim b As Boolean: b False Debug.Print a And b False (逻辑与) Debug.Print a Or b True (逻辑或) Debug.Print Not a False (逻辑非) Debug.Print a Xor b True (逻辑异或) End Sub真值表ABA And BA Or BNot AA Xor BTTTTFFTFFTFTFTFTTTFFFFTF5.4 字符串运算符Sub StringOperators() Dim firstName As String: firstName 张 Dim lastName As String: lastName 三 连接运算符 Debug.Print firstName lastName 张三 Debug.Print 姓名: firstName lastName 也可以连接但不推荐 Debug.Print firstName lastName 张三 区别 会强制转换为字符串 Debug.Print 编号: 100 编号: 100 Debug.Print 编号: 100 类型不匹配错误 End Sub5.5 运算符优先级优先级高 → 低 1. ^ (幂运算) 2. - (负号) 3. *, / (乘除) 4. \ (整除) 5. Mod (取模) 6. , - (加减) 7. (字符串连接) 8. , , , , , (比较) 9. Not (逻辑非) 10. And (逻辑与) 11. Or (逻辑或) 12. Xor (逻辑异或)使用括号明确优先级Sub OperatorPriority() Dim result As Double ambiguous result 10 20 * 2 50 (先乘后加) clear result (10 20) * 2 60 complex expression result (100 - 20) / (5 3) * 2 80 / 8 * 2 20 End Sub六、类型转换6.1 隐式转换VBA 会自动进行某些类型转换Sub ImplicitConversion() Dim i As Integer Dim d As Double i 10 d i Integer → Double自动转换 Dim s As String s 100 Integer → String自动转换 Debug.Print s 100 End Sub6.2 显式转换函数Sub ExplicitConversion() Dim numStr As String: numStr 123 Dim num As Integer 字符串转数字 num CInt(numStr) 123 num CLng(numStr) 123 (Long) num CByte(numStr) 123 (Byte) 数字转字符串 Dim str As String str CStr(123) 123 转日期 Dim d As Date d CDate(2024-1-15) #2024-1-15# 转货币 Dim c As Currency c CCur(123.456) 123.456 转布尔 Dim b As Boolean b CBool(1) True b CBool(0) False End Sub类型转换函数表函数转换目标类型示例CBool(x)BooleanCBool(1)→ TrueCByte(x)ByteCByte(100)→ 100CInt(x)IntegerCInt(3.7)→ 4CLng(x)LongCLng(3.7)→ 4CSng(x)SingleCSng(3.14159)CDbl(x)DoubleCDbl(3.141592653)CCur(x)CurrencyCCur(123.456789)→ 123.4568CDate(x)DateCDate(2024-1-15)CStr(x)StringCStr(123)→ “123”CVar(x)VariantCVar(123)Val(x)数字Val(123abc)→ 1236.3 安全转换使用IsNumeric检查后再转换Sub SafeConversion() Dim userInput As String userInput InputBox(请输入数字:) If IsNumeric(userInput) Then Dim num As Double num CDbl(userInput) MsgBox 输入的数字是: num Else MsgBox 输入无效请输入数字, vbExclamation End If End Sub七、本章小结核心知识点知识点关键内容变量声明Dim 变量名 As 类型使用Option Explicit命名规范驼峰命名、见名知意、避免保留字数据类型根据场景选择合适类型节省内存字符串操作连接、常用字符串函数日期处理#日期#格式、日期函数常量Const声明全大写下划线分隔运算符算术、比较、逻辑、字符串运算符类型转换隐式/显式转换使用IsNumeric安全检查下章预告下一章将学习程序流程控制If…Then…Else 条件判断Select Case 多分支选择For…Next 循环Do…Loop 循环嵌套结构与流程控制语句练习作业基础练习声明变量存储以下信息员工姓名String、年龄Integer、入职日期Date、是否在职Boolean、月薪Currency编写代码计算圆的面积和周长使用常量定义 PI将字符串12345转换为数字并计算其平方进阶练习编写一个程序接收用户输入的两个数字和一个运算符、-、*、/输出计算结果计算从当前日期到年底还剩多少天、多少小时挑战练习编写一个函数判断输入的年份是否为闰年闰年规则能被4整除但不能被100整除或能被400整除学习建议数据类型是编程的基础务必理解每种类型的适用场景。多练习类型转换这是实际开发中经常遇到的问题。本文是《Excel VBA 从入门到精通》系列第二篇文章持续更新中…如果觉得有帮助欢迎点赞、收藏、评论有任何问题可以在评论区留言交流。