如何创建一个用 COUNTIFS 填充可变大小矩阵的循环?
How to create a loop that populates a variable-sized matrix with COUNTIFS?
情况比较复杂。我有一个例程,需要每隔一天完成一次。我有一个包含 2 个不同 sheet 的工作簿,一个称为“交易列表”,包含一个 table,如下所示:
业务员
活动
名称 1
活动 A
名称 1
活动 B
名称 2
活动 C
姓名 3
活动 A
姓名 N
活动 N
另一个 sheet,称为“矩阵”,由 VBA 代码生成,当前结果如下:
名称 1
名称 2
姓名 3
姓名 N
活动 A
活动 C
活动 A
活动 N
这个可变大小的矩阵可以根据我得到的报告改变列和行的大小。实际的工作簿有更多的内容,我只是用这些例子来简化它。您会注意到空单元格,因为我不知道如何创建代码来填充它们。我真正希望进入其中的是每个销售员分配的活动数量。
期望的结果:
名称 1
名称 2
姓名 3
姓名 N
活动 A
1
0
1
N
活动 B
1
0
0
N
活动 C
0
1
0
N
活动 N
N
N
N
N
基本上我需要的是使用第一行和第一列作为 COUNTIFS 的参数来填充矩阵。
有人可以帮我吗?我真的很感激任何提示! ;)
这是我在社区的第一个问题,如果我有任何错误,请提前道歉。我不好意思问,但我不知道该怎么做。
Function FnTwoDimentionDynamic()
Dim arrTwoD()
Dim intRows
Dim intCols
Dim i As Integer, j As Integer
intRows = Sheets("matrix").Cells(Rows.Count, 1).End(xlUp).Row - 1
intCols = Sheets("matrix").Cells(1, Columns.Count).End(xlToLeft).Column - 1
ReDim Preserve arrTwoD(1 To intRows, 1 To intCols)
'Here I am using a simple calculation just to see if will populate
'the variable range, but what I need is a COUNTIFS searching for
'the times a Salesman appears in certain Campaing
For i = 1 To intRows
For j = 1 To intCols
arrTwoD(i, j) = i * 2 + j ^ 2
Next j
Next i
Sheets("matrix").Select: Range("B2").Select
For i = 1 To intRows
For j = 1 To intCols
ActiveCell.Value = arrTwoD(i, j)
ActiveCell.Offset(0, 1).Select
Next j
ActiveCell.Offset(1, -intCols).Select
Next i
End Function
下面的代码做了几个假设,第一个是您使用的是 Excel 365 并且 sheet deals list
上的数据从 A1 开始。
如果其中任何一个不正确,可以更改代码。
此外,我不确定您是如何创建 'matrix' 的,所以我在一开始就使用了代码来创建。
Option Explicit
Sub CreateMatrixAndCounts()
Dim wsDeals As Worksheet
Dim wsMatrix As Worksheet
Dim rngSalesmen As Range
Dim rngCampaigns As Range
Dim rngFormulas As Range
Dim arrUniqueSalesmen As Variant
Dim arrUniqueCampaigns As Variant
Set wsDeals = Sheets("Deals List")
With wsDeals
Set rngSalesmen = .Range("A2", .Range("A" & .Rows.Count).End(xlUp))
Set rngCampaigns = rngSalesmen.Offset(, 1)
arrUniqueSalesmen = Application.Sort(Application.Unique(rngSalesmen))
arrUniqueCampaigns = Application.Sort(Application.Unique(rngCampaigns))
End With
Set wsMatrix = Sheets.Add
wsMatrix.Range("A2").Resize(UBound(arrUniqueSalesmen)).Value = arrUniqueSalesmen
wsMatrix.Range("B1").Resize(, UBound(arrUniqueCampaigns)).Value = Application.Transpose(arrUniqueCampaigns)
Set rngFormulas = wsMatrix.Range("B2").Resize(UBound(arrUniqueSalesmen), UBound(arrUniqueCampaigns))
With rngSalesmen
rngFormulas.Formula = "=COUNTIFS(" & .Address(External:=True) & ", $A2, " & .Offset(, 1).Address(External:=True) & ", B)"
End With
End Sub
情况比较复杂。我有一个例程,需要每隔一天完成一次。我有一个包含 2 个不同 sheet 的工作簿,一个称为“交易列表”,包含一个 table,如下所示:
业务员 | 活动 |
---|---|
名称 1 | 活动 A |
名称 1 | 活动 B |
名称 2 | 活动 C |
姓名 3 | 活动 A |
姓名 N | 活动 N |
另一个 sheet,称为“矩阵”,由 VBA 代码生成,当前结果如下:
名称 1 | 名称 2 | 姓名 3 | 姓名 N | |
---|---|---|---|---|
活动 A | ||||
活动 C | ||||
活动 A | ||||
活动 N |
这个可变大小的矩阵可以根据我得到的报告改变列和行的大小。实际的工作簿有更多的内容,我只是用这些例子来简化它。您会注意到空单元格,因为我不知道如何创建代码来填充它们。我真正希望进入其中的是每个销售员分配的活动数量。
期望的结果:
名称 1 | 名称 2 | 姓名 3 | 姓名 N | |
---|---|---|---|---|
活动 A | 1 | 0 | 1 | N |
活动 B | 1 | 0 | 0 | N |
活动 C | 0 | 1 | 0 | N |
活动 N | N | N | N | N |
基本上我需要的是使用第一行和第一列作为 COUNTIFS 的参数来填充矩阵。
有人可以帮我吗?我真的很感激任何提示! ;)
这是我在社区的第一个问题,如果我有任何错误,请提前道歉。我不好意思问,但我不知道该怎么做。
Function FnTwoDimentionDynamic()
Dim arrTwoD()
Dim intRows
Dim intCols
Dim i As Integer, j As Integer
intRows = Sheets("matrix").Cells(Rows.Count, 1).End(xlUp).Row - 1
intCols = Sheets("matrix").Cells(1, Columns.Count).End(xlToLeft).Column - 1
ReDim Preserve arrTwoD(1 To intRows, 1 To intCols)
'Here I am using a simple calculation just to see if will populate
'the variable range, but what I need is a COUNTIFS searching for
'the times a Salesman appears in certain Campaing
For i = 1 To intRows
For j = 1 To intCols
arrTwoD(i, j) = i * 2 + j ^ 2
Next j
Next i
Sheets("matrix").Select: Range("B2").Select
For i = 1 To intRows
For j = 1 To intCols
ActiveCell.Value = arrTwoD(i, j)
ActiveCell.Offset(0, 1).Select
Next j
ActiveCell.Offset(1, -intCols).Select
Next i
End Function
下面的代码做了几个假设,第一个是您使用的是 Excel 365 并且 sheet deals list
上的数据从 A1 开始。
如果其中任何一个不正确,可以更改代码。
此外,我不确定您是如何创建 'matrix' 的,所以我在一开始就使用了代码来创建。
Option Explicit
Sub CreateMatrixAndCounts()
Dim wsDeals As Worksheet
Dim wsMatrix As Worksheet
Dim rngSalesmen As Range
Dim rngCampaigns As Range
Dim rngFormulas As Range
Dim arrUniqueSalesmen As Variant
Dim arrUniqueCampaigns As Variant
Set wsDeals = Sheets("Deals List")
With wsDeals
Set rngSalesmen = .Range("A2", .Range("A" & .Rows.Count).End(xlUp))
Set rngCampaigns = rngSalesmen.Offset(, 1)
arrUniqueSalesmen = Application.Sort(Application.Unique(rngSalesmen))
arrUniqueCampaigns = Application.Sort(Application.Unique(rngCampaigns))
End With
Set wsMatrix = Sheets.Add
wsMatrix.Range("A2").Resize(UBound(arrUniqueSalesmen)).Value = arrUniqueSalesmen
wsMatrix.Range("B1").Resize(, UBound(arrUniqueCampaigns)).Value = Application.Transpose(arrUniqueCampaigns)
Set rngFormulas = wsMatrix.Range("B2").Resize(UBound(arrUniqueSalesmen), UBound(arrUniqueCampaigns))
With rngSalesmen
rngFormulas.Formula = "=COUNTIFS(" & .Address(External:=True) & ", $A2, " & .Offset(, 1).Address(External:=True) & ", B)"
End With
End Sub