Excel VBA использует операторы <,>,> =, <= с двойными значениями в качестве аргументов функции - PullRequest
1 голос
/ 14 июля 2020

Через несколько минут я задал go вопрос по этому поводу и решил создать новый, с более подробным описанием проблемы. Итак, я подготовил простой лист:

sheet example

On G4 (green) I placed the formula =SUMIFS(B1:B20;A1:A20;"> = "& E4; A1: A20;" <"& E5) </code>, и он отлично работает.

Ячейка 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 как longs:

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

ячейка E4 (синяя) оценивается как 17 (что правильно, потому что есть 17 значения между 44004 и 44005).

Кто-нибудь что-нибудь знает об этом? Мне это кажется багом ...

1 Ответ

5 голосов
/ 14 июля 2020

На снимке экрана ваша десятичная точка - это ,.

Когда вы объединяете строку с числом, например, в ">=" & 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))
...