Excel VBA中带日期条件的Sumifs

Excel VBA中带日期条件的Sumifs,excel,vba,excel-2016,Excel,Vba,Excel 2016,我正在努力用下面的代码做一个Sumifs Sub Mandays() Application.ScreenUpdating = False Dim Summ1 As Double, Summ2 As Double, Summ3 As Double, Summ4 As Double, Summ5 As Double Dim WS1, WS2 As Worksheet Dim Arr1 As Variant Dim SumRng1 As Range, SumRng2 As Range, SumR

我正在努力用下面的代码做一个Sumifs

Sub Mandays()
Application.ScreenUpdating = False

Dim Summ1 As Double, Summ2 As Double, Summ3 As Double, Summ4 As Double, 
Summ5 As Double
Dim WS1, WS2 As Worksheet
Dim Arr1 As Variant
Dim SumRng1 As Range, SumRng2 As Range, SumRng3 As Range, SumRng4 As Range, 
SumRng5 As Range
Dim CndRng1 As Range, CndRng2 As Range, CndRng3 As Range, CndRng4 As Range, 
CndRng5 As Range, CndRng6 As Range, CndRng7 As Range
Dim tFilter1 As String, tFilter2 As String, tFilter3 As String, tFilter5 As 
String
Dim i As Long, Fstdate As Long, LstDate As Long, X As Long


Set WS1 = Sheets("Daily_Production_Stats")
Set WS2 = Sheets("Master_WDD")
Arr1 = WS1.UsedRange.Value
Set SumRng1 = WS2.Range("P2:P30000")
Set SumRng2 = WS2.Range("W2:W30000")
Set SumRng3 = WS2.Range("AD2:AD30000")
Set SumRng4 = WS2.Range("AK2:AK30000")
Set SumRng5 = WS2.Range("AR2:AR30000")

Set CndRng1 = WS2.Range("J2:J30000")
Set CndRng2 = WS2.Range("Q2:Q30000")
Set CndRng3 = WS2.Range("X2:X30000")
Set CndRng4 = WS2.Range("AE2:AE30000")
Set CndRng5 = WS2.Range("AL2:AL30000")


Set CndRng6 = WS2.Range("D2:D30000")
Set CndRng7 = WS2.Range("F2:F30000")

tFilter1 = WS1.Range("D1")
Fstdate = WS1.Cells(2, 4)
X = WS1.Cells(2, Columns.Count).End(xlToLeft).Column
LstDate = WS1.Cells(2, X).Value


With WS1
.Range("A5:A300").Clear
If CndRng6 >= Fstdate And CndRng6) <= LstDate Then

For i = 3 To UBound(Arr1)
tFilter2 = WS1.Cells(i, 3)
Summ1 = .Application.WorksheetFunction.SumIfs(SumRng1, CndRng1, tFilter1, 
CndRng7, tFilter2)
Summ2 = .Application.WorksheetFunction.SumIfs(SumRng2, CndRng2, tFilter1, 
CndRng7, tFilter2)
Summ3 = .Application.WorksheetFunction.SumIfs(SumRng3, CndRng3, tFilter1, 
CndRng7, tFilter2)
Summ4 = .Application.WorksheetFunction.SumIfs(SumRng4, CndRng4, tFilter1, 
CndRng7, tFilter2)
Summ5 = .Application.WorksheetFunction.SumIfs(SumRng5, CndRng1, tFilter1, 
CndRng7, tFilter2)
.Cells(i, 1).Value = Summ1 / 480
Summ1 = 0
Next i
End If

.Activate
End With

End Sub
Sub Mandays()
Application.ScreenUpdating=False
Dim Summ1为双精度,Summ2为双精度,Summ3为双精度,Summ4为双精度,
加5等于双倍
将WS1、WS2标注为工作表
Dim-Arr1作为变体
Dim SumRng1作为量程,SumRng2作为量程,SumRng3作为量程,SumRng4作为量程,
SumRng5 As系列
尺寸CndRng1作为量程,CndRng2作为量程,CndRng3作为量程,CndRng4作为量程,
CndRng5作为量程,CndRng6作为量程,CndRng7作为量程
将tFilter1设置为字符串,将tFilter2设置为字符串,将tFilter3设置为字符串,将tFilter5设置为字符串
一串
尺寸i为长,Fstdate为长,LstDate为长,X为长
设置WS1=工作表(“每日生产统计”)
设置WS2=图纸(“主图纸”)
Arr1=WS1.UsedRange.Value
设置SumRng1=WS2.范围(“P2:P30000”)
设置SumRng2=WS2.Range(“W2:W30000”)
设置SumRng3=WS2.范围(“AD2:AD30000”)
设置SumRng4=WS2.Range(“AK2:AK30000”)
设置SumRng5=WS2.Range(“AR2:AR30000”)
设置CndRng1=WS2.范围(“J2:J30000”)
设置CndRng2=WS2.范围(“Q2:Q30000”)
设置CndRng3=WS2.范围(“X2:X30000”)
设置CndRng4=WS2.范围(“AE2:AE30000”)
设置CndRng5=WS2.范围(“AL2:AL30000”)
设置CndRng6=WS2.范围(“D2:D30000”)
设置CndRng7=WS2.范围(“F2:F30000”)
tFilter1=WS1.范围(“D1”)
Fstdate=WS1。单元(2,4)
X=WS1.Cells(2,Columns.Count).End(xlToLeft).Column
LstDate=WS1.Cells(2,X).Value
使用WS1
.范围(“A5:A300”).清除
如果用户“GMalc”在注释中提到CndRng6>=Fstdate和CndRng6)=Fstdate和CndRng6),则不能将整个范围与单个值进行比较。您需要找到范围中的第一个和最后一个值。然后将它们与FstDate和LstDate进行比较

尝试使用下面的代码行,而不是您现有的代码行

'worksheetfunction.min will find the smallest value in the range which should be the first date
'worksheetfunction.max will find the largest value in the range which should be the last date

If WorksheetFunction.Min(CndRng6) >= Fstdate And WorksheetFunction.Max(CndRng6) <= LstDate Then
”worksheetfunction.min将找到范围内的最小值,该范围应为第一个日期
'worksheetfunction.max将在应为最后日期的范围内找到最大值

如果WorksheetFunction.Min(CndRng6)>=Fstdate和WorksheetFunction.Max(CndRng6),我认为您无法测试30k单元格的范围是否小于或大于日期值,而无需循环遍历每个单元格。另外,您应该将Fstdate和LstDate声明为日期类型的变量。感谢您的GMalc更新。我尝试将FstDate和LstDate声明为日期。但还是一样的错误。是的,他是对的。我删除了if条件,并将其作为另一个sumifs标准提到。现在一切正常。谢谢