Excel VBA 使用运算符 <,>, >=, <= 和双精度作为函数参数

Excel VBA use operators <,>, >=, <= with doubles as function arguments

几分钟前我发布了一个关于此事的问题,并决定创建一个新的问题描述得更好的问题。所以我准备了一个简单的工作表:

G4(绿色)上,我放置了公式 =SUMIFS(B1:B20;A1:A20;">="&E4;A1:A20;"<"&E5),它工作正常。

单元格E4(蓝色)由脚本填充:

Sub Button1_Click()

    Dim SH As Worksheet: Set SH = ThisWorkbook.Sheets("Sheet1")
    Dim R1 As Range: Set R1 = SH.Range(SH.Cells(1, 1), SH.Cells(20, 1))
    Dim R2 As Range: Set R2 = SH.Range(SH.Cells(1, 2), SH.Cells(20, 2))

    Dim V1 As Double: V1 = SH.Cells(4, 5).Value
    Dim V2 As Double: V2 = SH.Cells(5, 5).Value

    SH.Cells(5, 7).FormulaR1C1 = WorksheetFunction.SumIfs(R2, R1, ">=" & V1, R1, "<" & V2)

End Sub

很容易看出该值也应该是18。但是它的计算结果为 0.

另一件事,当我将 V1V2 声明为多头时:

    Dim V1 As Long: V1 = Int(SH.Cells(4, 5).Value)
    Dim V2 As Long: V2 = Int(SH.Cells(5, 5).Value)

单元格 E4(蓝色)的计算结果为 17(这是正确的,因为 4400444005 之间有 17 个值)。

有人知道这件事吗?对我来说这看起来像是一个错误...

根据您的屏幕截图,您的小数点是 ,

当您将字符串与数字连接时,例如在 ">=" & V1 中,数字将使用当前区域设置转换为字符串。您当前的区域设置有 , 作为小数点,因此您最终得到 ">=44004,2".

内部 Excel 根据 en-us 区域设置存储所有公式,除其他外,它使用 . 作为小数点。这些可以通过 .Formula.FormulaR1C1 属性访问。
Excel 界面向您显示这些公式已转换为您的语言环境。这些可以通过 .FormulaLocal.FormulaR1C1Local 属性访问。

WorksheetFunction 下的函​​数只需要真正的内部 en-us 参数。当您将 ">=44004,2" 作为参数传递时,它会导致计算失败,因为函数需要 ">=44004.2"。零结果是 an indication 过滤器格式错误。

所以你应该:

= WorksheetFunction.SumIfs(R2, R1, ">=" & Str$(V1), R1, "<" & Str$(V2))