Excel常用技能分享与探讨(5-宏与VBA简介 VBA常用到的函数五)

前面各章的实例中或多或少都有用到一些函数,接下来将做一个汇总,对 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})
  • 参数
  • envstringnumber(必需)
  • 类型: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与数据库

原文链接:,转发请注明来源!