0

想象一下,您想检查一个范围内每个单词的左字母是否为“a”,然后加入该条件为真的单词。一种方法是使用辅助列,如果不为真则返回“”,如果它以“a”开头则返回单词,然后是CONCAT()辅助列上方的总行。

另一种方法是使用数组公式。{=CONCAT(IF(LEFT(range) = "a", range, ""))}. 无论如何,这实际上是在使用辅助列。

但我想要的是使用条件格式方法:应用条件格式时,您引用范围的左上角单元格。所以对于一个rangein A1:A10,我想要一个像=CONCATIF(A1:A10, LEFT(A1) = "a"). SUMIFCOUNTIF接近这个功能,只有他们使用字符串输入">""=..."它不能引用他们正在测试的单元格(即,没有等价物,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根据结果返回一个数组和值TRUEFALSE
  • 该数组可以传递给标准数组处理函数,例如CONCATSUM
    • 或者,如果无法返回数组的 UDF,则可以在内部将数组传递给 UDF 的另一部分,然后由其处理它
    • 类似于必须在某个点返回/COUNTIF的数组,但随后在内部对它们进行计数以返回一个数字,而不是数组,因此不能作为数组公式输入。TRUEFALSE
  • 我对如何生成这个布尔数组感兴趣

现在研究表明有 3 种主要方式:数组函数,无论出于何种原因,它都不能保存长字符串,CONCATIF/SUMIF类型函数,它将文本参数作为布尔测试,但在测试类型上受到严重限制。第三种方法是条件格式使用的方法;选择一个范围,公式测试在所选范围内的所有单元格上运行,返回TRUEFALSE(内部),这个布尔数组用于格式化范围内的单元格。但在 UDF 中,它们可以很容易地作为结果传递或在内部用于进一步计算(例如CONCATIF函数)

因此,我正在寻找以下之一:(这不是数组公式方法,理想情况下应该在没有ctrl+ shift+的情况下输入enter。)

  • 使用类似COUNTIF但更好的方法的 UDF:它接受范围参数和公式作为字符串,公式是任何返回布尔值的工作表公式,例如'LEFT(cell)="a"(注意,文本字符串)
  • 更好的 UDF,它使用像条件格式这样的方法;接受范围和任何返回布尔值的公式 *未格式化为文本"
    • 这会很好,因为您可以使用 Excel 自动提示和范围突出显示来创建公式,如果它是文本则无法执行此操作
  • 对于选项 1),布尔公式可以引用“单元格”一词或其作用范围。对于选项 2),它引用范围内的左上角单元格,就像条件格式一样
    • 我认为application.caller当它不是文本时提取公式部分可能很有用。
  • UDF 最终可能会返回许多选项,可以使用工作表函数或自定义计算进一步定制,但正如我所说,我真的很喜欢布尔值列表

起初我没有输入,因为我不想提出code this for me问题,但我认为我已经在那里提供了足够的细节(以及独立思想的证明!)现在问题是如何而不是什么,我相信在 SO 上更容易接受。

4

1 回答 1

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)), ""))

在此处输入图像描述


¹ TEXTJOIN是随 Excel 2016 在以下版本中引入的:适用于 Android 手机的 Excel、Excel Mobile、带有 Office 365 的 Excel 2016、适用于 Mac 的 Excel 2016、Excel Online、适用于 iPad 的 Excel、适用于 iPhone 的 Excel 和适用于 Android 平板电脑的 Excel。如果您的 Excel 版本不支持 TEXTJOIN(例如,您收到 #NAME! 错误),则在此站点中搜索 [excel] textjoin以寻找替代方案。

于 2017-04-03T16:05:53.183 回答