ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 果然是个坑-Excel vba 聚光灯。。。文末附上自己做的加载项(迷你版)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-3-2 23:11 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 墨苏ycycc 于 2023-3-3 00:27 编辑

开头容我吐槽下office官方,多少年了,聚光灯这么香的功能居然还要让我等万千Exceler操心,都什么鬼玩意儿策划
下面分享下我的开发测试心路历程(之所以选择开发,因为公司电脑不方便安装诸如某方格子等其他插件)
文章末尾会上xlam附件(源码可编辑)
各位看官前辈若有雅兴,可否不吝指点一二,小弟不胜感激
-------------------------------------------------------------------------------------------------------------------------------------------------------------
由于知道wps自带的阅读模式,眼热了很久很久。
近期出于工作原因,想在Excel里也实现类似功能便于日常数据查看(一切万恶的源头啊)。。。
于是乎开始资源整合(期待度娘搜现成,Then Ctrl+A,Ctrl+C,Ctrl+V)。。。

首先是第一个靓仔,条件格式+vba辅助
参考链接如下
巧用Excel制作炫酷聚光灯效果,数据查看太方便了 - 知乎 (zhihu.com)
可我不想每张表格都加条件格式(公司清单文件大几千份),好麻烦(这次真不是我懒),含泪pass......

接着靓仔二号,纯vba,很香
参考链接如下
Excel聚光灯加载宏【VBA】-百度经验 (baidu.com)
代码很简单,我很喜欢(实为水平有限,只看得懂简单的)
测试下来后只有一个问题,就是它:
Cells.Interior.Pattern = xlPatternAutomatic 用作一个恢复功能
原始单元格填充样式保留了!,牛X,双击666,但事情真那么简单嘛
网格线全没了。。。其余空白单元格全填充成了白色......原来你竟然是这样的保留。。。心态值-1分
既然Automatic不行,那0嘞?
Cells.Interior.Pattern = 0
咦?貌似不会整张表刷白,网格线还在,哈哈哈(仰天大笑3秒)
等等,我原来的填充嘞,不,整张表所有的填充嘞!嗯?。。。。。。沃了个大(文明用语)心态值-2分
无限套娃嘛这不是,鱼与熊掌不可兼得,强迫症果断不能忍,于是拿出我的大宝剑:
dim mycells as range
for each mycells in target.entirecolumn
   if ... then
      else
   end if
next
for each mycells in target.entirerow
   if ... then
      else
   end if
next

遍历,挨个设置,该Automatic的Automatic,该0的0,
结果当然是成功的,但是!无意间做了道菜,曰:《红烧CPU》,遂弃之,心态值-10086分
就在心态即将崩盘之余
淘到了一份宝藏贴,直接给跪了啊,这才是正真的聚光灯!

果然民间出大神,本站
链接在此
【重磅发布】:聚光灯——我的加载宏系列小工具【单元格小工具】之四-Excel VBA程序开发-ExcelHome技术论坛 -
大致概括下:
需调用windows API
建立自定义透明窗体,消息穿透,颜色透明
在自定义窗体上GDI绘图,生成异型窗体
依据选区设置异型窗体大小、确切位置
一顿骚操作下来实现完全脱离Excel的聚光灯效果,不影响原生表格数据。
有点惋惜的是大神并没有放出最终完全版,凭我目前三脚猫,没能力在他源码上去完善,只能空感叹。
当然,看了大神那么多骚操作,收获不小,也获得了灵感。

千呼万唤始出来
我的聚光灯-迷你版
在看了大神的操作后,仔细想了下《红烧CPU》;既然异型窗体可以通过绘图得到任意形状,那我的目标作用选区呢,
我给它缩小范围,不需要整行整列范围,可见窗口范围就行。
于是,终于等到了你,区域布尔运算:

Dim  lightrng As Range
Set lightrng = Intersect(ActiveWindow.VisibleRange, Union(Selection.EntireRow, Selection.EntireColumn))
先union并集,再intersect交集得到了可见范围的一个十字区域;大宝剑又要祭出了
将十字选区lightrng根据判断分成两个选区:
public nullcells as range  '无任何填充的空单元格
public colorcells as range '有底色的单元格,白色也算
'这两个是全局变量,后面要要用来套娃的。。。

  For Each mycells In lightrng
      If mycells.Row <> Selection.Row Or mycells.Column <> Selection.Column Then
      '这里我要吐槽,坑爹的微软,有并集、交集、唯独没补集(可能没找到,就当他没有了)
      '只能再加一层判断,导致我的if else 看着跟屎山一样。。。。。。心态值 -2^10086分
           If mycells.Interior.Pattern = xlNone Then
                  If nullcells Is Nothing Then
                     Set nullcells = mycells
                    Else
                     Set nullcells = Union(mycells, nullcells)
                  End If
           Else
                  If colorcells Is Nothing Then
                     Set colorcells = mycells
                    Else
                     Set colorcells = Union(mycells, colorcells)
                  End If
           End If
      End If
  Next
选区分好,前道工序做完,下面直接简单说原理逻辑(不码代码了,附件里有的。。。我真的不是懒):
lightrng设置条件格式(十字聚光灯出现在表格里了)
鼠标换个地方点一下,触发sheetselectionchange事件
nullcells.interior.Pattern=0
colorcells.interior.Pattern=1
set nullcells=nothing
set colorcells=nothing
lightrng设置条件格式
鼠标换个地方点一下,触发sheetselectionchange事件
然后就是套娃,套娃,套娃。。。果然无限套娃才是永动机,至此可以解释为啥这个聚光灯是迷你版,因为CPU不能红烧

打开.png
关闭.png
示例.png

聚光灯-迷你版.rar

19.36 KB, 下载次数: 182

真-迷你版

评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-3-3 08:58 | 显示全部楼层
不错不错,学习可加

TA的精华主题

TA的得分主题

发表于 2023-3-3 09:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我用wps.自带聚光灯.,转wps两年了.wps除了与office的兼容性.其他都完胜

TA的精华主题

TA的得分主题

发表于 2023-3-3 10:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 leikaiyi123 于 2023-3-3 14:18 编辑

我一直用附件中的加载项,很不错。RegSvr32 /s ExcelColorChange.dll

ExcelColorChange.rar

66.32 KB, 下载次数: 88

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-3 11:50 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
雪之花 发表于 2023-3-3 08:58
不错不错,学习可加

学无止境

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-3 11:50 来自手机 | 显示全部楼层
369659139 发表于 2023-3-3 09:56
我用wps.自带聚光灯.,转wps两年了.wps除了与office的兼容性.其他都完胜

确实,wps是懂国人的

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-3-3 11:51 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
leikaiyi123 发表于 2023-3-3 10:33
我一直用附件中的加载项,很不错。

这个应该怎么用呀,com加载项好像不行,我的是2016版

TA的精华主题

TA的得分主题

发表于 2023-3-3 14:19 | 显示全部楼层
墨苏ycycc 发表于 2023-3-3 11:51
这个应该怎么用呀,com加载项好像不行,我的是2016版

RegSvr32 /s ExcelColorChange.dll

TA的精华主题

TA的得分主题

发表于 2023-3-4 20:57 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-3-5 01:24 | 显示全部楼层
一个特定条件的条件格式的方式

  1. Public WithEvents app As Excel.Application

  2. Private Sub app_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
  3.    
  4.     '选中区域变化时变化聚光灯
  5.     If f1 = True And Target.Columns.Count <> Cells.Columns.Count And Target.Rows.Count <> Cells.Rows.Count Then '选中整行 和 整列 时不显示
  6.         On Error Resume Next
  7.         
  8.         focuslamp.Delete '方法2
  9.         
  10.         Set focuslamp = Union(Target.EntireRow, Target.EntireColumn).FormatConditions.Add(Type:=xlExpression, Formula1:="=true=true")
  11.         
  12.         focuslamp.Interior.Color = RGB(204, 255, 204)
  13.         
  14.     End If
  15.    
  16. End Sub

  17. Private Sub app_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
  18.     Call DelFocuslamp(Wb)
  19. End Sub

  20. Private Sub app_WorkbookBeforePrint(ByVal Wb As Workbook, Cancel As Boolean)
  21.     Call DelFocuslamp(Wb)
  22. End Sub

  23. Private Sub app_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
  24.     Call DelFocuslamp(Wb)
  25. End Sub

  26. Sub DelFocuslamp(ByVal Wb As Workbook)
  27.     '打印/关闭/保存 时 如果聚光灯位于关闭关键 则需要删除
  28.     On Error Resume Next
  29.     If Not focuslamp Is Nothing Then
  30.         If focuslamp.Parent.Parent.Parent.Name = Wb.Name Then
  31.             focuslamp.Delete '方法2
  32.             Set focuslamp = Nothing
  33.         End If
  34.     End If
  35.    
  36.     'Wb.Save '如果保存此行 不适宜自动保存
  37. End Sub

复制代码


在没有删除干净的时候
  1. Sub 清除聚光灯()
  2.     Dim wb1 As Workbook
  3.     Dim sht As Worksheet
  4.     Set wb1 = ActiveWorkbook
  5.     聚光灯_关闭
  6.     On Error Resume Next
  7.    
  8.     For Each sht In wb1.Sheets
  9.         Err.Clear
  10.         fcount = 0
  11.         fcount = sht.Cells.FormatConditions.Count
  12.         If fcount > 0 Then
  13.             For Each f In sht.Cells.FormatConditions
  14.                 If f.Formula1 = "=TRUE=TRUE" Then
  15.                     f.Delete
  16.                 End If
  17.             Next
  18.         End If
  19.     Next
  20.    
  21. End Sub
复制代码

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-17 05:36 , Processed in 0.050539 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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