Access 通用功能源码:自动定位输入框的日期时间与年月选择器
Access 从 2007 版开始已经内置了日期选择器,文本框格式设置为日期型后,右侧会自动出现一个小日历图标。但这个内置功能有几个明显局限: 这个项目的出发点就是在不依赖任何外部控件的前提下,用标准模块 + Access 窗体自己实现一套更完整的日期输入组件,同时覆盖日期时间选择和年月选择两种场景。项目已开源,源码见文末链接。 左侧是经典的日历网格,右侧是小时/分钟滚动列表。当前月日期黑色显示,非当月灰色,今天蓝色边框,选中日期蓝色背景白字。鼠标悬停时还有浅蓝色高亮效果,交互体验接近现代 Web 日期选择器。 4 列 × 3 行的月份网格,支持按年、按十年快速翻页,适用于报表筛选、账期选择等只需要"年+月"的场景。 这个项目的核心设计理念是 "纯标准模块 + 表达式事件绑定",具体来说: 1. 零窗体代码 生成的 2. 表达式事件绑定 控件的事件不是通过窗体代码模块的 这种方式的好处是:窗体可以完全由代码自动生成( 3. 窗体自动构建器 导入 再次执行会自动删除旧窗体并重建,方便迭代调整。 4. Win32 API 精准定位 在下拉模式下,选择器窗体会精准定位到文本框正下方,就像一个真正的下拉控件。这是通过 5. 鼠标悬停效果 42 个日期格子(或 12 个月份格子)都绑定了 从 GitHub 下载 在立即窗口(Ctrl+G)中运行: 最简用法——一行代码弹出选择器: 绑定文本框——双击弹出、选完自动回写: <!-- 图片位置:绑定文本框后的实际交互效果(双击弹出、选择、回写) --> 零代码绑定——直接在属性表中写表达式: 这意味着你甚至不需要打开 VBA 编辑器,直接在控件属性里粘贴一行表达式就能用。 如果你的窗体上有大量日期字段,可以一键全部绑定: 模块顶部的颜色常量可以轻松替换: 项目已开源,欢迎 Star ⭐: GitHub 地址:https://github.com/miaowei2/access-datepicker 包含: 下载后直接导入即可使用,无需任何额外配置。 Access 虽然"老",但在中小企业、政府机关、制造业中依然有着广泛的应用。很多运行多年的 Access 系统,承载着核心业务数据,短期内不可能迁移到其他平台。 与其抱怨 Access 的种种不足,不如用技术手段去改善它。一个好用的日期选择器看似是小事,但它直接影响一线操作人员的录入效率和数据质量。 如果你的团队正在使用 Access,或者你是一名 Access 开发者,欢迎试用这个开源组件。 如果觉得有用,请帮忙转发给更多需要的人。 在 Access 开发中遇到任何问题,也欢迎在公众号后台留言交流。我会持续分享 Access 实战技巧和开源工具,帮助大家把这个"老伙计"用得更顺手。 Access 开发」 专注于 Microsoft Access 开发与企业级应用,提供以下服务: 📚 技术培训 Access VBA 从入门到精通(线上/线下) Access + SQL Server 企业级开发实战 Access 系统性能优化与架构设计 💼 定制开发 企业 ERP/CRM/进销存等系统开发 旧系统升级与性能优化 🔧 技术支持 代码审查与重构建议 疑难问题远程诊断 一对一技术辅导 联系方式: 公众号后台留言 微信:edonsoft 技术改变业务,专注创造价值。背景
它长什么样?
日期时间选择器


年月选择器

技术架构:为什么选择这种实现方式?
frmDatePicker 和 frmYearMonthPicker 窗体本身没有任何代码模块。所有逻辑都写在标准模块(Module_DatePicker.bas / Module_YearMonthPicker.bas)中。Private Sub 来响应,而是直接在控件属性中写表达式:OnClick = "=DatePicker_DayClick(1)"
OnMouseMove = "=DatePicker_DayMouseMove(1)"CreateForm + CreateControl),不需要手动在设计视图中操作,真正实现一键部署。.bas 模块后,只需在立即窗口执行一行命令,构建器就会自动创建窗体、布局控件、绑定事件:CreateDatePickerForm ' 创建日期时间选择器
CreateYearMonthPickerForm ' 创建年月选择器GetFocus → GetWindowRect → MoveWindow 这组 Win32 API 实现的,同时兼容 32 位和 64 位 Access。OnMouseMove 事件。通过模块级变量 m_iHoverCell 跟踪上一个悬停位置,实现了高效的悬停高亮切换——只刷新变化的两个格子,而不是整个网格,避免了闪烁。怎么用?三步上手
第一步:导入模块
.bas 文件,在 VBA 编辑器中 文件 → 导入文件:Module_DatePicker.bas — 日期时间选择器Module_YearMonthPicker.bas — 年月选择器(按需导入)第二步:创建窗体
CreateDatePickerForm
第三步:调用 API
Dim dt As Variant
dt = ShowDatePicker()
If Not IsNull(dt) Then MsgBox "选择了: " & dt' 在窗体的 Form_Load 中
AttachDatePicker Me, "txtOrderDate" ' 日期+时间
AttachDatePicker Me, "txtBirthday", False ' 仅日期
AttachYearMonthPicker Me, "txtMonth", "yyyy-mm" ' 年月=PickDateForCtl("frmOrder","txtDate",True)进阶玩法
自定义输出格式
PickDateFor Me.txtDate, False, "yyyy-mm-dd"
PickYearMonthFor Me.txtMonth, "yyyy年mm月"自动扫描绑定
AttachDatePickerAll Me ' 自动识别名称含 date/日期/time 的文本框
AttachDatePickerAll Me, "dt" ' 匹配 dt 开头的文本框修改主题色
Private Const CLR_BLUE As Long = 16024898 ' 改成你喜欢的颜色
Private Const CLR_HOVER As Long = 16576233 ' 悬停色兼容性
环境 支持情况 Access 2010 / 2013 / 2016 / 2019 / 365 ✅ 32 位 / 64 位 ✅ .accdb / .mdb ✅ 运行时版本 (Runtime) ✅ 完整源码
Module_DatePicker.bas — 日期时间选择器(含构建器 + API + 事件处理)Module_YearMonthPicker.bas — 年月选择器(独立模块,可单独使用)写在最后