我喜欢在工作表上添加条件格式,它很简单=ISFORMULA(A1)
并且涵盖整个工作表。
因此,基本上,如果一个单元格包含一个公式,它会得到一个灰色背景或类似的东西,这使得需要用户输入的单元格(不是灰色)和输出且不应该被弄乱的单元格(灰色)之间有明显的区分。
但是,当使用溢出数组结果时,只有实际包含公式的单元格才会被此格式标记,而溢出结果不会受到条件格式的影响。
那么,是否存在某种ISFORMULA()
等效方法或其他方法来检测细胞是否已被溢出?
答案1
不确定这是否有帮助,但当您不知道有多少结果时,可以使用溢出范围运算符 # 来参考溢出结果列表(在公式内)。例如,如果 A1 处的结果溢出到 A2、A3 等,并且您使用 A1#,它将自动提取整个范围或结果。您还可以使用 counta(A1#) 来量化有多少结果,也许作为检查函数的一部分来查看是否存在任何溢出,例如 if(counta(A1#)>1,true)。
答案2
一种有效的解决方案是定义以下简单的 VBA 函数:
Function isSpill(x As Range)
isSpill = x.HasSpill
End Function
=isSpill(Z100)
然后,对于已经被其他单元格溢出的单元格,调用类似的方法返回 TRUE。
对于我的条件格式情况,这可以简单地与之相结合=OR(ISFORMULA(A1), isSpill(A1))
以包含非溢出公式。
但是,这有一个明显(而且非常大)的缺点,即它需要 .xlsm 文件,并且用户必须始终启用宏。因此,如果可能的话,非 VBA 解决方案将受到欢迎。
答案3
假设我们知道A1有一个溢出的公式,我们想列出溢出所占据的单元格。尝试:
=TRANSPOSE(ADDRESS(SEQUENCE(1,COUNTA(A:A)),1))
(这里我们用 Spill 来描述 Spill)
并将答案放在一个单元格中:
=TEXTJOIN(", ",TRUE,TRANSPOSE(ADDRESS(SEQUENCE(1,COUNTA(A:A)),1)))
编辑#1:
要确定单元格是通过输入还是通过溢出来填充,只需单击它并运行:
Sub DontCryOverSpiltCell()
MsgBox (ActiveCell.Address & vbCrLf & ActiveCell.HasSpill)
End Sub
答案4
您可以使用 Excel 4 宏函数在命名范围内测试单元格是否具有公式,通过GET.CELL(41,"cell being checked")
该公式可以对单元格的公式起作用SPILLED Into
。它还将返回非公式单元格的内容,因此需要进行进一步的测试,AND()
最简单的方法是,Does the result of whatever is in the cell equal the result of the GET.CELL() result?
如果确实如此,则内容可能是某种常数,数字或字符串。但是,公式可能会返回与公式本身的文本完全不同的值,就像……基本上总是这样。因此,如果测试失败,人们很有可能会假设单元格中有一个公式。这是成功的一半。
那么,它是一个SPILL
公式吗?通常,人们不会遇到连续的单元格,无论是上下还是左右(没错,除非您可以消除左右,否则SPILL
您需要在此处同时测试两者,因此希望可以消除其中一个或另一个问题)。因此,例如,A1-A2-A3-A4-A5 可能有相关的公式,但没有完全相同的公式SPILL range
。测试单元格的内容,例如向上的三个或 14 个单元格(正如人们对此的猜测可能表明的那样:匹配越远,SPILL
工作的可能性就越大,但发生奇怪的事情的可能性也越大)与感兴趣的单元格应该是一个不错的测试。GET.CELL()
也这样做。
将两个测试(AND()
再次)绑定到一个命名范围内会给您带来问题,因为您AND()
在这里需要,但这两个测试将给出相反的结果(TRUE
和FALSE
),因此您必须选择NOT()
其中一个。无论你选择哪种方式,你都会得到一个可以在简单中使用的结果IF()
。
不幸的是,单元格内容FORMULATEXT()
返回“” SPILLED Into
。否则就只能这样了(叹气……)。
还有其他方法可以进行测试,例如,TYPE()
结果是否GET.CELL()
等于简单=cell's contents
结果。但这种方法在“精确和无歧义”的意义上并不直接,因此需要根据情况进行测试。上面描述的方法有效,在我看来,这是一个相当不错的测试(关键部分是假设相邻单元格不应有比“相似”公式更接近的公式,而不是“相同”公式)。
编辑
无需教学,因为您将编写公式,他们将使用结果,而不是技术:
从那时起它就成为宏语言的一部分,但它实际上只是一个函数,就像SUM()
或一样,但VLOOKUP()
有一个例外:如果直接输入到单元格中,它将不起作用。您可以编写一个完全正常的公式,例如检查单元格 A5,就像这样:
=GET.CELL(41,$A$5)
但是您首先要创建一个命名范围,调用它Horse
,然后将其写入那里(或者将其写入单元格端,它甚至不会被视为函数,但谁在乎呢,对吧,您只需要文本,然后将其复制到剪贴板,然后创建命名范围并将其粘贴进去)。所以现在您有一个名为的命名范围,Horse
并且“引用”框中包含上述内容。
回到单元格中,假设您想要单元格 F23 中的结果。在该单元格中,您只需输入:
=Horse
它会使用函数为您找到值。您和用户在单元格中看到的都是结果。
根本没有宏,只是一个名字奇怪的普通公式。给它一个普通的名字,没有人会感到疑惑。
因此,在放弃之前,请尝试上述操作:创建一些命名范围,可能称为实验,输入该公式,创建一些将一些值放入单元格 A5 的溢出函数,然后选择其他单元格并输入=Experiment
并查看 A5 内容产生的公式。
如果你仍然觉得奇怪,那也没关系。但也许你会发现它有多简单并且会喜欢它。只需要 2-3 分钟。