答案1
只需使用公式即可实现,无需任何 VBA。
我已设置了如下工作表:
N1
在和中输入以下公式N20
:
=IF(ISNUMBER(MATCH("Rejected",INDEX(G:G,ROW()):INDEX(G:G,IFERROR(MATCH("*",INDEX(L:L,ROW()+1):INDEX(L:L,ROWS(L:L)),0)+ROW()-1,MATCH("",G:G,-1))),0)),"Rejected","Approved")
L:L
我在公式中使用了,因为我不知道您工作表的具体细节。为了使公式正常工作,请将其替换L:L
为任何不包含任何空白的纯文本合并单元格列。
不幸的是,由于合并单元格的大小不同,您无法向下填充公式。此外,您只能将公式复制粘贴到大小相同的合并单元格中。
在最右边的列中输入公式的最简单方法是使用以下任一按键序列:
- F2 Ctrl+V Enter
或者
- Backspace Ctrl+V Enter
您甚至可以录制宏来加快速度。
美化后的公式如下:
=
IF(
ISNUMBER(
MATCH(
"Rejected",
INDEX(G:G,ROW())
:INDEX(G:G,
IFERROR(
MATCH("*",INDEX(L:L,ROW()+1):INDEX(L:L,ROWS(L:L)),0)+ROW()-1,
MATCH("",G:G,-1)
)
),
0
)
),
"Rejected",
"Approved"
)
笔记:
- 美化的公式确实可以起作用。
- 美化版本中的括号
(G:G)
用于强制G:G
将其保持在自己的行上。
编辑:
如果您希望将状态值列表从和增加到Rejected
、和Approved
,您可以像这样在公式中嵌套函数:Rejected
Void
Pending
Approved
IF()
=
IF(
ISNUMBER(
MATCH(
"Rejected",
INDEX(G:G,ROW())
:INDEX(G:G,
IFERROR(
MATCH("*",INDEX(L:L,ROW()+1):INDEX(L:L,ROWS(L:L)),0)+ROW()-1,
MATCH("",G:G,-1)
)
),
0
)
),
"Rejected",
IF(
ISNUMBER(
MATCH(
"Pending",
INDEX(G:G,ROW())
:INDEX(G:G,
IFERROR(
MATCH("*",INDEX(L:L,ROW()+1):INDEX(L:L,ROWS(L:L)),0)+ROW()-1,
MATCH("",G:G,-1)
)
),
0
)
),
"Pending",
IF(
ISNUMBER(
MATCH(
"Void",
INDEX(G:G,ROW())
:INDEX(G:G,
IFERROR(
MATCH("*",INDEX(L:L,ROW()+1):INDEX(L:L,ROWS(L:L)),0)+ROW()-1,
MATCH("",G:G,-1)
)
),
0
)
),
"Void",
"Approved"
)
)
)
一个更好的解决方案是使用适用于数组的公式:
=
CHOOSE(
SMALL(
IF(
ISERROR(
MATCH(
{"Rejected","Void","Pending","Approved"},
INDEX(G:G,ROW())
:INDEX(G:G,
IFERROR(
MATCH("*",INDEX(L:L,ROW()+1):INDEX(L:L,ROWS(L:L)),0)+ROW()-1,
MATCH("",G:G,-1)
)
),
0
)
),
FALSE,
{1,2,3,4}
),
1
),
"Rejected","Void","Pending","Approved"
)
如果您更喜欢该公式的扁平版本,则为:
=CHOOSE(SMALL(IF(ISERROR(MATCH({"Rejected","Void","Pending","Approved"},INDEX(G:G,ROW()):INDEX(G:G,IFERROR(MATCH("*",INDEX(L:L,ROW()+1):INDEX(L:L,ROWS(L:L)),0)+ROW()-1,MATCH("",G:G,-1))),0)),FALSE,{1,2,3,4}),1),"Rejected","Void","Pending","Approved")
通过简单地调整两个常量数组和倒数第二行的值列表,公式的最后一个版本可以轻松扩展到更多(或更少)的值。
请注意,如果在适当范围内存在多个值类型,则值的确切顺序决定返回哪个值。优先级最高的值是左侧的值。