乐于分享
好东西不私藏

Access 通用功能源码:自动定位输入框的日期时间与年月选择器

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

技术改变业务,专注创造价值。

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » Access 通用功能源码:自动定位输入框的日期时间与年月选择器

评论 抢沙发

7 + 2 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮