我设置了一个规则范围,=$A:$A
但是当我添加或更新行时,范围变得混乱:规则被复制到单个单元格,并且这些单元格从主规则中“删除”,所以我得到类似这样的结果:
- 第一规则:
=$A43
- nd 规则:
=$A:$A42;$A44:$A111111
为什么会这样?我该如何解决这个问题?
我尝试使用命名范围和 INDIRECT,但它们不起作用
答案1
这是 Excel 的一个众所周知的问题,几十年来一直饱受诟病。您可以加入到抱怨的行列中,好吧,看起来他们正在抛弃所有旧的抱怨,做一些新的事情……您可以阅读以下内容了解(一些)细节:
https://support.microsoft.com/en-us/office/uservoice-pages-430e1a78-e016-472a-a10f-dc2a3df3450a
那么,在喧闹之后,你能做些什么来让情况变得更好呢?
(请记住,您无法解决这个问题,因此您只能为自己和用户提供姑息治疗。)
好的解决方法是编写一个 VBA 宏,它可以完成条件格式 (CF) 函数现在所做的工作。这是可行的,尽管我读过在 VBA 中编写条件格式非常困难,而且维护起来也不容易。但是,如果您愿意或找到愿意的人,它绝对可以为您解决这个问题。但我不是那种人,所以我将继续做我该做的事情。
问题是 CF 使用的这些范围通常很快就会“分裂”。指示用户不要剪切和粘贴、不要拖放、不要插入行、不要……好吧,你明白了……这会减少一些问题的爆发,但很大程度上取决于你的用户。迟早,即使怀着最好的意图,人们也会做任何事情,因为他进化后的“看法”是,他可以这样做,只是不保存结果。然后他没有考虑得足够快就保存了。或者他知道这一点,但没有意识到他的行为如何破坏了电子表格中的逻辑,虽然他以前做过同样的事情,但他从未指望过受到打击的部分,但这一次……这一次很重要,老板会损失几千美元或失去一个客户。
公平地说(也意味着“现实”),你自己也确实做到了这一点。你编辑了电子表格,做了一些你不打算保留的实验工作,没有担心它对事情的影响,因为你只需要看看它是否能做任何事,然后你关闭、重新打开,然后真正地做……但保存了……培训并不是解决问题的办法。它是一种帮助,如果人们是对的,那将是一个很大的帮助,但它不会覆盖所有问题,也不会解决确实发生的不愉快的事情。
因此,我要做的是这样的:
对于我打算在 CF 中使用的任何范围,我都会为其创建一个命名范围。那么,A1:A10?它被称为“Horsey”。
使范围更容易包含。它需要是 A1:A10?改为 A1:A11。当人们在第 10 行下插入一行时,他们实际上将范围的大小增加到 A1:A12,因为第 11 行在使用的范围内,并且 Excel 按照您希望的方式处理插入。
当我设置一个使用 CF 的电子表格时,在完成主要工作后,我立即使用它来
Macro Recorder
设置一个宏,记录我转到每个规则并编辑它适用的范围作为我为其定义的命名范围。
因此,假设它是 A34:A23008。我尽力将内容布置好,以便我可以使用上面一行和下面一行,因此是 A33:A23009。如果我不能,那么我就不能,但我会尝试。无论如何,我都会为它定义一个命名范围,无论我最终得到什么。在这个只有一条规则的简单示例中,因此只有一个范围需要担心,然后我启动Macro Recorder
并调出 CF 规则(确保将“显示规则”选择器从“当前选择”更改为“工作表 - 很容易做到,因为它打开时选择了该工作表,我只需按Down Arrow
),=Horsey
在框中键入(或任何名称)Applies To :
(清除那里的所有内容),保存规则,然后退出Macro Recorder
。
那么,这取得了什么成果呢?
我得到了一个免费的宏。Excel 帮我完成了这项工作。而且由于它不是我突出显示某些行的宏,因此无需对其进行任何编辑即可将其概括。这是一个成品。
其次,如果我进入 CF,管理规则,并查看框
Applies to
,我会看到漂亮、合适的范围。
因此,如果我在人们做完事情后再次运行它,我将再次获得在命名范围内定义的范围,从而消除所有奇怪的东西。耶!
您可能正在想……“嗯,这里至少有两个问题,伙计……首先,当我读到您写的内容时,您说您看到的是定义的范围,而不是命名范围。听起来很可疑,像在耍花招,就像狡猾的语言。第二个想法是,变化怎么办?如果他们添加了一行,我不想要原始范围,我想要一个包含他们插入的行的范围,那么……那怎么办?现在我正在查看“应用于”框,它里面根本没有命名范围,您就是在试图欺骗我!”
一点也不。首先,第二个问题。用户所做的所有破坏您良好关系的事情Applies to
都不会损害定义的命名范围。插入一行,然后删除三个不连续的行?Excel 会调整命名范围的定义以包含所有这些活动。因此,当他们插入一行时,命名范围会根据该行而增长。当您在 CF 规则的框中使用它时Applies to
,它应用的是调整后的范围,而不是原始范围。
其次,这意味着第一个担心只是麻烦,而不是问题。当我运行宏时,它会用(根据需要由 Excel 调整的)命名范围覆盖。然后 CF 功能立即(在保存之后立即)将其从实际命名范围名称更改为它引用的范围。所以,是的,它不会保持命名范围。它确实更改为文字范围。但请注意,它是正确的文字范围:Excel 通过命名范围功能将其保持正确,并且当 CF 将其更改为文字范围时,它会将其从混乱、错误和坦率地说可怕的状态恢复到简单、清晰的范围,考虑到用户所做的更改,它应该是这样的。
然后他们可能会立即再次把事情搞砸,但这个问题稍后会得到解决。
因此,我现在有一个宏(为我录制的,不是费力编写的,也不是写得很糟糕),每当我运行它时,它都会执行该操作。如果您想使用稍微更有趣的 VBA,您可以轻松快速地学习如何向宏添加几行,以便它在每次打开文件时(在使用前恢复内容)、在保存文件之前(同样的事情)或两者时运行。下一步是添加一个按钮,当用户认为应该这样做时,它会触发宏。如果您已经掌握了技能或想要学习,您甚至可以继续将其设置为查找各种事件,例如插入或删除行或单元格等,而不必弄清楚要为您遇到的五个、然后是 12 个、最后是 15、21、30 个不同的事件中的每一个做什么,而是,无论列表中发生了什么事件,只需立即运行宏,这样对您的 CF 规则的影响就会在那一刻得到修复。
那么用户将一行插入到感兴趣的范围内吗?插入完成且 Excel 修复命名范围内的范围后,您的宏将触发并将命名范围重新应用于每个规则,因此规则仍按预期工作。
因此,有想要某种东西(免费宏)、慢慢行走(用户在认为应该行走时可以随时点击按钮)、走得稍微快一点(宏在打开或保存时或两者时触发)、明显走得快(当发生某些事件时自动触发)以及更接近快走的东西(随着时间的推移,在自动触发位上添加 10-20 个事件)。
我不再使用 CF 了,但是它为我节省了大量的工作,也让其他人省去了不少担心,他们从我多年来向他们提供的数据中得出了错误的结论。
但是,并不是每个人都被允许在电子表格中使用宏。而这会毁掉整个方法,不是吗?不过,如果 CF 对你来说很重要,而你的用户不太关心这是他们的错,而不是你的错,那么你应该被解雇,而不是他们,那么这还是值得争论的。或者你不应该加薪,因为你的电子表格几乎不能用……对我来说,是老板们口头上听从了我的劝告,但基本上经常践踏一切,因为他们是老板。不知何故我应该做一个更好的电子表格。
所以,我希望你能使用它。顺便说一句,记住,你是在从头到尾执行每一个宏时录制宏的。不是 25 个单独的宏。但是如果你这样做,或者你添加了一些规则,所以需要添加一些宏位,你可以将各个部分复制并粘贴在一起。你有一个为 13 条 CF 规则录制的宏,并添加了三个新规则?运行录制器对三个新的 CF 规则进行相同的更新,然后进入 VBA 并复制其中执行工作的行,转到当前宏,然后将其粘贴进去。删除新宏(你为三个新的 CF 规则录制的宏,而不是包含所有内容的更新的(而不是“新”)宏。
VBA 并不关心规则更新的顺序,而且它“随意”地进行 20 次更改,而不是按照精心选择的“逻辑”顺序进行更改,这不会减慢速度。因此,只需在最后粘贴它们就可以了。
如果您被允许使用宏。