我有一个FormatCondition
。我正在读.Formula1
和.AppliesTo
我想知道公式是否包含一个单元格引用,它将在AppliesTo指定的范围内改变,例如在range C3:D10
中的=NOT(ISNUMBER(C3))
。
据我所知,这种引用可能是相对的(如C3
)或混合(如$C3
或C$3
),但不是绝对的。它也将是基于https://www.ablebits.com/office-addins-blog/2014/08/07/relative-absolute-cell-references-excel-conditional-formatting/和其他一些站点的“应用范围内最左上角的单元格”。
如果范围类似于C3:D10
,那就很容易了。使用例如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
的公式)。
此外,如果范围是类似$A$5,$E$1
-没有‘左上角’。那么excel (或用户)是如何决定公式中哪一个的呢?
因此,主要的问题是:用于确定在公式中使用哪个单元格的Excel系统是什么,因为我不认为它是“左上角”--可能是“找到最顶层的行,然后在那里找到最左边的单元格”,或者可能是相反的,或者是完全不同的。
第二个问题是:,我怎样才能最好地找到来自给定范围的单元格?
一个额外的问题(如果这里没有答案的话,我很高兴)是:是否有一个很好的方法,然后在一个公式中找到该单元格的引用,包括单元格的相对版本和混合版本?
请注意,这些奇怪的范围来自在带有条件格式的工作表上剪切和粘贴的行和列,结果Excel分割条件格式(更改范围和更改公式,都不需要用户输入)。因此,最重要的是处理Excel在这种情况下自行设置的公式,而不一定是用户可能做的事情--但是处理两者都会更好。
发布于 2018-11-11 19:40:21
First回答:短版本: Excel确实使用了最左上角的单元格,但它确实使用了,即使单元格不是范围的一部分。
我创建了一个空白表,选择了A5,E1
,并将条件格式设置为非空白( 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
发布于 2018-11-11 23:55:58
谢谢你更新你的问题,并在下面找到我的评论
用于确定在公式中使用哪个单元格的系统是什么,因为我不认为它是“左上角”--它可能是“找到最上面的行,然后在那里找到最左边的单元格”,或者可能是相反的,或者是完全不同的。
通常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
是否有一个很好的方法可以在公式中找到对该单元格的引用,包括单元格的相对版本和混合版本?
该单元格与您在回答第一个问题时所述的公式直接相关。
https://stackoverflow.com/questions/53246020
复制相似问题