Access 通用功能源码:自动定位输入框的日期时间与年月选择器
hi,大家新快乐!
Access 从 2007 版开始已经内置了日期选择器,文本框格式设置为日期型后,右侧会自动出现一个小日历图标。但这个内置功能有几个明显局限:
-
老格式不支持:.mdb 格式的旧库没有这个功能
-
没有年月选择:只能逐月翻页选日期,无法直接选”某年某月”,在账期、报表筛选等场景下操作繁琐
-
界面较简陋:样式陈旧,不支持自定义,也没有时间选择部分
这个项目的出发点就是在不依赖任何外部控件的前提下,用标准模块 + Access 窗体自己实现一套更完整的日期输入组件,同时覆盖日期时间选择和年月选择两种场景。 项目已开源,源码见文末链接。
一个比较稳妥的思路是:完全不依赖外部控件,用标准模块 + Access 窗体自己做一个。这篇文章记录的就是这个实现过程,项目已开源,源码见文末链接。
日期时间选择器
左侧是经典的日历网格,右侧是小时/分钟滚动列表。当前月日期黑色显示,非当月灰色,今天蓝色边框,选中日期蓝色背景白字。鼠标悬停时还有浅蓝色高亮效果,交互体验接近现代 Web 日期选择器。


年月选择器
4 列 × 3 行的月份网格,支持按年、按十年快速翻页,适用于报表筛选、账期选择等只需要”年+月”的场景。

这个项目的核心设计理念是 “纯标准模块 + 表达式事件绑定”,具体来说:
1. 零窗体代码
生成的 frmDatePicker 和 frmYearMonthPicker 窗体本身没有任何代码模块。所有逻辑都写在标准模块(Module_DatePicker.bas / Module_YearMonthPicker.bas)中。
2. 表达式事件绑定
控件的事件不是通过窗体代码模块的 Private Sub 来响应,而是直接在控件属性中写表达式:
OnClick = "=DatePicker_DayClick(1)"OnMouseMove = "=DatePicker_DayMouseMove(1)"
这种方式的好处是:窗体可以完全由代码自动生成(CreateForm + CreateControl),不需要手动在设计视图中操作,真正实现一键部署。
3. 窗体自动构建器
导入 .bas 模块后,只需在立即窗口执行一行命令,构建器就会自动创建窗体、布局控件、绑定事件:
CreateDatePickerForm ' 创建日期时间选择器CreateYearMonthPickerForm ' 创建年月选择器
再次执行会自动删除旧窗体并重建,方便迭代调整。
4. Win32 API 精准定位
在下拉模式下,选择器窗体会精准定位到文本框正下方,就像一个真正的下拉控件。这是通过 GetFocus → GetWindowRect → MoveWindow 这组 Win32 API 实现的,同时兼容 32 位和 64 位 Access。
5. 鼠标悬停效果
42 个日期格子(或 12 个月份格子)都绑定了 OnMouseMove 事件。通过模块级变量 m_iHoverCell 跟踪上一个悬停位置,实现了高效的悬停高亮切换——只刷新变化的两个格子,而不是整个网格,避免了闪烁。
第一步:导入模块
从 GitHub 下载 .bas 文件,在 VBA 编辑器中 文件 → 导入文件:
-
Module_DatePicker.bas— 日期时间选择器 -
Module_YearMonthPicker.bas— 年月选择器(按需导入)
第二步:创建窗体
在立即窗口(Ctrl+G)中运行:
CreateDatePickerForm
第三步:调用 API
最简用法——一行代码弹出选择器:
Dim dt As Variantdt = ShowDatePicker()IfNot IsNull(dt) Then MsgBox "选择了: " & dt
绑定文本框——双击弹出、选完自动回写:
' 在窗体的 Form_Load 中AttachDatePicker Me, "txtOrderDate"' 日期+时间AttachDatePicker Me, "txtBirthday", False' 仅日期AttachYearMonthPicker Me, "txtMonth", "yyyy-mm"' 年月
零代码绑定——直接在属性表中写表达式:
=PickDateForCtl("frmOrder","txtDate",True)
这意味着你甚至不需要打开 VBA 编辑器,直接在控件属性里粘贴一行表达式就能用。
自定义输出格式
PickDateFor Me.txtDate, False, "yyyy-mm-dd"PickYearMonthFor Me.txtMonth, "yyyy年mm月"
自动扫描绑定
如果你的窗体上有大量日期字段,可以一键全部绑定:
AttachDatePickerAll Me' 自动识别名称含 date/日期/time 的文本框AttachDatePickerAll Me, "dt"' 匹配 dt 开头的文本框
修改主题色
模块顶部的颜色常量可以轻松替换:
PrivateConst CLR_BLUE AsLong = 16024898' 改成你喜欢的颜色PrivateConst CLR_HOVER AsLong = 16576233' 悬停色
| 环境 | 支持情况 |
|---|---|
| Access 2003~2024/ 365 | ✅ |
| 32 位 / 64 位 | ✅ |
| .accdb / .mdb | ✅ |
| 运行时版本 (Runtime) | ✅ |
完整源码
项目已开源,欢迎 Star ⭐:
GitHub 地址:https://github.com/miaowei2/access-datepicker
包含:
-
Module_DatePicker.bas— 日期时间选择器(含构建器 + API + 事件处理) -
Module_YearMonthPicker.bas— 年月选择器(独立模块,可单独使用) -
详细的使用说明文档
下载后直接导入即可使用,无需任何额外配置。
Access 虽然”老”,但在中小企业、政府机关、制造业中依然有着广泛的应用。很多运行多年的 Access 系统,承载着核心业务数据,短期内不可能迁移到其他平台。
与其抱怨 Access 的种种不足,不如用技术手段去改善它。一个好用的日期选择器看似是小事,但它直接影响一线操作人员的录入效率和数据质量。
如果你的团队正在使用 Access,或者你是一名 Access 开发者,欢迎试用这个开源组件。 如果觉得有用,请帮忙转发给更多需要的人。
在 Access 开发中遇到任何问题,也欢迎在公众号后台留言交流。我会持续分享 Access 实战技巧和开源工具,帮助大家把这个”老伙计”用得更顺手。
Access 开发」专注于 Microsoft Access 开发与企业级应用,提供以下服务:
📚 技术培训
-
Access VBA 从入门到精通(线上/线下)
-
Access + SQL Server 企业级开发实战
-
Access 系统性能优化与架构设计
💼 定制开发
-
企业 ERP/CRM/进销存等系统开发
-
旧系统升级与性能优化
🔧 技术支持
-
代码审查与重构建议
-
疑难问题远程诊断
-
一对一技术辅导
联系方式:
-
公众号后台留言
-
邮箱:will.miao@edonsoft.com
-
微信:edonsoft
技术改变业务,专注创造价值。

夜雨聆风

