ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 86886|回复: 209

[原创] 【重磅发布】:聚光灯——我的加载宏系列小工具【单元格小工具】之四

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2018-2-1 20:35 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:Windows API应用
本帖最后由 ggmmlol 于 2018-2-2 12:46 编辑

这个主题,我打算先简要地介绍我的“导航灯”VBA加载宏程序的整体设计思路,也就是做一个“导航灯”的设计原理教程吧。其中将包含与窗口相关的最常用的一些API使用。
如果本贴能有不错的人气支持,而且其中给本贴捧场的老铁杆级以上的会员所占分量足的话,可以考虑后续公开完整源码,当然,如果大家都兴趣缺缺的话,那也就此罢了。


先还是来两张图吧:
导航灯.png
【单元格】导航灯2.gif

评分

22

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-12 23:55 | 显示全部楼层
本帖最后由 ggmmlol 于 2018-2-13 13:38 编辑

“导航灯”更新,现在可支持Office2003及以上版本的32位或64位EXCEL程序,因此命名第一个版本号为“导航灯V0.9”,欢迎测试、使用。
由于本人的机器上没有安装64位EXCEL,所以请有此条件的朋友下载使用后,反馈一下存在的Bug和改进建议。

导航灯.rar

105.62 KB, 下载次数: 3288

评分

7

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-1 21:24 | 显示全部楼层
所谓聚光灯,我更愿意称之为“导航灯”。
因为它是以突出的颜色对单元格的行、列做标示,以防止看错行或列的工具。由于它是指示方向的,而“导航”既有指引方向的意思,又谐音“导行”,以此为名,最合适不过了。

根据以上概述,可以得出一个结论:如果要完美地实现“导航”,即在不影响EXCEL本身的功能、不修改EXCEL文档任何内容的前提下实现对单元格的行、列指示功能,仅靠EXCEL VBA本身提供的对象、方法是不可能成功的。
论坛里目前能找到的有“导航灯”(“聚光灯”)功能的一些简单的代码,通常都是使用单元格的格式或条件格式对象,这种方式就会破坏EXCEL原有的撤消、恢复功能,也会影响表格的的格式。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-1 21:36 | 显示全部楼层
所以,可以完美实现这个目标的办法最终都离不开对Windows系统API的应用。
此前,有一个帖子,提到过用Windows GDI对屏幕直接绘图的办法,来实现“导航灯”的功能,并提供了VBA源代码,算是相对最靠谱的办法了。
可惜的是该方法在Excel2013以及更新的版本中失效了,因为这些新的EXCEL版本采取了不同于GDI的显示方式,会自动刷新掉GDI对屏幕直接绘图的效果,使得GDI的绘图结果只能是“一闪而过”。
此外,该帖子中的示例代码还有两个缺陷:一是对单元格的位置计算还存在缺陷,当窗口中的表格行列标题、公式编辑栏、滚动条、工作表标签栏的显示与否被改变时,有可能计算出的是错误的位置,导致“定位”明显偏差;二是该代码对由于EXCEL窗口显示比例改变而产生的单元格显示位置与理论位置的“系统误差”未能提供有效的修正措施。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-1 22:20 | 显示全部楼层
对上述方法的分析,可以得到一些结论:
1、GDI对屏幕直接绘图的办法,在新版本的EXCEL中不可行,但不绘图的办法是不存在的,所以必须要有一个变通的办法,使得所绘的图形不会被EXCEL刷新掉。
2、需要仔细地分析EXCEL的工作窗格中的每一种结构元素,并求得其位置和大小,或在计算中“抵消”掉其位置、大小对于单元格的位置计算的影响。这些结构原素主要有工作表的行列标题、工作表标签、滚动条,以及分组(分级)显示时出现的方框引线,还可能有任务窗格等占据的位置、大小。

3、需要分析由于窗口显示比例变化时产生的显示位置与理论位置的偏差的形成原因。由于这种误差,按误差理论,是属于“系统”误差,而系统误差虽然不可能消除,但可以通过一些方法来抵消其影响,即“误差修正”。合理的“误差修正”方法,可以使“系统误差”带来的影响减少到可忽略不计的程度。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-1 22:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
进一步分析:
1、要使所绘的图形不会被刷新掉,则要为这些图形提供一个合适的载体,这种载体本身是不会被某种显示方式所刷新掉。
而在Windows系统中,最合适的图形载体,自然非Window莫属了。以Window作为图形载体,要使之仅作为指示标识而存在,则需要使这个Window具有两个方面的“透明”特征:
第一、图层的图形透明,使其下方的图形可见;
第二、对鼠标、键盘的按键消息“透明”,使这些消息可以“穿透”它而直达其下方的EXCEL窗口。
在WIndows系统中,这种窗口自然也是有的,比如有的桌面日历,就是图形透明的,镶嵌在桌面上,对于鼠标消息,也可以“无反应”,整体上好像“融入”了桌面图形中,对它的操作,需要通过其在任务栏上的图标或开始菜单项等来间接执行。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-1 23:07 | 显示全部楼层
由上分析,可知以Window作为图形载体的变通的绘图方式,必定是可行的。
其具体实现,当然要用到Windows API了。
一方面,是最基本的,必须包含对Window的 [查找]、[风格属性获取]、[风格属性修改]的相关API函数。
另一方面,则是对Window的图形进行处理的API,包括对Window的位置、大小、形状、颜色等图形属性获取、修改的API函数。

TA的精华主题

TA的得分主题

发表于 2018-2-1 23:59 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-2 09:01 | 显示全部楼层
liucqa 发表于 2018-2-1 23:59
http://club.excelhome.net/thread-1382553-1-1.html

其实这玩意处理起来麻烦事很多的

感谢大学习委员前来捧场!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-2 10:00 | 显示全部楼层
接6楼。
我们来尝试做一个具有“双透明”特征的窗口。

首先,要生成一个普通窗口。
这可以用Win API函数CreateWindowEx来实现,而现在是在EXCEL VBA环境里,所以我们只需要简单地在VBE里“插入-用户窗体”而得到一个具有默认大小的窗体,然后使用Show方法使该窗体显示出来,就可以实现。

如下图,已经按上述方法插入了一个用户窗体“UserForm1”。
可以看到,这是一个包含标题栏,并具有“关闭”按钮(但没有最大化、最小化按钮)的空窗体。它的默认位置和大小,可以使用UserForm1的Left\Top\Width\Height属性获得。

我们做一个试验:在VBE的“立即”窗口中,输入'Debug.Print UserForm1.Left, UserForm1.Top, UserForm1.Width,  UserForm1.Height'语句并回车,该命令首先会使窗体以默认的位置、大小显示出来,然后获得其位置、大小属性值显示在VBE的“立即”窗口中,如图所示,其结果为:“ 0             0             240           180”
UserForm1.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-2 10:14 | 显示全部楼层
使用Windows API来操作窗口,都需要通过窗口的句柄“Handle”来进行。
所谓“句柄”,它是一个长整型的(Long)数据,用来唯一地标识了一个存在的窗口,它是在窗口生成的同时由系统赋予于此窗口、并伴随窗口“终身”,你可以把它理解为窗口的“身份证号码”。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-4 00:59 , Processed in 0.058100 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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