我有以下代码但它不起作用。
Private Sub Worksheet_Activate()
Dim l As Long
Dim LastRow As Long
Dim oWkSht As Worksheet
Dim FirstDate As Date
Dim LastDate As Date
Dim tsales As Long
FirstDate = DateSerial(Year(Date), Month(Date), 1)
LastDate = DateSerial(Year(Date), Month(Date) + 1, 0)
LastRow = Range("A100000").End(xlUp).Row
Sheets(“Main”).Range("O2").Formula = "=SumIfs(Old_Products!Z2:Z & LastRow,Old_Products!O2:O & LastRow, “ >= ” & FirstDate, Old_Products!O2:O12, “ <= ” & LastDate)+Registration!Z2:Z & LastRow"
End sub
我试图sum
工作表注册列Z2中的所有值到LastRow
,如果工作表Old_Products
列O2到LastRow
的日期是当前月份的日期,那么我希望列Z中的相应值也是计数
如果你要使用VBA,那么你可以使用WorksheetFunction.SumIfs
,它是"=SumIfs
的VBA版本。
所以下面的代码,将WorksheetFunction.SumIfs
的值放在Range("O2")
的“Main”表中,它将汇总列“Z”上的所有值,其中“O”列中的日期在FirstDate
和LastDate
之间。
码
Option Explicit
Private Sub Worksheet_Activate()
'Dim l As Long '<-- not used in this code
Dim LastRow As Long
Dim oWkSht As Worksheet
Dim FirstDate As Date
Dim LastDate As Date
'Dim tsales As Long '<-- not used in this code
Set oWkSht = Worksheets("Old_Products")
FirstDate = DateSerial(Year(Date), Month(Date), 1)
LastDate = DateSerial(Year(Date), Month(Date) + 1, 0)
LastRow = oWkSht.Range("A100000").End(xlUp).Row
Sheets("Main").Range("O2").Value = Application.WorksheetFunction.SumIfs(oWkSht.Range("Z2:Z" & LastRow), oWkSht.Range("O2:O" & LastRow), ">=" & CLng(FirstDate), oWkSht.Range("O2:O" & LastRow), "<=" & CLng(LastDate))
End Sub
编辑1:我的首选版本,因为你想比较日期,你可以直接存储FirstDate
和LastDate
作为Long
,然后后来没有必要使用CLng
。
此外,添加了一个选项,使用EoMonth
函数查找该月的最后一天。
码
Option Explicit
Private Sub Worksheet_Activate()
' Dim l As Long '<-- not used in this code
Dim LastRow As Long
Dim oWkSht As Worksheet
Dim FirstDate As Long
Dim LastDate As Long
' Dim tsales As Long '<-- not used in this code
FirstDate = DateSerial(Year(Date), Month(Date), 1)
LastDate = WorksheetFunction.EoMonth(Date, 0)
Set oWkSht = Worksheets("Old_Products")
With oWkSht
LastRow = .Range("A100000").End(xlUp).Row
Sheets("Main").Range("O2").Value = Application.WorksheetFunction.SumIfs(.Range("Z2:Z" & LastRow), .Range("O2:O" & LastRow), ">=" & FirstDate, .Range("O2:O" & LastRow), "<=" & LastDate)
End With
End Sub