Excel VBA 使用运算符 <,>, >=, <= 以双打作为函数参数

Psp*_*spl 1 double excel vba 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
Run Code Online (Sandbox Code Playgroud)

很容易看出该值也应该是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)
Run Code Online (Sandbox Code Playgroud)

单元格E4(蓝色)评估为17(这是正确的,因为和17之间有值)。4400444005

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

GSe*_*erg 5

从您的屏幕截图中,您的小数点是,.

将字符串与数字串联时,例如 in ">=" & V1,数字将使用当前语言环境转换为字符串。您当前的语言环境,为小数点,因此您以">=44004,2".

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

下面的函数WorksheetFunction只期望真正的内部 en-us 参数。当您">=44004,2"作为参数传递时,它会导致计算失败,因为函数期望">=44004.2". 零结果表明过滤器格式错误。

所以你应该给它

= WorksheetFunction.SumIfs(R2, R1, ">=" & Str$(V1), R1, "<" & Str$(V2))
Run Code Online (Sandbox Code Playgroud)