Excel VBA UDF Count Ifs 与数据转换

Posted

技术标签:

【中文标题】Excel VBA UDF Count Ifs 与数据转换【英文标题】:Excel VBA UDF Count Ifs with data conversion 【发布时间】:2017-10-05 14:46:54 【问题描述】:

我正在尝试使用 Countifs 编写 UDF。我希望用户能够选择标准 1(保留为 X1)和月份(保留为 month_X)。查找表中的月份是数字,所以我希望该函数将月份名称转换为月份编号。

这行得通 - 但有没有更好的方法来转换数据? IE。更少的代码行?

Function CountIF_Custom(X1 As String, Month_X As String)
    Dim MonthArray(1 To 12, 1 To 2) As Variant

    MonthArray(1, 1) = "January"
    MonthArray(2, 1) = "February"
    MonthArray(3, 1) = "March"
    MonthArray(4, 1) = "Apr"
    MonthArray(5, 1) = "May"
    MonthArray(6, 1) = "June"
    MonthArray(7, 1) = "July"
    MonthArray(8, 1) = "August"
    MonthArray(9, 1) = "September"
    MonthArray(10, 1) = "October"
    MonthArray(11, 1) = "November"
    MonthArray(12, 1) = "December"

    MonthArray(1, 2) = "1"
    MonthArray(2, 2) = "2"
    MonthArray(3, 2) = "3"
    MonthArray(4, 2) = "4"
    MonthArray(5, 2) = "5"
    MonthArray(6, 2) = "6"
    MonthArray(7, 2) = "7"
    MonthArray(8, 2) = "8"
    MonthArray(9, 2) = "9"
    MonthArray(10, 2) = "10"
    MonthArray(11, 2) = "11"
    MonthArray(12, 2) = "12"

    For x = 1 To 12
        If Month_X = MonthArray(x, 1) Then
            Month_X = MonthArray(x, 2)
        End If
    Next x

    CountIF_Custom = Application.CountIfs(Sheets("SomeSheet").Range("SomeRange"), X1, Sheets("SomeSheet").Range("SomeRange"), Month_X)

    End Function

【问题讨论】:

您可以将您的月份放在一个常规数组中,并使用 Appication.Match 将月份名称转换为数字。 只要使用=MONTH(1&A1) 该死的@Rosetta - 正在评论您删除的答案。 :) 想说-您需要在Month 中留一个空间。 month(1 & "December") 返回 type mismatchmonth(1 & " December") 返回 12。 @DarrenBartrup-Cook,对不起,我造成了痛苦:p。我没有回答 OP 想要的 vba / udf 中的问题 【参考方案1】:

不需要数组,你可以使用带有 MonthName 函数的 for 循环:

Function CountIF_Custom(X1 As String, Month_X As String)

Dim x As Integer

For x = 1 To 12
    If Month_X = MonthName(x) Then
        Month_X = CStr(x)
        Exit For
    End If
Next x

CountIF_Custom = Application.CountIfs(Sheets("SomeSheet").Range("SomeRange"), X1, Sheets("SomeSheet").Range("SomeRange"), Month_X)

End Function

【讨论】:

甚至不需要循环:Month_X=cstr(month(datevalue("01 "+Month_X+" 2017"))) @SeanC 甚至可以休假CStr(Month(DateValue("01 " & Month_X)))(我总是使用& 来避免意外求和数字 - 在这种情况下不相关,但仍然......)

以上是关于Excel VBA UDF Count Ifs 与数据转换的主要内容,如果未能解决你的问题,请参考以下文章

自动计算与单元格属性相关的 Excel VBA UDF

Excel VBA UDF 自动完成参数

使用 VBA for Excel 在 UDF 中输入的名称无效

Excel + VBA 与货币格式之间的精度问题

Excel中函数 if ifs count countif countifs 的区别是啥

VBA Excel UDF保留原始值