无法获取WorksheetFunction类的Match属性错误

时间:2013-12-09 21:22:07

标签: excel-vba vba excel

我在一大堆工作表上有大量数据,对于每一个工作表,我想找到给定列中唯一值的计数。

当我在sheeet中使用以下命令时,它完美地运行

=SUM(IF(FREQUENCY(MATCH(REST!D2:D2225,REST!D2:D2225,0),MATCH(REST!D2:D2225,REST!D2:D2225,0))>0,1))

但是当我在VBA中使用等效命令时,我收到错误

    range1 = Cell(2,j).Address & ":" & Cells(k,j).Address


= Application.WorksheetFunction.SUM( Application.WorksheetFunction.IF( Application.WorksheetFunction.FREQUENCY( Application.WorksheetFunction.MATCH(Range(range1),Range(range1),0), Application.WorksheetFunction.MATCH(Range(range1),Range(range1),0))>0,1))

我尝试了其他组合,例如使用

 Application.Match 

 Application.Frequency

我也遇到了“类型不匹配错误。

另一方面,以下功能完美无缺

  Application.Worksheetfunction.Sum(Range(range2))

range1和range2之间的最大区别在于range2数据是严格数字的,而range1数据是数字和字符串。

编辑:实施BX201的解决方案

     range_TradeID_total_FL = .Cells(2, TradeId_column).Address & ":" & Cells(Finalrow, TradeId_column).Address
     doubleQ = Chr(34) & Chr(34)
    fStr = "=SUMPRODUCT((range_TradeID_total_FL & " <> " & " & doubleQ & ")/COUNTIF(range_TradeID_total_FL , range_TradeID_total_FL & " & " & " & doubleQ & "))"
    var_TOTAL_TradeId_count_FL = Evaluate(fStr)
    MsgBox var_TOTAL_TradeId_count_FL

我不想将值存储在单元格中,而是将其存储在变量中。但是当我这样做时,MsgBox给我的值为“True”而不是数字。

2 个答案:

答案 0 :(得分:2)

  

@SiddharthRout我不知道评价。你能否告诉我它在我的上下文中是如何工作的,特别是当我使用变量作为范围时。

试试这个(UNTESTED)

这是一个行是变量的例子。

Sub Sample()
    Dim r1 As Long, r2 As Long
    Dim formulaString As String

    r1 = 2
    r2 = 2225

    '=SUM(IF(FREQUENCY(MATCH(REST!D2:D2225,REST!D2:D2225,0),MATCH(REST!D2:D2225,REST!D2:D2225,0))>0,1))
    formulaString = "=SUM(IF(FREQUENCY(MATCH(REST!D" & r1 & _
                    ":D" & r2 & _
                    ",REST!D" & r1 & _
                    ":D" & r2 & _
                    ",0),MATCH(REST!D" & r1 & _
                    ":D" & r2 & _
                    ",REST!D" & r1 & _
                    ":D" & r2 & _
                    ",0))>0,1))"

    Debug.Print Application.Evaluate(formulaString)
End Sub

答案 1 :(得分:1)

用于获取列中唯一值计数的更简单的公式是:

=SUMPRODUCT((REST!$D$2:$D$2225<>"")/COUNTIF(REST!$D$2:$D$2225,REST!$D$2:$D$2225&""))

正常公式所以不需要CSE。如果您的值没有附加条件,这可能效果最好,例如可能是简单的名称或值列表。

我认为评估这个应该可以得到你想要的结果。您还可以将其作为公式分配给单元格。在这方面,以下两种方法都有效。

将公式插入单元格

Sub UniqueCount1()
    doubleQ = Chr(34) & Chr(34)
    fStr = "=SUMPRODUCT((REST!D2:D2225<>" & doubleQ & ")/COUNTIF(REST!D2:D2225,REST!D2:D2225&" & doubleQ & "))"
    Range("C1").Formula = fStr
End Sub

评估公式并将结果插入单元格

Sub UniqueCount2()
    doubleQ = Chr(34) & Chr(34)
    fStr = "=SUMPRODUCT((REST!D2:D2225<>" & doubleQ & ")/COUNTIF(REST!D2:D2225,REST!D2:D2225&" & doubleQ & "))"
    Range("C1").Value = Evaluate(fStr)
End Sub

第三种方法是使用脚本字典。这有点复杂,但速度非常快,可以用于各种各样的方式。

Sub UniqueDict()

    Dim oDict As Object
    Dim sElem As Variant, sList As Variant

    sList = ThisWorkbook.Sheets("REST").Range("D2:D2225").Value
    Set oDict = CreateObject("Scripting.Dictionary")

    With oDict
        For Each sElem in sList
            If Not .Exists(sElem) And Not IsEmpty(sElem) Then
                .Add sElem, Empty
            End If
        Next sElem
    End With

    MsgBox oDict.Count

End Sub

希望这有帮助。

编辑:

这是使用变量的方法。

startRow = 2 'Or whatever it is based on your other code.
finalRow = 2225 'Or whatever it is based on your other code.

rngStr = "REST!$D$" & Startrow & ":$D$" & Finalrow '$D$2:$D$2225
dQ = Chr(34) & Chr(34) 'Double quote string.

fStr1 = "=SUMPRODUCT((" & rngStr & "<>" & dQ & ")" '=SUMPRODUCT((REST!$D$2:$D$2225<>"")
fStr2 = "/COUNTIF(" & rngStr & "," & rngStr & "&" & dQ & "))" '/COUNTIF($D$2:$D$2225,$D$2:$D$2225&""))
fStr = fStr1 & fStr2 '=SUMPRODUCT((REST!$D$2:$D$2225<>"")/COUNTIF($D$2:$D$2225,$D$2:$D$2225&""))

var_Total = Application.Evaluate(fStr)
MsgBox var_Total

希望这有帮助。