ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: prome3

[分享] UI设计自制日历窗体(无需注册MSCOMCTL.OCX)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2024-1-8 23:34 | 显示全部楼层
太难了,不容易。

还是图省事,用窗体糊弄做一个吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-9 20:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
micch 发表于 2024-1-8 23:34
太难了,不容易。

还是图省事,用窗体糊弄做一个吧

省事是一方面,稳定性是另一方面。就我有限的经验来说,直接用VBA的内置窗体比起自己用API做一个窗体然后在上面做控件更稳定,因为自己做窗体的话,有太多消息要处理,做不好的话容易导致Office软件崩溃。

当然,做得好、做得对的话还是有巨大的好处的,毕竟所有的东西都建立在API之上,用API可以做到VBA以及Office默认提供的东西所做不到的。只是,需要的代码量会很多很多。一分钱一分货吧。

网上其实还有收费的日历控件。刚刚我看了一下,有一款(EXCalendar)做成了COM/ActiveX控件,支持很多函数,支持事件,价格1000+人民币,背后的源码据官网称是(去掉注释和空行后)72289行。

2楼还嫌代码量太大了,殊不知高效和安全的组件往往意味着更多行的代码。就好像开车需要系安全带一样,虽然麻烦些,但保证了安全,可以在道路车速限制内把车开得快一些。如果要在不系安全带的情况下保证安全,就只能开得慢一些。对应到程序上也一样,运行速度快且安全的代码往往也要求更大的代码量。嫌麻烦或者“省去”麻烦,必然要付出代价。

兴许是在EH论坛内待久了,看多了那些就只有一个Sub的 code snippets,就觉得我这日历背后的代码太多了。说实话我自己也很喜欢那种一个Sub解决问题的代码片段,但是在生产环境中,要稳定、高效且安全地完成一个功能,需要的代码真的太多太多了。

TA的精华主题

TA的得分主题

发表于 2024-1-15 10:31 | 显示全部楼层
本帖最后由 szdcp 于 2024-1-15 10:32 编辑
prome3 发表于 2024-1-2 23:58
各位,新版来了。

版本号1.0.4

大神您好!

             本人VBA菜鸟,套用您的日历控件,运行就崩溃(Office2019标准版),请帮忙看看是啥原因,谢谢!

PZHZ1.7z

56.1 KB, 下载次数: 10

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-15 23:15 | 显示全部楼层
szdcp 发表于 2024-1-15 10:31
大神您好!

             本人VBA菜鸟,套用您的日历控件,运行就崩溃(Office2019标准版),请帮忙看 ...

已做修正,请见附件。

PZHZ1.zip

65.27 KB, 下载次数: 38

TA的精华主题

TA的得分主题

发表于 2024-1-15 23:41 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-1-16 09:01 | 显示全部楼层
本帖最后由 szdcp 于 2024-1-16 09:04 编辑
prome3 发表于 2024-1-15 23:15
已做修正,请见附件。

非常感谢您的帮忙,但是点击文本框旁边的日历控件就一直转圈,没反映,不知道是啥原因,可不可以不要控件,点击文本框即弹出日历窗直接选择?请帮忙看看。谢谢您!

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-16 20:24 | 显示全部楼层
szdcp 发表于 2024-1-16 09:01
非常感谢您的帮忙,但是点击文本框旁边的日历控件就一直转圈,没反映,不知道是啥原因,可不可以不要控件 ...

现在应该可以了,请见附件。

原先加一个日历的小图标,是因为 UserForm2 在显示时会自动把焦点给到第一个文本框里面,这会立即自动触发日历的显示。从用户体验的角度,这个现象会很奇怪,所以用了一个日历小图标来手动点击显示。现在去掉小图标,在 UserForm2 初始化事件里面先把焦点给到确认按钮,解决了这个问题。

然后,借此楼层说一下1.0.4及1.0.6版本中导致Excel崩溃的那个bug:
有一个名称为 InitCommonControlsEx 的枚举类型,该名称和对应的API名称冲突了。需要做如下修改:
  1. Private Type InitCommonControlsEx
  2.     dwSize As Long
  3.     dwICC As Long
  4. End Type
复制代码
改为
  1. Private Type LPINITCOMMONCONTROLSEX
  2.     dwSize As Long
  3.     dwICC As Long
  4. End Type
复制代码
,VBA7 API声明改为
  1. Private Declare PtrSafe Function InitCommonControlsEx Lib "Comctl32" (ByRef picce As LPINITCOMMONCONTROLSEX) As Boolean
复制代码
VBA6-中的API做对应更改就行。最后是变量声明部分,
  1. Private Function CreateCalendar(ByVal WindowCaption As String) As Boolean

  2.     Dim picce As InitCommonControlsEx
  3.     Dim rc As RECT
复制代码
改为
  1. Private Function CreateCalendar(ByVal WindowCaption As String) As Boolean

  2.     Dim icce As LPINITCOMMONCONTROLSEX
  3.     Dim rc As RECT
复制代码
感谢楼上 @duhong2024 的肯定和支持!


以上。

PZHZ1.zip

65.23 KB, 下载次数: 40

TA的精华主题

TA的得分主题

发表于 2024-1-17 09:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
prome3 发表于 2024-1-16 20:24
现在应该可以了,请见附件。

原先加一个日历的小图标,是因为 UserForm2 在显示时会自动把焦点给到第 ...

大神您好!不知啥原因,您修改后的程序我还是无法使用,点击文本框就无响应然后EXCEL崩溃重启,算了我放弃了,感谢您的支持与帮助,谢谢您!

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-17 19:03 | 显示全部楼层
szdcp 发表于 2024-1-17 09:32
大神您好!不知啥原因,您修改后的程序我还是无法使用,点击文本框就无响应然后EXCEL崩溃重启,算了我放 ...

我这边运行起来没有任何问题,也是 Microsoft Office 2019(64位):
运行效果.gif

网上有很多很多不基于 WINDOWS API 的日历控件,可以真真正正彻彻底底保证稳定运行。论坛内有很多,国外的也有。

至于国外的我比较喜欢的一款是 Trevor Eyre 做的,它的最新版已放到附件里面方便下载(注:控件代码和说明、示例文档都是英文的)。


感谢以往的肯定!

CalendarForm v1.5.2.zip

229.13 KB, 下载次数: 48

TA的精华主题

TA的得分主题

发表于 2024-1-23 23:18 | 显示全部楼层
看插入里---最后-日期

samradapps_datepicker.zip

123.91 KB, 下载次数: 31

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-14 15:02 , Processed in 0.043704 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表