[英]Excel Conditional formatting formula and ranges (VBA)
我有一个FormatCondition
。 我正在阅读.Formula1
和.AppliesTo
我想查找公式是否包含将在AppliesTo指定的范围内变化的单元格引用,例如CNO C3:D10
范围内的=NOT(ISNUMBER(C3))
。
据我所知,该引用可能是相对的(例如C3
)或混合的(例如$C3
或C$3
),但不是绝对的。 根据https://www.ablebits.com/office-addins-blog/2014/08/07/relative-absolute-cell-references-excel-,它也将是“应用范围中最左上角的单元格” 条件格式/和其他一些网站。
如果范围是C3:D10
,那很容易。 使用myRange.Cells(1, 1)
查找左上角myRange.Cells(1, 1)
使用.Address
或类似名称将其转换为字符串,然后在公式中查找该字符串,以及添加$
相关变体。 当然,我必须注意类似字符串的事情(例如,左上方的单元格为C3' and formula is
=“ CC3NE”`),但有可能(仍然,我欢迎提出有关如何更好地做到这一点的建议,但这不是问题)。
真正的问题是范围是否更复杂(如条件格式设置经常发生的那样)。 例如$CQ$39:$FT$39,$BE$39,$BE$8:$BE$9,$CU$8:$FT$9,$CU$12:$FT$14,$BE$12:$BE$14,$BE$16:$BE$30,$CQ$16:$FT$30,$CQ$32:$FT$36,$BE$32:$BE$36
。 .Cells(1, 1)
不能给出正确的答案( BE8
,根据Excel制定的公式)。
此外,如果范围是$A$5,$E$1
-没有“左上方”怎么办? 那么,excel(或用户)如何确定公式中应该包含哪些内容?
因此,主要的问题是: Excel确定在公式中使用哪个单元格的系统是什么,因为我不认为它是“左上角”的-它可能是“查找最上面的行,然后找到那里的最左边的单元格” ,或者相反,或者完全不同。
第二个问题是: 如何最好地找到给定范围内的那个细胞?
额外的问题(如果在这里没有得到回答,我很高兴)是: 有一种好的方法可以在公式中查找对该单元格的引用,包括该单元格的相对和混合版本吗?
请注意,这些奇怪的范围来自使用条件格式在工作表上剪切和粘贴的行和列,而Excel则将条件格式切碎(更改范围和更改公式,这两种操作都无需用户输入)。 因此,在这种情况下,优先考虑的是处理将Excel自行设置公式的任何事情,不一定是用户可能会做的事情-但同时处理两者会更好。
第一个答案 :简短版本:Excel确实的确使用了最左上角的单元格-但是即使该单元格不在该范围内,它也会这样做 。
我创建了一张空白纸,选择了A5,E1
,并以条件格式为NOT BLANK(Excel使用公式对其进行了处理)。 Excel创建了以下内容:
范围: $E$1,$A$5
公式: =LEN(TRIM(A1))>0
因此,即使A1
不在范围内,这也是公式中使用的内容。
我通过在工作表周围复制来进行检查,并保持一致。
因此,Excel在范围内找到最左边的列,在范围内找到最上面的行,并将它们合并以生成应被视为范围“左上角”的单元格,即使所得单元格实际上不是范围的一部分。
这也暗示了第二个问题的答案:找到范围中最上面的行; 找到最左边的列; 然后使用将两者结合起来的单元格与公式进行比较。 您可以通过遍历范围字符串来做到这一点,或者遍历范围本身来逐个单元; 也许有更好的方法可以做到(欢迎提出建议)。
它虽然不漂亮,但如果我能找到一种很好的方法来完成这两件事,那它就会起作用。
我仍然欢迎您:
编辑-这是Usmanhaq的出色方法的替代代码方法-这作为字符串遍历整个范围:
Private Function FindTopLeft(rangeStr As String, rowabs As Boolean, colabs As Boolean) As String
newRange = Replace(rangeStr, ":", ",")
newRangeArray = Split(newRange, ",")
Dim lowestRow As Long
Dim lowestCol As Long
lowestRow = 2147483647
lowestCol = 2147483647
For Each cell In newRangeArray
cell = Trim(cell)
If cell <> "" Then
cCol = range(relativeCell).Column
cRow = range(relativeCell).Row
If cCol < lowestCol Then lowestCol = cCol
If cRow < lowestRow Then lowestRow = cRow
End If
Next
FindTopLeft = Cells(lowestRow, lowestCol).Address(rowabs, colabs)
End Function
感谢您更新您的问题并在我的评论下方找到
Excel确定在公式中使用哪个单元格的系统是什么,因为我不认为它是“左上角”的-它可能是“查找最上面的行,然后找到最左边的单元格”,或者它可能是反向,或完全不同的东西。
通常,Excel中的范围类似于具有固定长度和宽度的框或矩形,例如B3:C8。 在这种简单的框类型范围的情况下,最左上角的单元格是条件格式中所有公式的基础。 换句话说,在第一次公式评估时,将根据条件格式中应用的公式检查此单元格的值。 (我们称此单元为母单元)
例如
在第一种情况下,第一个根据公式检查的单元格为A1,甚至在第二种情况下,根据条件公式检查的单元格为A1(我们称为母单元格)
现在,如果该范围不像一个框,则它是一个用逗号分隔的混合范围,即使在这种情况下,即使我们围绕该范围创建一个框,其母单元格也是左上角的单元格,也不是该单元格的第一个单元格。范围,但框的第一个单元格。
对于第二个问题,我如何才能最好地找到给定范围内的那个单元格?
如果您想在像简单范围之类的框中找到母单元,那就是单元(1,1)
如果要查找混合范围内的单元格,可能有一些功能,但我不知道。 我会通过使用下面的循环来找到
Sub find_topleft()
Dim r, full_range As Range
Set r = Range("$O$8:$O$17,$Q$4:$Q$13,$S$4:$S$6")
Set full_range = Sheets("Sheet1").UsedRange
row_num = full_range.Rows.Count + full_range.Row - 1
col_num = full_range.Columns.Count + full_range.Column - 1
For Each c In r
If c.Row < row_num Then
row_num = c.Row
End If
If c.Column < col_num Then
col_num = c.Column
End If
Next
Debug.Print row_num
Debug.Print col_num
End Sub
有什么好方法可以在公式中查找对该单元格的引用,包括该单元格的相对版本和混合版本吗?
如您对第一个问题的回答所述,该单元格直接与公式链接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.