英文:
Conditional formatting inconsistent using MATCH in a custom formula
问题
我有两个单元格A1
和B1
,它们包含相同的值。我想要使用自定义公式=MATCH(A1,B1)
创建一个条件格式规则,使这两个单元格变成绿色。
这有时对其他单元格对起作用,但其他时候它根本不起作用。
请注意,这些单元格具有自定义数字格式,该格式在数字前添加了一个字母和一个分号。
请告诉我我做错了什么。
3对单元格,2对正常工作,Q3
和R3
没有:
我的条件格式设置:
英文:
I have 2 cells A1
and B1
that contain the same values. I want to create a conditional formatting rule using the custom formula =MATCH(A1,B1)
that colours both cells green.
This sometimes works on other cell pairs but other times it simply doesn't work.
Note that the cells have a custom number format that adds a letter and a semi-colon before the numbers.
Let me know what I am doing wrong.
3 pairs, 2 pairs worked, Q3
& R3
didn't:
My conditional formatting:
答案1
得分: 1
RULE
在下面的公式中,MATCH 函数的 search_type
参数已更改为 0
(精确匹配),其 range
参数现在通过将 search_key
列偏移 1
或 -1
来计算,具体取决于它是其列对中的左列还是右列
# 应用到范围
M3:R55
# 自定义公式
=MATCH(M3,OFFSET(M3,0,IF(ISODD(COLUMN($M3))=ISODD(COLUMN()),1,-1)),0)
ISSUES
你的方法主要问题在于相对引用的处理方式。此外,匹配类型设置错误。
相对引用
你公式中的单元格引用是相对的。当将条件格式规则应用于一系列单元格时,相对引用会根据单元格在规则的 应用范围
中相对于第一个单元格(最顶部最左侧)的位置进行更新。
对公式的行引用进行偏移不会产生不良影响,但将列引用偏移奇数次数(每隔一次)会导致 MATCH 函数的 range
参数引用一个与预期完全不同的列对中的单元格。
通过将公式 =MATCH(M3,N3,0)
放置在 M4
中,然后将其复制到 N4
和 O4
中,可以看到相同的行为。
- 在
N4
中,公式=MATCH(N3,O3,0)
将无法按预期工作。它将尝试将来自左列的N3
的值与来自完全不同对的右列中的O3
的值进行匹配。 - 在
O4
中,公式=MATCH(O3,P3,0)
的行为类似于M4
中的原始公式。它将尝试将来自左列的O3
的值与同一对的右列中的P3
的值进行匹配。
search_type
原始公式中的 MATCH 函数将 search_type
参数设置为 1
(默认),这指定在 range
中搜索小于或等于 search_key
的最大值,同时假定 range
按升序排列。应该将其设置为 0
以进行精确匹配。
原始公式在一半的时间内成功,但默认的 search_type
结合实际数据给人以错误的印象,即它在50%以上的情况下成功。在一些错误比较错误单元格的情况下,可能会应用预期的格式,而它们的值不匹配。
例如,将公式 M3
应用于 N3
时,它变为 =MATCH(N3,O3)
,这将在规则中返回 TRUE,因为 N3 > = O3
=MATCH(N3,O3) // search_type: 1
=MATCH(58,8) //
=1 // 58 >= 8 (8 matched in position 1)
=MATCH(N3,O3,0) // search_type: 0
=MATCH(58,8,0)
=#N/A // 未找到匹配
EXPLANATION
条件格式规则应用于列对的连续范围,每对由左列和右列组成,例如 M3:R55
- 如果 MATCH 函数的
search_key
位于左列中,则其range
参数应为search_key
右侧一列的 OFFSET 单元格。OFFSET(M3,0,1)
- 如果
search_key
在右列中,则range
应为search_key
左侧一列的 OFFSET 单元格。OFFSET(M3,0,-1)
- 规则的
应用范围
中的第一列必定是左列。如果该列是奇数编号,则 所有 左列都将是奇数编号。如果它是偶数编号,则 所有 左列都将是偶数编号。 - 因此,可以通过 ISODD 函数对第一列进行测试,并对当前列进行相同的测试,如果当前列是左列,则这两个测试比较的结果必定都成功或都失败。
# 第一列是 M,当前单元格是 Q3
=ISODD(COLUMN($M3))=ISODD(COLUMN())
=ISODD(13)=ISODD(17)
=TRUE=TRUE
=TRUE // 当前列是左列
# 第一列是 M,当前单元格是 R3
=ISODD(COLUMN($M3))=ISODD(COLUMN())
=ISODD(13)=ISODD(18)
=TRUE=FALSE
=FALSE // 当前列是右列
# 第一列是 N,当前单元格是 R3
=ISODD(COLUMN($N3))=ISODD(COLUMN())
=ISODD(14)=ISODD(18)
=FALSE=FALSE
=TRUE // 当前列是左列
- 唯一需要做的就是通过将
search_key
作为 OFFSET 函数的cell_reference
传递,并根据 ISODD 测试的结果设置offset_columns
为1
或-1
,从而填充 MATCH 函数的range
参数。
=MATCH(M3,OFFSET(M3,0,
IF(ISODD(COLUMN($M3))=ISODD(COLUMN()),
1, // 条件为真(当前列是左列)
-1)) // 条件为假(当前列是右列)
,0)
英文:
RULE
In the formula below, the MATCH function's search_type
argument was changed to 0
(exact match) and it's range
argument is now calculated by offsetting the search_key
column by 1
or -1
, depending if it is the left or right column in its column pair
# Apply to range
M3:R55
# Custom formula
=MATCH(M3,OFFSET(M3,0,IF(ISODD(COLUMN($M3))=ISODD(COLUMN()),1,-1)),0)
<br>
ISSUES
The main issue with your approach was tied to how relative refferences are handled. Additionally, the type of match was incorrectly set.
Relative References
The cell references in your formula are relative. When a conditional formatting rule is applied to a range of cells, relative references are updated for each cell based on its position in relation to the first cell (topmost-leftmost) in the rule's Apply to range
.
Offsetting your formula's row references has no undesired effect, however, offsetting the column references by an odd number (every other) causes the MATCH function's range
argument to reference a cell from a completely different column pair than was intended.
One can see the same behavior by placing the formula =MATCH(M3,N3,0)
in M4
and then copying it to N4
and O4
.
- In
N4
the formula=MATCH(N3,O3,0)
will not work as intended. It will attempt to match a value fromN3
which is in the right column of a pair, with a value fromO3
, which is in the left column of a completely different pair. - In
O4
the formula=MATCH(O3,P3,0)
will behave similarly to the original formula inM4
. It will attempt to match the value fromO3
which is in the left column of a pair, with a value fromP3
which is in the right column of the same pair .
search_type
The original formula's MATCH function had the search_type
argument set to 1
(default) which specifies searching the range
for the largest value that is less than or equal to the search_key
, while also assuming that the range
is sorted in ascending order. It should have been set to 0
for an exact match.
The original formula was succeeding half the time, however the default search_type
in combination with the actual data, was giving the false impression that it succeeding more than 50% of the time. The expected formatting would have been applied in some cases where the wrong cells were being compared, and where their values didn't match.
For example, the formula in M3
when applied to N3
becomes =MATCH(N3,O3)
which would return TRUE in the rule because N3>=O3
=MATCH(N3,O3) // search_type: 1
=MATCH(58,8) //
=1 // 58 >= 8 (8 matched in position 1)
=MATCH(N3,O3,0) // search_type: 0
=MATCH(58,8,0)
=#N/A // No Match found
<br>
EXPLANATION
The conditional formatting rule is applied to a contiguous range of column pairs, with each pair comprised of a left and a right column, eg. M3:R55
- If the MATCH function's
search_key
is located in a left column, itsrange
argument should be the cell OFFSET one column right of thesearch_key
.OFFSET(M3,0,1)
- If the
search_key
is in a right column, then therange
should be the cell OFFSET one column left of thesearch_key
OFFSET(M3,0,-1)
- The first column in the rule's
Apply to range
is necessarily a left column. If that column is odd-numbered, all left columns will be odd-numbered. If it's even-numbered, all left columns will be even-numbered. - Therefore, a test of the first column with the ISODD function, and the same test on the curent column, would necessarily both succeed or both fail if the current column is a left column.<br><br>
For example,
# First Column is M, current cell is Q3
=ISODD(COLUMN($M3))=ISODD(COLUMN())
=ISODD(13)=ISODD(17)
=TRUE=TRUE
=TRUE // current col is left
# First Column is M, current cell is R3
=ISODD(COLUMN($M3))=ISODD(COLUMN())
=ISODD(13)=ISODD(18)
=TRUE=FALSE
=FALSE // current col is right
# First Column is N, current cell is R3
=ISODD(COLUMN($N3))=ISODD(COLUMN())
=ISODD(14)=ISODD(18)
=FALSE=FALSE
=TRUE // current col is left
- All that remains is to populate the MATCH function's
range
argument by passing thesearch_key
as thecell_reference
of an OFFSET function, and settingoffset_rows
to0
, andoffset_columns
to1
or-1
depending on the TRUE or FALSE outcome of the ISODD tests comparison:
=MATCH(M3,OFFSET(M3,0,
IF(ISODD(COLUMN($M3))=ISODD(COLUMN()),
1, // condition_true (current col is left)
-1)) // condition_false (current col is right)
,0)
[<img src="https://i.stack.imgur.com/rf3Ut.png" width="600" />](https://i.stack.imgur.com/rf3Ut.png "click to enlarge")
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论