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").Activate
和 Worksheets("Sheet2").Activate
,而是使用完全限定的工作 sheet 和范围,例如:With Worksheets("Database")
和内部 lastCode = .Range("O" & .Rows.Count).End(xlUp).Row
.
- 您有
Sheet2
和 Worksheets("Sheet2")
,这两个并不总是表示相同的工作sheet。您可以将 Sheet2
(代号)重命名为 "Something",这将是您的第二个 sheet,并将 Sheet3
(代号)重命名为 "Sheet2"你有问题。所以决定你想使用哪种方法(我更喜欢使用Worksheets("Sheet2")
)。
Dim lastCode, lastFiltCode As Integer
表示 lastCode
实际上是 Variant
而 lastFiltCode
实际上是 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)
.
请问我使用 " < " &$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").Activate
和Worksheets("Sheet2").Activate
,而是使用完全限定的工作 sheet 和范围,例如:With Worksheets("Database")
和内部lastCode = .Range("O" & .Rows.Count).End(xlUp).Row
. - 您有
Sheet2
和Worksheets("Sheet2")
,这两个并不总是表示相同的工作sheet。您可以将Sheet2
(代号)重命名为 "Something",这将是您的第二个 sheet,并将Sheet3
(代号)重命名为 "Sheet2"你有问题。所以决定你想使用哪种方法(我更喜欢使用Worksheets("Sheet2")
)。 Dim lastCode, lastFiltCode As Integer
表示lastCode
实际上是Variant
而lastFiltCode
实际上是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)
.