【问题标题】:Unable to get the Match Property of the WorksheetFunction class error无法获取 WorksheetFunction 类错误的匹配属性
【发布时间】:2023-03-22 00:19:01
【问题描述】:

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

当我在工作表中使用以下命令时,它可以完美运行

=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”而不是数字。

【问题讨论】:

  • 你知道你也可以application.evaluate()吗?
  • @SiddharthRout 我不知道评估。你能告诉我它在我的上下文中是如何工作的,尤其是当我使用变量作为范围时。
  • 确定几分钟

标签: excel vba


【解决方案1】:

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

试试这个(未测试)

这是一个例子,其中 row 是一个变量。

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

【讨论】:

  • 很高兴能帮上忙 :)
  • @BK201 谢谢。我非常感谢大家的帮助,以至于我总是在选择一个答案来接受时感到矛盾。
【解决方案2】:

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

=SUMPRODUCT((REST!$D$2:$D$2225&lt;&gt;"")/COUNTIF(REST!$D$2:$D$2225,REST!$D$2:$D$2225&amp;""))

普通公式,因此无需 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

希望这会有所帮助。

【讨论】:

  • 感谢您的回复。我想将数字存储在变量中,而不是单元格中,但是当我实现您的解决方案时,MsgBox 给我的是“True”而不是数字。
  • @Amatya:哪个解决方案正在返回True
  • MsgBox var_TOTAL_TradeId_count_FL ,我正在使用中间解决方案,使用评估将值存储在变量中。我已经编辑了我的原始问题以包含实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多