想象一下,您想检查一个范围内每个单词的左字母是否为“a”,然后加入该条件为真的单词。一种方法是使用辅助列,如果不为真则返回“”,如果它以“a”开头则返回单词,然后是CONCAT()
辅助列上方的总行。
另一种方法是使用数组公式。{=CONCAT(IF(LEFT(range) = "a", range, ""))}
. 无论如何,这实际上是在使用辅助列。
但我想要的是使用条件格式方法:应用条件格式时,您引用范围的左上角单元格。所以对于一个range
in A1:A10
,我想要一个像=CONCATIF(A1:A10, LEFT(A1) = "a")
.
SUMIF
并COUNTIF
接近这个功能,只有他们使用字符串输入">"
,"=..."
它不能引用他们正在测试的单元格(即,没有等价物,LEFT(A1)
因为没有办法在字符串中引用the_cell_I'm current_working_on )
但问题是,如果我制作一个尝试接受类似 的测试的 UDF LEFT("A1") = "a"
,它只会评估那个单元格,而不是像条件格式那样在整个范围内进行评估。
为什么不直接使用数组公式?
好吧,主要是我很想看看 vba 函数是否可以像数组公式那样充当数组公式COUNTIF
- 通过评估指定为参数的某些条件。只有在接受相对公式而不是字符串输入时具有条件格式的功能。
而且,对于这种特定情况,我正在尝试将CONCAT
一些长段落转换为单个字符串。每个段落可能有 1000 个字符,无论出于何种原因,{=CONCAT(IF(LEFT(A1:A10) = "a", A1:A10, ""))}
它都不起作用,因为IF(
对于长段落返回值错误。该公式适用于小段落。但是VBA版本可以concat整个A1:A10
,我只需要一种方法来先运行测试条件!
更新
为了明确起见,我正在寻找以下内容:
- 一个通用的 UDF,它接受一个
RANGE
以及一个布尔FORMULA
输入- 如果需要,这些可以在 UDF 的相同参数中
- UDF 计算范围内每个单元格的布尔公式
- UDF根据结果返回一个数组和值
TRUE
FALSE
- 该数组可以传递给标准数组处理函数,例如
CONCAT
或SUM
- 或者,如果无法返回数组的 UDF,则可以在内部将数组传递给 UDF 的另一部分,然后由其处理它
- 类似于必须在某个点返回/
COUNTIF
的数组,但随后在内部对它们进行计数以返回一个数字,而不是数组,因此不能作为数组公式输入。TRUE
FALSE
- 我对如何生成这个布尔数组感兴趣
现在研究表明有 3 种主要方式:数组函数,无论出于何种原因,它都不能保存长字符串,CONCATIF
/SUMIF
类型函数,它将文本参数作为布尔测试,但在测试类型上受到严重限制。第三种方法是条件格式使用的方法;选择一个范围,公式测试在所选范围内的所有单元格上运行,返回TRUE
或FALSE
(内部),这个布尔数组用于格式化范围内的单元格。但在 UDF 中,它们可以很容易地作为结果传递或在内部用于进一步计算(例如CONCATIF
函数)
因此,我正在寻找以下之一:(这不是数组公式方法,理想情况下应该在没有ctrl+ shift+的情况下输入enter。)
- 使用类似
COUNTIF
但更好的方法的 UDF:它接受范围参数和公式作为字符串,公式是任何返回布尔值的工作表公式,例如'LEFT(cell)="a"
(注意,文本字符串) - 更好的 UDF,它使用像条件格式这样的方法;接受范围和任何返回布尔值的公式 *未格式化为文本"
- 这会很好,因为您可以使用 Excel 自动提示和范围突出显示来创建公式,如果它是文本则无法执行此操作
- 对于选项 1),布尔公式可以引用“单元格”一词或其作用范围。对于选项 2),它引用范围内的左上角单元格,就像条件格式一样
- 我认为
application.caller
当它不是文本时提取公式部分可能很有用。
- 我认为
- UDF 最终可能会返回许多选项,可以使用工作表函数或自定义计算进一步定制,但正如我所说,我真的很喜欢布尔值列表
起初我没有输入,因为我不想提出code this for me
问题,但我认为我已经在那里提供了足够的细节(以及独立思想的证明!)现在问题是如何而不是什么,我相信在 SO 上更容易接受。