VBA 中的 SUMPRODUCT 具有多个 IF 和 FOR 语句 - 错误
SUMPRODUCT in VBA with multiple IF and FOR statements - ERRORS
我正在尝试在 VBA 中使用以下 SUMPRODUCT
公式:
=SUMPRODUCT(--('Sheet 1'!$C:$C="OK"),(MONTH(Sheet1!$A:$A)=MONTH($B3))*(YEAR(Sheet1!$A:$A)=YEAR($B3))*(MONTH(Sheet1!$B:$B)=MONTH(C))*(YEAR(Sheet1!$B:$B)=YEAR(C)))
我的工作簿与航班预订有关,它由两张纸组成,Sheet 1 和 Sheet 2。具体来说:
Sheet 1包括示例数据:
| Booking date | Check-in date | Status |
|--------------|---------------|--------|
| 25-Sep-18 | 18-May-19 | OK |
| 26-Sep-18 | 05-Jul-19 | OK |
| 26-Sep-18 | 18-Jun-19 | OK |
| 01-Oct-18 | 19-Jun-19 | OK |
| 01-Oct-18 | 18-May-19 | OK |
| 02-Oct-18 | 19-Apr-19 | OK |
| 03-Oct-18 | 18-May-19 | CL |
| 06-Oct-18 | 14-May-19 | CL |
| 07-Oct-18 | 17-Jun-19 | OK |
而 Sheet 2 包括与 SUMPRODUCT
公式相关的分析输出:
| Booking/Check-in | Apr-19 | May-19 | Jun-19 | Jul-19 |
|------------------|--------|--------|--------|--------|
| Sep-18 | | 1 | 1 | 1 |
| Oct-18 | 1 | 1 | 2 | |
我按照@Rosetta 和@Foxfire 以及 Burns 和 Burns 的建议修复了错误“13”- 类型不匹配。我还按照@JvdV 的建议添加了 Else。现在代码如下所示:
Dim bk As Worksheet
Set bk = Worksheets("Sheet 1")
For Z = 2 To 3
For j = 2 To 5
For i = 2 To 10
If bk.Cells(i, 3).Value = "OK" Then
If Month(bk.Cells(i, 1)) = Month(Cells(Z, 1)) Then
If Year(bk.Cells(i, 1)) = Year(Cells(Z, 1)) Then
If Month(bk.Cells(i, 2)) = Month(Cells(1, j)) Then
If Year(bk.Cells(i, 2)) = Year(Cells(1, j)) Then
Range(Cells(j, Z)).Value = Range(Cells(j, Z)).Value + 1
Else Next i
End If
End If
End If
End If
End If
Next j
Next Z
End Sub
现在我得到 Next without For
编译错误。有什么想法吗?
您还可以使用 .Evaluate
从 SUMPRODUCT
公式中获取结果,因为您希望将公式集成到 VBA 中。我已经重写了您的一些代码,使其也更加动态。这样,您可以在 sheet1 上拥有动态数量的行,在 sheet2 上拥有动态数量的行和列。请看下面的代码:
Sub Test()
Dim rng1 As Range, rng2 As Range, rng3 As Range
Dim lr1 As Long, lr2 As Long, lc As Long, x As Long, y As Long
With ThisWorkbook.Sheets("Sheet1")
lr1 = .Cells(.Rows.Count, "A").End(xlUp).Row
Set rng1 = .Range("A2:A" & lr1)
Set rng2 = .Range("B2:B" & lr1)
Set rng3 = .Range("C2:C" & lr1)
End With
With ThisWorkbook.Sheets("Sheet2")
lr2 = .Cells(.Rows.Count, "A").End(xlUp).Row
lc = .Cells(1, .Columns.Count).End(xlToLeft).Column
For x = 2 To lc
For y = 2 To lr2
.Cells(y, x).Value = .Evaluate("=SUMPRODUCT(--(Sheet1!" & rng3.Address & "=""OK""),((MONTH(Sheet1!" & rng1.Address & ")=" & Month(.Cells(y, 1)) & ")*(YEAR(Sheet1!" & rng1.Address & ")=" & Year(.Cells(y, 1)) & "))*((MONTH(Sheet1!" & rng2.Address & ")=" & Month(.Cells(1, x)) & ")*(YEAR(Sheet1!" & rng2.Address & ")=" & Year(.Cells(1, x)) & ")))")
Next y
Next x
End With
End Sub
除了通过 sheet2 上所有行和列的动态循环之外,这将删除所有这些 For ... Next
循环。
我希望你明白发生了什么。如果您有任何疑问,请随时提问。确保相应地调整工作表的名称!
我正在尝试在 VBA 中使用以下 SUMPRODUCT
公式:
=SUMPRODUCT(--('Sheet 1'!$C:$C="OK"),(MONTH(Sheet1!$A:$A)=MONTH($B3))*(YEAR(Sheet1!$A:$A)=YEAR($B3))*(MONTH(Sheet1!$B:$B)=MONTH(C))*(YEAR(Sheet1!$B:$B)=YEAR(C)))
我的工作簿与航班预订有关,它由两张纸组成,Sheet 1 和 Sheet 2。具体来说:
Sheet 1包括示例数据:
| Booking date | Check-in date | Status |
|--------------|---------------|--------|
| 25-Sep-18 | 18-May-19 | OK |
| 26-Sep-18 | 05-Jul-19 | OK |
| 26-Sep-18 | 18-Jun-19 | OK |
| 01-Oct-18 | 19-Jun-19 | OK |
| 01-Oct-18 | 18-May-19 | OK |
| 02-Oct-18 | 19-Apr-19 | OK |
| 03-Oct-18 | 18-May-19 | CL |
| 06-Oct-18 | 14-May-19 | CL |
| 07-Oct-18 | 17-Jun-19 | OK |
而 Sheet 2 包括与 SUMPRODUCT
公式相关的分析输出:
| Booking/Check-in | Apr-19 | May-19 | Jun-19 | Jul-19 |
|------------------|--------|--------|--------|--------|
| Sep-18 | | 1 | 1 | 1 |
| Oct-18 | 1 | 1 | 2 | |
我按照@Rosetta 和@Foxfire 以及 Burns 和 Burns 的建议修复了错误“13”- 类型不匹配。我还按照@JvdV 的建议添加了 Else。现在代码如下所示:
Dim bk As Worksheet
Set bk = Worksheets("Sheet 1")
For Z = 2 To 3
For j = 2 To 5
For i = 2 To 10
If bk.Cells(i, 3).Value = "OK" Then
If Month(bk.Cells(i, 1)) = Month(Cells(Z, 1)) Then
If Year(bk.Cells(i, 1)) = Year(Cells(Z, 1)) Then
If Month(bk.Cells(i, 2)) = Month(Cells(1, j)) Then
If Year(bk.Cells(i, 2)) = Year(Cells(1, j)) Then
Range(Cells(j, Z)).Value = Range(Cells(j, Z)).Value + 1
Else Next i
End If
End If
End If
End If
End If
Next j
Next Z
End Sub
现在我得到 Next without For
编译错误。有什么想法吗?
您还可以使用 .Evaluate
从 SUMPRODUCT
公式中获取结果,因为您希望将公式集成到 VBA 中。我已经重写了您的一些代码,使其也更加动态。这样,您可以在 sheet1 上拥有动态数量的行,在 sheet2 上拥有动态数量的行和列。请看下面的代码:
Sub Test()
Dim rng1 As Range, rng2 As Range, rng3 As Range
Dim lr1 As Long, lr2 As Long, lc As Long, x As Long, y As Long
With ThisWorkbook.Sheets("Sheet1")
lr1 = .Cells(.Rows.Count, "A").End(xlUp).Row
Set rng1 = .Range("A2:A" & lr1)
Set rng2 = .Range("B2:B" & lr1)
Set rng3 = .Range("C2:C" & lr1)
End With
With ThisWorkbook.Sheets("Sheet2")
lr2 = .Cells(.Rows.Count, "A").End(xlUp).Row
lc = .Cells(1, .Columns.Count).End(xlToLeft).Column
For x = 2 To lc
For y = 2 To lr2
.Cells(y, x).Value = .Evaluate("=SUMPRODUCT(--(Sheet1!" & rng3.Address & "=""OK""),((MONTH(Sheet1!" & rng1.Address & ")=" & Month(.Cells(y, 1)) & ")*(YEAR(Sheet1!" & rng1.Address & ")=" & Year(.Cells(y, 1)) & "))*((MONTH(Sheet1!" & rng2.Address & ")=" & Month(.Cells(1, x)) & ")*(YEAR(Sheet1!" & rng2.Address & ")=" & Year(.Cells(1, x)) & ")))")
Next y
Next x
End With
End Sub
除了通过 sheet2 上所有行和列的动态循环之外,这将删除所有这些 For ... Next
循环。
我希望你明白发生了什么。如果您有任何疑问,请随时提问。确保相应地调整工作表的名称!