如何将公式输入转换为UDF,如条件格式

时间:2017-04-03 15:55:29

标签: excel vba excel-vba user-defined-functions textjoin

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

另一种方法是使用数组公式。 {=CONCAT(IF(LEFT(range) = "a", range, ""))}。无论如何,这有效地使用了辅助列。

但我想要的是使用条件格式化方法:应用条件格式时,引用范围的左上角单元格。因此对于range中的A1:A10,我想要一个像=CONCATIF(A1:A10, LEFT(A1) = "a")这样的函数。 SUMIFCOUNTIF接近此功能,只有他们使用字符串输入">""=...",它们无法引用他们正在测试的单元格(即,没有相应的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,我只需要一种方法来运行测试条件!

更新

为明确说明,我正在寻找以下内容:

  • 一个通用UDF,它接受RANGE以及布尔 FORMULA输入
    • 如果需要,这些可以与UDF的参数相同
  • UDF评估范围
  • 中每个单元格的布尔公式
  • UDF根据结果返回数组 TRUEFALSE
  • 此数组可以传递给标准数组处理函数,如CONCATSUM
    • 或者如果无法返回返回数组的UDF,该数组可以在内部传递到UDF的另一部分,然后处理它
    • 类似于COUNTIF必须在某个时刻返回TRUE / FALSE的数组,但是在内部对其进行计数以返回数字,而不是数组,因此可以输入不是数组公式。
  • 我对如何生成此布尔数组感兴趣

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

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

  • 使用类似COUNTIF但更好的方法的UDF:它接受范围参数和公式作为字符串,该公式是任何布尔返回的工作表公式,例如{{ 1}}(注意,文本字符串)
  • 更好使用条件格式化方法的UDF;接受一个Range和任何布尔返回的公式*未格式化为文本&#34;
    • 这样会很好,因为您可以使用Excel自动提示和范围高位来创建公式,如果它是文本,则无法执行此操作
  • 对于选项1),布尔公式可以引用单词&#34; cell&#34;或者它的行动范围。对于选项2),它引用范围中的左上角单元格,如条件格式
    • 我认为'LEFT(cell)="a"在提取公式部分时可能非常有用。
  • UDF可能会返回一些选项,可以使用工作表函数或自定义计算进一步定制,但正如我所说,我真的在布尔列表之后

我起初并没有打字,因为我不想提出application.caller个问题,但我认为我已经提供了足够的细节(以及独立思考的证据! )它现在是如何不是什么的问题,我相信在SO上更容易被接受。

1 个答案:

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

enter image description here

¹以下版本的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以寻找替代方案。

相关问题