我有一个公式可以在另一个工作表上搜索列标题,然后一旦找到它就会经过一些 sumifs
.我的数据大致如下所示:
1 8 10 11 12
Column E ... Column N ... Column O ... Column AB Column AC Column AD Column AE
Existing CCS data 100.00 100.00 120.00 150.00
列名上方的数字很重要,我用它们来指定与我的公式相关的列。现在,实际上只有少数几个单元格对循环很重要。单元格 A1 具有我要终止的列的编号。单元格 B1 具有我要从中开始的列的编号。所以如果我选择 A1=8
和 B1=1
,我希望下面的代码运行 sumifs
首先搜索列 1
,然后对于列 2
, 一直到列 8
并将每个循环中的所有值加在一起并给出总数。以上表为例,如果我设置A1="12"
和 B1="10"
,我要它吐出来370.00
.
我目前的公式是这样的:
=SUMIFS(INDEX('Program Data'!$A:$GA,0,MATCH(A1,'Data'!$1:$1,0)),'Data'!$N:$N,"CCS",
'Data'!$E:$E,"Existing")+SUMIFS(INDEX('Data'!$A:$GA,0,MATCH(A1,'Data'!$1:$1,0)),
'Data'!$N:$N,"CCS",'Data'!$E:$E,"Deep")
上面的公式只给出了包含 A1
中数字字符串的列的总计,但我需要所有列的总计,其中包含 B1 -> A1
中的字符串.
编辑
根据要求,这是我在此循环中失败的尝试。由于 B1 本质上始终是一个静态数字(意味着它始终是 45 或 88 或其他),我想我可以创建一个循环,告诉它从 B1 的任何值开始,并根据需要创建公式并将其放入单元格中它。所以对于这个,B1=1=z...
Sub LoopingYTD()
Dim z As Integer: z = 1
Dim formulaString2 As String
Do Until z = Range("A1") + 1
If formulaString2 = "" Then
formulaString2 = "="
Else
formulaString2 = formulaString2 & " + "
End If
formulaString2 = formulaString2 + " SUMIFS(INDEX('Data'!A:GA,0,MATCH("
formulaString2 = formulaString2 & """*"" &
formulaString2 = formulaString2 & "z"&" ""
formulaString2 = formulaString2 & """*""" & ",'Data'!1:1,0)),"
formulaString2 = formulaString2 & "'Data'!$N:$N,”CCS”,”
formulaString2 = formulaString2 & “'Data'!$E:$E,”Existing”))"
formulaString2 = formulaString2 & "+ SUMIFS(INDEX('Data'!A:GA,0,MATCH("
formulaString2 = formulaString2 & """*"" &
formulaString2 = formulaString2 & "z"&" ""
formulaString2 = formulaString2 & """*""" & ",'Data'!1:1,0)),"
formulaString2 = formulaString2 & "'Data'!$N:$N,”CCS”,”
formulaString2 = formulaString2 & “Data'!$E:$E, ”Deep”))"
z = z + 1
Loop
Range("B20").Value = formulaString2
我不断收到“应用程序定义或对象定义的错误”,但我不确定对此有何补救措施。
这是基于早期 question I asked 的建议.从那以后,我一直在努力简化它,因为那有点乱,所以我只希望它搜索单个数字字符串。基本上运行链接中的代码,而不是一些基于多个单元格的长而复杂的字符串,我只希望它向上计数,直到它达到 A1 中的值。
最佳答案
好吧,如果 B 始终是一个静态数字,只需创建一个列,其中包含从 B 开始的可能数字,并计算附加到月份的所有可能数字。因此,如果 B=20,并且 A <=32,则该列将如下所示(假设这是 AD 列):
AC AD
Jan 20
Feb 21
...
Dec 32
然后创建一个公式,使用 AC 中的月份符号将这些数字与您在 A1 中选择的数字进行比较,如果 A1<=(AD 列中的值),则将其相加。公式会有点长,但是看起来像这样:
=SUM(
(SUMIFS(INDEX('Program Data'!$A:$GA,0,MATCH($AD1,'Data'!1:1,0)),
'Data'!$N:$N,"CCS",'Data'!$E:$E,"Existing")+SUMIFS(INDEX('
'Data'!$A:$GA,0,MATCH($AD1,'Data'!1:1,0)),'Data'!$N:$N,"CCS",
'Data'!$E:$E,"Deep"))*(1<=MATCH($A$1,$AC$1:$AC$12,0)),
(SUMIFS(INDEX('Data'!$A:$GA,0,MATCH($AD2,'Program Data'!1:1,0)),
'Data'!$N:$N,"CCS",'Data'!$E:$E,"Existing")+SUMIFS(INDEX('
'Data'!$A:$GA,0,MATCH($AD2,'Data'!1:1,0)),'Data'!$N:$N,"CCS",
'Data'!$E:$E,"Deep"))*(2<=MATCH($A$1,$AC$1:$AC$12,0)),
(SUMIFS(INDEX('Data'!$A:$GA,0,MATCH($AD3,'Data'!1:1,0)),
'Data'!$N:$N,"CCS",'Data'!$E:$E,"Existing")+SUMIFS(INDEX(
'Data'!$A:$GA,0,MATCH($AD3,'Data'!1:1,0)),'Data'!$N:$N,"CCS",
'Data'!$E:$E,"Deep"))*(3<=MATCH($A$1,$AC$1:$AC$12,0)),
....,....,....
(SUMIFS(INDEX('Data'!$A:$GA,0,MATCH($AD12,'Data'!1:1,0)),
'Data'!$N:$N,"CCS",'Data'!$E:$E,"Existing")+SUMIFS(INDEX(
'Data'!$A:$GA,0,MATCH($AD12,'Data'!1:1,0)),
'Data'!$N:$N,"CCS",'Data'!$E:$E,"Deep"))*(12<=MATCH($A$1,$AC$1:$AC$12,0)))
其中 A1 = 您要停在的号码。请注意,您将语句末尾的匹配数字更改为每个升序月份数字(1-12,不是分配的数字)。这样它对用户来说看起来不错(他们不一定会理解这些数字)并且仍然会输出您想要的结果。
关于loops - 为包含字符串搜索和求和的公式创建 VBA 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19965529/