VBA 中带有“<”的 SUMIFS 公式

SUMIFS Formula in VBA with "<"

请问我使用 " < " &$F 的倒数第二个 SUMIFS 公式有什么问题。在所有单元格中返回的所有内容均为 FALSE。没有 < 的最后一个 SUMIFS 工作正常。

Sub SumGroups()

Worksheets("Database").Activate
Dim lastCode, lastFiltCode As Integer
Dim Formula As String

'Determine Last Row in Column O (Unfiltered Codes)
lastCode = Range("O" & Rows.Count).End(xlUp).Row

'Filter Unique Codes into Column A Sheet2
Range("O1:O" & lastCode).AdvancedFilter Action:=xlFilterCopy, _
      CopyToRange:=Sheet2.Range("A1"), Unique:=True
'Determine last Row in Column A (Filtered Codes)
Worksheets("Sheet2").Activate
lastFiltCode = Sheet2.Range("A" & Rows.Count).End(xlUp).Row

'Place SUMIF Formulas in Columns Sheet2    
Worksheets("Sheet2").Range("B2:B" & lastFiltCode).Formula = _
"=SUMIFS(Database!$M:$M$" & lastCode & ",Database!$O:$O$" & lastCode & ",A2)"
Worksheets("Sheet2").Range("D2:D" & lastFiltCode).Formula = _
"=SUMIFS(Database!$M:$M$" & lastCode & ",Database!$O:$O$" & lastCode & ",A2,Database!$I:$I$" & lastCode & "," < " &$F)"
 Worksheets("Sheet2").Range("F2:F" & lastFiltCode).Formula = _
"=SUMIFS(Database!$M:$M$" & lastCode & ",Database!$O:$O$" & lastCode & ",A2,Database!$I:$I$" & lastCode & ",$F)"

End Sub
Worksheets("Sheet2").Range("D2:D" & lastFiltCode).Formula = _
"=SUMIFS(Database!$M:$M$" & lastCode & ",Database!$O:$O$" & lastCode &      ",A2,Database!$I:$I$" & lastCode & ","" < "" &$F)"

这样就可以了。 把 < 放在引号里。

首先,为了在公式中得到 <$F,我使用 Chr(34) 在公式中添加括号 ""。

除此之外,你是mixing-up几件事:

  • 尽量避免使用 Worksheets("Database").ActivateWorksheets("Sheet2").Activate,而是使用完全限定的工作 sheet 和范围,例如:With Worksheets("Database") 和内部 lastCode = .Range("O" & .Rows.Count).End(xlUp).Row .
  • 您有 Sheet2Worksheets("Sheet2"),这两个并不总是表示相同的工作sheet。您可以将 Sheet2(代号)重命名为 "Something",这将是您的第二个 sheet,并将 Sheet3(代号)重命名为 "Sheet2"你有问题。所以决定你想使用哪种方法(我更喜欢使用Worksheets("Sheet2"))。
  • Dim lastCode, lastFiltCode As Integer 表示 lastCode 实际上是 VariantlastFiltCode 实际上是 Integer。无论如何,当您尝试获取最后一行时,最好对这两个变量都使用 Long

代码

Option Explicit

Sub SumGroups()

Dim lastCode As Long, lastFiltCode As Long

'Determine Last Row in Column O (Unfiltered Codes)
With Worksheets("Database")
    lastCode = .Range("O" & .Rows.Count).End(xlUp).Row

    'Filter Unique Codes into Column A Sheet2
    .Range("O1:O" & lastCode).AdvancedFilter Action:=xlFilterCopy, _
            CopyToRange:=Worksheets("Sheet2").Range("A1"), Unique:=True        
End With

With Worksheets("Sheet2")
    'Determine last Row in Column A (Filtered Codes)
    lastFiltCode = .Range("A" & .Rows.Count).End(xlUp).Row

    'Place SUMIF Formulas in Columns Sheet2
    .Range("B2:B" & lastFiltCode).Formula = _
        "=SUMIFS(Database!$M:$M$" & lastCode & ",Database!$O:$O$" & lastCode & ",A2)"

    .Range("D2:D" & lastFiltCode).Formula = _
        "=SUMIFS(Database!$M:$M$" & lastCode & ",Database!$O:$O$" & lastCode & ",A2,Database!$I:$I$" & lastCode & "," & Chr(34) & "<" & Chr(34) & "&$F)"

    .Range("F2:F" & lastFiltCode).Formula = _
        "=SUMIFS(Database!$M:$M$" & lastCode & ",Database!$O:$O$" & lastCode & ",A2,Database!$I:$I$" & lastCode & ",$F)"
End With

End Sub

只是为了阐明其他答案有效的原因:

SumIfs(以及其他各种需要字符串运算符(例如 CountIf)的 Excel 函数期望逻辑运算符及其后续语句表示为字符串。即应该包含在语音标记中,例如 "myString".

因为公式也是字符串,例如ActiveCell.Formula = "=If(A1=3, 1, 0)" 编译器对哪组引号表示字符串感到困惑。因此,例如,这将不起作用:ActiveCell.Formula = "=If(A1=3, "Yes", "No")".

从技术上讲,处理方法是将所需的引号括在它自己的引号中; """ myValue """.

然而,这很快就会变得混乱。相反,使用 Character 函数来 return 您需要的字符。在本例中为 34; chr(34) & myvalue & (chr34).