前面各章的实例中或多或少都有用到一些函数,接下来将做一个汇总,对 VBA 中常见函数的分类介绍,涵盖字符串处理、调试、类型转换、数学运算等多个领域,并附有示例说明:
六、日期与时间函数
6.1. DateAdd
- 作用:对日期增加或减少指定的时间间隔。
- 语法:
DateAdd(interval, number, date)
- 参数:
- interval(必填,字符串):时间间隔单位,可选值:
- "yyyy":年
- "q":季度
- "m":月
- "y":一年的天数(同 "d")
- "d":日
- "w":工作日(按周计算)
- "ww":周
- "h":小时
- "n":分钟
- "s":秒
- number(必填,整数):增加/减少的数量(负数表示减)。
- date(必填,日期):原始日期。
- 示例:
Debug.Print DateAdd("m", 3, #2023-10-01#) ' 输出 "2024-01-01"(加3个月)
6,2. DateDiff
- 作用:计算两个日期之间的间隔。
- 语法:
DateDiff(interval, date1, date2, [firstdayofweek], [firstweekofyear])
- 参数:
- interval(必填,字符串):同 DateAdd 的间隔单位。
- date1, date2(必填,日期):要比较的两个日期。
- firstdayofweek(可选,常量):指定周的第一天(默认为 vbSunday)。
- vbSunday (1)、vbMonday (2) 等。
- firstweekofyear(可选,常量):指定年的第一周(默认为 vbFirstJan1)。
- vbFirstJan1 (1):包含1月1日的周为第一周。
- vbFirstFourDays (2):至少包含四天的周为第一周。
- 示例:
Debug.Print DateDiff("d", #2023-10-01#, #2023-10-10#) ' 输出 9(间隔9天)
6,3. DatePart
- 作用:提取日期的指定部分(年、月、季度等)。
- 语法:
DatePart(interval, date, [firstdayofweek], [firstweekofyear])
- 参数:
- interval(必填,字符串):同 DateAdd 的间隔单位。
- date(必填,日期):要处理的日期。
- firstdayofweek 和 firstweekofyear(可选):同 DateDiff。
- 示例:
Debug.Print DatePart("q", #2023-10-01#) ' 输出 4(第四季度)
6,4. Year/Month/Day/Hour/Minute/Second
- 作用:提取日期的年、月、日或时间的时、分、秒。
- 语法:
Year(date) Month(date) Day(date) Hour(time) Minute(time) Second(time)
- 参数:
- date/time(必填,日期或时间):要处理的日期或时间。
- 示例:
Debug.Print Year(#2023-10-01#) ' 输出 2023
Debug.Print Hour(#14:30:00#) ' 输出 14
6,5. Weekday
- 作用:返回日期对应的星期几(1-7,默认周日为1)。
- 语法:
Weekday(date, [firstdayofweek])
- 参数:
- date(必填,日期):目标日期。
- firstdayofweek(可选,常量):指定周的第一天(默认为 vbSunday)。
- 示例:
Debug.Print Weekday(#2023-10-01#, vbMonday) ' 输出 7(2023-10-01 是周日,若周一是第一天则周日为7)
6.6. DateValue/TimeValue
- 作用:将字符串转换为日期或时间。
- 语法:
DateValue(string) TimeValue(string)
- 参数:
- string(必填,字符串):合法日期或时间字符串(如 "2023-10-01" 或 "14:30:00")。
- 示例:
Debug.Print DateValue("October 1, 2023") ' 输出 "2023-10-01"
Debug.Print TimeValue("2:30 PM") ' 输出 "14:30:00"
6.7. FormatDateTime
- 作用:按预定义格式或自定义格式格式化日期时间。
- 语法:
FormatDateTime(date, [format])
- 参数:
- date(必填,日期):要格式化的日期时间。
- format(可选,常量):
- vbGeneralDate (0):显示日期和时间(默认)。
- vbLongDate (1):长日期格式(如 "2023年10月1日")。
- vbShortDate (2):短日期格式(如 "2023-10-01")。
- vbLongTime (3):长时间格式(如 "14:30:00")。
- vbShortTime (4):短时间格式(如 "14:30")。
- 示例:
Debug.Print FormatDateTime(Now, vbLongDate) ' 输出 "2023年10月1日"
6.8. IsDate
- 作用:判断字符串或变量是否为合法日期。
- 语法:
IsDate(expression)
- 参数:
- expression(必填,任意类型):要验证的表达式。
- 示例:
Debug.Print IsDate("2023-10-32") ' 输出 False(无效日期)
6.8. 综合示例
Sub DateFunctionsDemo()
Dim dt As Date
dt = #2023-10-01 14:30:00#
' 提取日期部分
Debug.Print "Year: " & Year(dt) ' 输出 2023
Debug.Print "Weekday: " & Weekday(dt) ' 输出 1(默认周日为第一天)
' 计算日期差
Debug.Print "Days between: " & DateDiff("d", dt, #2023-10-10#) ' 输出 9
' 格式化日期
Debug.Print FormatDateTime(dt, vbLongDate) ' 输出 "2023年10月1日"
End Sub
总结
- 核心函数:DateAdd、DateDiff、DatePart 是处理日期运算的核心,需熟练掌握其参数。
- 提取与验证:使用 Year、Month、IsDate 等函数提取或验证日期。
- 格式化输出:FormatDateTime 和 Format 函数可灵活控制日期显示格式。
- 注意事项:
- 日期格式依赖系统区域设置,字符串转换时需确保兼容性。
- 使用 IsDate 避免因无效日期导致错误。
七、系统与环境交互
7.1. Shell 函数
- 作用:执行外部程序或命令,并返回进程 ID(若成功)。
- 语法
Shell(pathname[, windowstyle])
- 参数
- pathname(必需)
- 类型:String
- 描述:要执行的程序路径或命令。
- 示例:"notepad.exe"、"C:\Program Files\MyApp\app.exe"
- windowstyle(可选)
- 类型:Integer
- 描述:控制程序窗口的显示方式,常用值如下:
vbHide (0):隐藏窗口
vbNormalFocus (1):正常窗口并获取焦点(默认)
vbMinimizedFocus (2):最小化窗口并获取焦点
vbMaximizedFocus (3):最大化窗口并获取焦点
vbNormalNoFocus (4):正常窗口但不获取焦点
vbMinimizedNoFocus (6):最小化窗口但不获取焦点
- 示例
Dim processID As Long
processID = Shell("notepad.exe", vbNormalFocus) ' 打开记事本并获取焦点
If processID <> 0 Then
Debug.Print "进程ID:" & processID
End If
7.2. Environ 函数
- 作用:获取操作系统环境变量的值(如系统路径、用户名等)。
- 语法
Environ({envstring | number})
- 参数
- envstring 或 number(必需)
- 类型:String 或 Integer
- 描述:
若为字符串,直接指定环境变量名(如 "TEMP")。
若为数字,表示环境变量在列表中的索引位置(从 1 开始)。
- 示例
Debug.Print Environ("USERNAME") ' 输出当前用户名(如 "John")
Debug.Print Environ(1) ' 输出第一个环境变量(如 "ALLUSERSPROFILE=C:\ProgramData")
7.3. SendKeys 函数
- 作用:向活动窗口发送键盘输入(模拟按键操作)。
- 语法
SendKeys(keys[, wait])
- 参数
- keys(必需)
- 类型:String
- 描述:要发送的按键字符串,支持特殊字符(需转义):
^ 表示 Ctrl(如 "^C" 为复制)
+ 表示 Shift
% 表示 Alt
{ENTER} 表示回车键
{TAB} 表示 Tab 键
完整列表参考 SendKeys 文档
- wait(可选)
- 类型:Boolean
- 描述:是否等待按键处理完成后再继续代码执行。
True:等待
False:不等待(默认)
- 示例
AppActivate "无标题 - 记事本" ' 激活记事本窗口
SendKeys "Hello World!{ENTER}", True ' 输入文本并回车
7.4. AppActivate 函数
- 作用:激活指定标题的应用程序窗口(需窗口标题匹配)。
- 语法
AppActivate(title[, wait])
- 参数
- title(必需)
- 类型:String
- 描述:窗口标题的部分或全部字符串(不区分大小写)。
- wait(可选)
- 类型:Boolean
- 描述:是否等待窗口激活后再继续代码。
True:等待
False:不等待(默认)
- 示例
AppActivate "Excel" ' 激活任意 Excel 窗口
AppActivate "预算表.xlsx", True ' 激活标题包含 "预算表.xlsx" 的窗口并等待
7.5 Beep 函数
- 作用:通过主板扬声器发出系统提示音。
- 语法
Beep
- 参数:无参数。
- 示例
Beep ' 发出“滴”声
7.6. Command 函数
- 作用:获取启动 VBA 宿主程序(如 Excel)时传递的命令行参数。
- 语法
Command
- 参数:无参数。
- 示例
假设通过命令行启动 Excel:
excel.exe /e "C:\data.txt"
在 VBA 中获取参数:
Debug.Print Command ' 输出 "/e C:\data.txt"
7.7. ChDrive 和 ChDir 函数
- 作用
ChDrive:切换当前驱动器(如从 C 盘切换到 D 盘)。
ChDir:切换当前目录。
- 语法
ChDrive drive
ChDir path
- 参数
- drive(必需)
类型:String
描述:驱动器字母(如 "D")。
- path(必需)
类型:String
描述:目标目录路径(如 "C:\MyFolder")。
- 示例
ChDrive "D" ' 切换到 D 盘
ChDir "D:\Data" ' 切换到 D:\Data 目录
总结
函数 | 关键用途 | 注意事项 |
Shell | 启动外部程序 | 路径需完整,注意权限问题 |
SendKeys | 模拟键盘输入 | 依赖活动窗口,可能因焦点变化导致失败 |
AppActivate | 精准控制窗口 | 窗口标题需唯一匹配 |
Environ | 读取系统变量 | 变量名需准确,区分大小写 |
Command | 获取命令行参数 | 需通过命令行启动宿主程序 |
通过组合这些函数,可以实现自动化脚本与操作系统的深度交互(如启动程序、模拟操作、读取配置等)。
下章预告:VBA与数据库