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
.
另一件事,当我将 V1
和 V2
声明为多头时:
Dim V1 As Long: V1 = Int(SH.Cells(4, 5).Value)
Dim V2 As Long: V2 = Int(SH.Cells(5, 5).Value)
单元格 E4
(蓝色)的计算结果为 17
(这是正确的,因为 44004
和 44005
之间有 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))
几分钟前我发布了一个关于此事的问题,并决定创建一个新的问题描述得更好的问题。所以我准备了一个简单的工作表:
在 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
.
另一件事,当我将 V1
和 V2
声明为多头时:
Dim V1 As Long: V1 = Int(SH.Cells(4, 5).Value)
Dim V2 As Long: V2 = Int(SH.Cells(5, 5).Value)
单元格 E4
(蓝色)的计算结果为 17
(这是正确的,因为 44004
和 44005
之间有 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))