ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2018-2-7 01:11 | 显示全部楼层
本帖已被收录到知识树中,索引项:Windows API应用
本帖最后由 liucqa 于 2018-2-7 01:13 编辑

你讲的内容大约涉及到了聚光灯的三分之一左右的内容,期待继续完善下去。
如果喜欢技术交流,可以加入QQ群,看我的签名

TA的精华主题

TA的得分主题

发表于 2018-2-7 11:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主分享精神可嘉,一般人做的聚光灯的确是用单元格底纹实现的,代码简单,但是可能会影响到撤销、复制功能。

另外可见楼主对API比较熟悉。
可否帮我看看我的求助(回答不了没关系,可能该论坛应该没有人能解决吧):
http://club.excelhome.net/thread-1396007-1-1.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-8 10:17 | 显示全部楼层
本帖最后由 ggmmlol 于 2018-2-8 11:06 编辑
ivccav 发表于 2018-2-7 11:55
楼主分享精神可嘉,一般人做的聚光灯的确是用单元格底纹实现的,代码简单,但是可能会影响到撤销、复制功能 ...

你上面给的链接的帖子,我去看了,等我这个主题贴完成了,可以试着回答一下,或者你也可以按我下面的提示方向去完善代码。
这里,可以简单指出那段代码的问题所在:
它没有能像TextBox控件一样有足够完善的键盘、鼠标消息处理机制,即没有处理按方向键或鼠标键这样特定按键的消息,导致移动光标的行为被“忽视”,所以不能返回你想要的结果。

所以,你可以有两种方式去完善代码:
其一、把指定的单元格对象完善成一个“TextBox”控件,
其二、返回的内容不采用你自己捕获的按键消息,而是返回由单元格对象处理地过的内容:如Range.Text、Range.Characters、Range.Formula、Range.Value


此外,还有第三种方式:回到你那段代码的原本用途本身来解决。
你那段代码是为了替代“长相难看”的TextBox控件而编写的,但是你可以用我这个主题中用到的方法,给TextBox控件做“美容”,使其无边框、图层接近完全透明,但优先接收键盘和鼠标消息。

这第三种方式最简单,而效果最可靠。
说到这里,我也正好介绍这个对单元格作行列指示的“导航灯”小工具的诞生原因:它原本就是为了解决我本系列加载宏小工具的第一个——单元格“快录助手”(功能就是“模糊搜索、智能提示、自动完成关联输入”)——的美化而诞生的。
因为这个“快录助手”,需要把TextBox控件和ListBox控件显示在指定的单元格位置,并适合其大小,一般方式是把这两个控件插入到文档中,但这样一来,则只能做成模板,而不适合做成为加载宏,而且是每个需要用到这项功能的工作表中都需要添加这两种控件,以及相关代码,模板的通用程度就很差;而且很多用来录入数据的表格并不希望保存为含有宏的格式。
现在,有了这个“导航灯”所积累的技术和基本代码,我打算在此主题之后接下来就是把第一个小工具给做完善了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-8 12:34 | 显示全部楼层
通过本例中演示的对窗口图形的处理方法,让很多在本论坛里一些很“高大上”的VBA图形处理工具,将被掀起其神秘面纱的一角。
比如:
定位到某个窗口的边界范围,(或用鼠标划取的范围),然后获取该范围的图形,保存为某种图片格式(或剪贴板中),就成为了VBA版的截图软件;
如果再沿指定线段绘制锯齿状的曲线,作为窗口图形面域裁剪(即作减集运算)的边界,就可以使图片有“撕纸”效果了;

再比如:
某位大神用GifGifGif软件录制的动画中,也像专业录屏软件录制的一样,有小的黄圆环图形跟随鼠标,甚至在鼠标按键时还能做波纹状的动态变化,来提示进行了鼠标按键动作。
其原理就是,利用API中有关鼠标事件的过程、函数,获取鼠标指针的屏幕坐标,让图形动态的定位在这一系列的坐标上,就实现了图形的鼠标指针跟随效果;而圆环状的图形,可以通过设置窗口的面域为圆形并在其上绘制一个小圆而得到。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-8 13:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
仍然回归本主题。
59楼的示例附件,用累计各行高、各列宽的办法,来实时获取某个单元格对A1单元格的相对坐标。当这个目标单元格的位置接近于工作表的最末行、最末列时,就需要几秒钟的时间才能完成计算(我的机器上运行上面附件的示例代码,用时约3.5秒)。这就带来很明显的顿滞感,要想达到实用,还需要进一步优化代码的效率。

优化代码,通常应该从算法优化着手。对于VBA,还可以升级为VB来提升部分效率,毕竟后者是编译过的,比前者这种解释型的代码效率高。
但还有一种方式,我把它称作“让步优化”,也就是去掉代码中耗费时间和资源较多、但并不大实用的功能,以小的牺牲换得较大的效率提升。

我们的“导航灯”也可以采用这种“让步优化”。这正是来源于PointsToScreenPixelsX、PointsToScreenPixelsY的工作原理。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-8 13:51 | 显示全部楼层

当EXCEL窗口的显示比例设置为非100%的整数倍时,行高、列宽的屏幕像素理论值可能是小数,而实际需要为整数,在取整过程中就有0.5像素以内的舍入误差,这种误差累积起来,当行列数较多时就非常明显。
在Excel2007格式的工作簿中,最大行号达百万以上,如果每行误差0.5像素(当窗口比例为50%时,就有可能发生),在表格底部的单元格,以上述的PointsToScreenPixelsY方法定位其纵向坐标,它仅直接做理论计算后取整,没有考虑各行的误差累计,因此其计算的结果偏差可达到50万像素以上。
以常用的屏幕显示分辨率——96像素每英寸——计算,位置偏差就达0.5万英寸以上,可谓是“差之毫厘,失之千里”。而即使只对于第100行,误差也可达50像素,约0.5英寸,约1.3厘米,(1英寸=2.54厘米),而EXCEL表格默认11号字体时的默认自动行高为18像素,这个误差接近其三个行高。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-8 13:55 | 显示全部楼层
但是,如果EXCEL窗口的显示比例是100%的整数倍时,各行高列宽的屏幕显示像素都不存在取整的舍入误差,这时由PointsToScreenPixelsX、PointsToScreenPixelsY计算出来的坐标,就是准确的,所以是直接可用的。

如果只需要“导航灯”在窗口显示比例为100%的整数倍的时候才工作,那就可以用PointsToScreenPixelsX、PointsToScreenPixelsY计算单元格的屏幕坐标,这对于定位接近工作表最底部的单元格来说,计算效率是近百万倍的提升。

而在实际应用中,如果以小于100%的比例查看数据,往往也只是为了看页面布置效果而非表格内容,这时通常不需要作行列指示。让“导航灯'只在窗口显示比例为100%的整数倍时才工作,也并不影响其实用价值。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-8 14:23 | 显示全部楼层
所以,我将首先给出一个用上述方式“让步优化”过的“导航灯”加载宏,它允许设定你喜欢的Color(论坛用Discuz!建站,其用于帖子自动审核的代码对某个字太过敏感,只好掉个“洋文书包”,并吐槽一下"Discuz!"),允许选择”导航灯“的样式(行、列、行+列、单元格区域 共4种可选)。只是它需要在窗口显示比例为整数时才工作,如果窗口比例不是整数,它将提示、并等待你手动调整窗口显示比例为Excel允许范围内最接近的整数,或者请你关闭它。

TA的精华主题

TA的得分主题

发表于 2018-2-8 17:47 | 显示全部楼层
ggmmlol 发表于 2018-2-8 10:17
你上面给的链接的帖子,我去看了,等我这个主题贴完成了,可以试着回答一下,或者你也可以按我下面的提示 ...

“模糊搜索、智能提示、自动完成关联输入”功能我也用过多次,就是在单元格上覆盖一个textbox,利用其change事件捕获输入内容,用listbox显示。但是textbox真的不是很好看,还有就是你说的代码没有通用性,还有可能使用者无意中把textbox删掉了(原因不明,可能是运行错误导致textbox显示后无法隐藏吧)。用单元格响应按键事件就完美了,就像Excel2007输入公式时的提示那样,无需等待输入完毕。我是不懂API,代码中的API根据英文名称还是能理解的,但是要运用就勉为其难了。期待你的大作了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-9 22:41 | 显示全部楼层
本帖最后由 ggmmlol 于 2018-2-9 22:43 编辑

导航灯.rar (51.41 KB, 下载次数: 512)

评分

4

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-18 08:32 , Processed in 0.042797 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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