想象一下,你想检查一个范围内每个单词的左边字母是" a",然后加入那个条件为真的单词。一种方法是使用辅助列,返回""如果不是真的话,如果它以" a"开头,然后是CONCAT()
在辅助列上的总行。
另一种方法是使用数组公式。 {=CONCAT(IF(LEFT(range) = "a", range, ""))}
。无论如何,这有效地使用了辅助列。
但我想要的是使用条件格式化方法:应用条件格式时,引用范围的左上角单元格。因此对于range
中的A1:A10
,我想要一个像=CONCATIF(A1:A10, LEFT(A1) = "a")
这样的函数。
SUMIF
和COUNTIF
接近此功能,只有他们使用字符串输入">"
,"=..."
,它们无法引用他们正在测试的单元格(即,没有相应的LEFT(A1)
,因为无法在字符串中引用 the_cell_I&m; current_working_on
但问题是,如果我创建一个尝试接受LEFT("A1") = "a"
之类的测试的UDF,它只会评估该一个单元格,而不是像条件格式化那样在整个范围内进行评估。
主要是我通过评估指定为参数的某些条件来了解vba函数是否可以像COUNTIF
那样充当数组公式。只有条件格式的功能才能接受相对公式,而不是字符串,输入。
但是,对于这个特定情况,我试图将CONCAT
一些长段落变成单个字符串。每个段落可能是1000个字符,无论出于何种原因,{=CONCAT(IF(LEFT(A1:A10) = "a", A1:A10, ""))}
都无法工作,因为IF(
会为长段落返回值错误。该公式适用于小段落。但是VBA版本可以连续整个A1:A10
,我只需要一种方法来运行测试条件!
为明确说明,我正在寻找以下内容:
RANGE
以及布尔 FORMULA
输入
TRUE
和FALSE
值CONCAT
或SUM
COUNTIF
必须在某个时刻返回TRUE
/ FALSE
的数组,但是在内部对其进行计数以返回数字,而不是数组,因此可以输入不是数组公式。现在研究表明有三种主要方式:数组函数,无论出于何种原因,它都无法保存长字符串,CONCATIF
/ SUMIF
类型函数,它将一个text参数作为布尔测试,但在测试类型中受到很大限制。第三种方法是条件格式使用的方法;选择一个范围,公式测试在选定范围内的所有单元格上运行,返回TRUE
或FALSE
(内部),此布尔数组用于格式化范围中的单元格。但是在UDF中,它们可以很容易地作为结果传递或在内部用于进一步计算(例如CONCATIF
函数)
因此,我正在寻找以下其中一项:(这不是数组公式方法,理想情况下应该在没有 ctrl + shift <的情况下输入/ KBD> + 输入。)
COUNTIF
但更好的方法的UDF:它接受范围参数和公式作为字符串,该公式是任何布尔返回的工作表公式,例如{{ 1}}(注意,文本字符串)'LEFT(cell)="a"
在提取公式部分时可能非常有用。我起初并没有打字,因为我不想提出application.caller
个问题,但我认为我已经提供了足够的细节(以及独立思考的证据! )它现在是如何不是什么的问题,我相信在SO上更容易被接受。
答案 0 :(得分:3)
在CSE的数组公式中使用较新的TEXTJOIN¹和IF。
=TEXTJOIN(CHAR(32), TRUE, IF(LEFT(A1:INDEX(A:A, MATCH("zzz", A:A)))="a", A1:INDEX(A:A, MATCH("zzz", A:A)), ""))
¹以下版本的Excel 2016引入了TEXTJOIN: Excel for Android手机,Excel Mobile,Excel 2016 with Office 365,Excel 2016 for Mac,Excel Online,Excel for适用于Android平板电脑的iPad,Excel和适用于Android平板电脑的Excel。如果您的Excel版本不支持TEXTJOIN(例如,您收到#NAME!错误),请在此网站上搜索[excel] textjoin以寻找替代方案。 子>