VBA-原地取消公式

场景

不知道多少小伙伴和我一样,在用wps某个功能时,超级好用,但是office的excel中没有这个功能,例如,粘贴到可见单元格,如图:

图片失效!
感谢人美心善的同事小姐姐提供截图(博主电脑没有wps,office永不为奴!)

诞生之路

甚至在好长一段时间,在用到此项功能时,博主特意关闭excel、打开wps、复制粘贴可见单元格、关闭wps、打开excel,做表。

那怎么办啊,这个功能实在太好用了,尤其是在有众多筛选的情况下,原地取消公式,而不用担心复制再粘贴的数据错行。(嘴上说着不要,但是身体还是挺诚实的)

为了彻底摆脱wps的依赖(wps:你也不想你的老公excel知道我们之间的关系吧!~),博主决定采用VBA曲线救国,我们excel要有自己的原地取消公式,不能受制于wps!

在这种思维浪潮下,VBA-原地取消公式2.0应运而生(别问为什么没有1.0)。

话不多说,上代码!

Sub DisFormulas()
    '源代码原来于博主Leon,欢迎访问并留言
    ' 设置ws为分表类型
    ' sr      单元格区域
    ' cel     单元格
    ' sr_2    单元格区域
    Dim ws As Worksheet
    Dim sr As Range
    Dim cel As Range
    Dim sr_2 As Range
    ' 设置当前活动的工作表
    Set ws = ActiveSheet
    ' 关闭自动重算,vba运行速度
    Application.Calculation = xlCalculationManual
    ' 获取当前选区中可见的单元格
    Set sr = Selection.SpecialCells(xlCellTypeVisible)
    ' 再次筛选,选择sr可见单元格中的带有公式的单元格
    Set sr_2 = sr.SpecialCells(xlCellTypeFormulas)
     ' 遍历sr中的每个单元格
    For Each cel In sr_2
        ' 将单元格的值赋给当前单元格
        cel.Value = cel.Value
    Next cel
     ' 开启自动重算
   Application.Calculation = xlCalculationAutomatic
    
    ' 显示所有信息
   MsgBox "所选单元格公式已取消,感谢Leon!", vbExclamation, "完成!"
End Sub

请自行忽略其中乱七八糟的变量(在职场上,如果我牺牲了,我不希望我的代码被敌人捡起来就能使用!ps:何晨光的VBA是吧!)

由于主题设置的原因,所以VBA的代码主题的显示效果可能不是很好,大家可以直接复制到excel中的编辑器看效果。

VBA代码解释

Dim 区域设置关键的变量

Application.Calculation = xlCalculationManual

关闭当前工作表的自动重算,以提高VBA的运行速度,实测在大型工作表或公式繁多的表格中可有效提高速度;

后续代码中的循环每遍历一次,excel工作表中带有公式的相应单元格就要重算一次,如果不关闭自动重算,会浪费大量时间。

Set sr = Selection.SpecialCells(xlCellTypeVisible)
Set sr_2 = sr.SpecialCells(xlCellTypeFormulas)

设置两层筛选,

首层筛选筛选可见单元格,利用Range.SpecialCells方法,区域为Selection,即用户选择的区域,参数Type设置为xlCellTypeVisible,可见单元格,赋值给sr;

第二层筛选,区域为sr(首层筛选出的区域),方法一样,参数设置为xlCellTypeFormulas(带有公式的单元格)。

通过两次筛选即清理出用户想取消单元格的有效区域,防止后续遍历单元格做无用功(最主要的是节省时间,人生苦短,我用py…哦搞错了,我用VBA!)。

相应的方法、参数等文中加黑即为超链接,可点击跳转微软官方学习界面查看。

For Each cel In sr_2
    cel.Value = cel.Value
Next cel

循环区域,遍历经过筛选的每一个cel,使它们的值等于它们的值(好像废话,但VBA的语法就是这样,我也不明白)。

经过遍历之后,所选取区域的公式会被原地取消,相当于实现复制,原地粘贴的效果。

Application.Calculation = xlCalculationAutomatic

别忘了打开自动重算

MsgBox "所选单元格公式已取消,感谢Leon!", vbExclamation, "完成!"

核心代码!有以下几个作用:

主要作用:感谢博主(bushi)

提醒VBA已运行完成

总结

这段代码小巧精悍,日常使用率高,各位看官大人们可以把它添加到自定义功能区中,每次调用点击即可运行,方便快捷。

解决的问题有,实现了公式的原地取消,不必在重复取消筛选等繁琐操作。

未来升级点,可以针对性的加入判断代码,例如在大型表格中,加入提前判断,如果表格自动重算处于关闭状态,在运行完VBA后依旧关闭,而不是每次总是打开。

!请注意,由于VBA的固有特性,您在使用VBA后无法执行后退操作,请注意数据安全!!!(被坑过…)

文末声明:

您必须遵守关于,您可以随意转发/引用,但要注明原作者Leon或设置本文跳转连接,并且您必须在文中包含或提醒浏览者遵守作者声明
欢迎关注公众号获取第二手文章!高效工作法

评论

  1. 皓月
    Windows
    江苏省宿迁市 电信
    2 月前
    2024-12-01 21:05:24

    博主此篇文章对于忠爱excel的人来说,真的是太友好了!终于可以在excel中实现粘贴到可见单元格这一功能了,不用在wps与excel中来回切换了,非常感谢博主!!!

    • 博主
      Windows
      江苏省苏州市张家港市 电信
      2 月前
      2024-12-02 7:11:52

      记得推荐给你的同事们哦!୧(๑•̀⌄•́๑)૭

发送评论 编辑评论


				
上一篇
下一篇