CountIf如何才能将结构化参考列作为VBA标准的条件?

时间:2019-06-16 15:06:17

标签: excel vba parameters countif

我正在尝试对当前列使用结构化引用,就像对UDF函数使用CountIf一样。

  

= COUNTIF(数据[团队];概述[团队])

有效,我的新功能

  

= CONCATENATEIF(Data [Team]; Overview [Team]; Data [Data])

不起作用,因为不能将Overview [Team]标准的Range强制转换为单个值,即[#This Row]。

我尝试将参数“ criteria”设置为String以及其他方法。呼叫

  

= CONCATENATEIF(Data [Team]; Overview [@Team]; Data [Data])

带有“ @”的

可以正常使用。但是CountIf可以处理[@Team],[Team]和正常范围,例如[A1:A4]。那么他们是怎么做到的?

Public Function CONCATENATEIF(check_range As Range, criteria As Range, data_range As Range) As Variant
    Dim mydic As Object
    Dim L As Long
    Set mydic = CreateObject("Scripting.Dictionary")
    For L = 1 To check_range.Count
        If check_range(L) = criteria Then
            mydic(L) = data_range(L)
        End If
    Next
    CONCATENATEIF= Join(mydic.items, ", ")
End Function

条件必须像CountIf的条件一样工作?如何将结构化参考[Team]转换为[ba @ baam] vba-wise,以便它选择同一行,以便稍后使用Formular。

The table for the problem (sadly can't embed images yet)

1 个答案:

答案 0 :(得分:0)

COUNTIF可以使用推断出的参考¹。

如果您将一堆值放在A列中,然后在未使用的列中使用=INDEX(A:A, , ) Index()数据的右边,则结果将来自A列中的公共行。由于您没有在期望单个单元格引用的地方提供特定的行引用,因此相关联的(或推断的)行是用过的。这就是COUNTIF起作用的原因;它使用来自Overview[Team]列的推断引用来引用单个单元格作为条件;例如Overview[Team]中与公式位于同一行的单元格(也称为Overview[@Team])。

VBA代码未使用推断的引用。它引用的是Overview[Team]的整个列,在该列中需要一个单元格作为条件(例如Overview[@Team])。

您可以尝试使用Application.Caller.Row来人为地将条件列解析为单个单元格,或者可以像预期的那样仅使用Overview[@Team]作为条件。


¹我希望我能正确理解这个词。我很少使用它,以至于有时很难记住正确的术语。