【问题标题】:Create VBA loop for formula that contains a string search and sumifs为包含字符串搜索和 sumifs 的公式创建 VBA 循环
【发布时间】:2013-11-26 17:56:46
【问题描述】:

我有一个公式可以在另一张纸上搜索列标题,然后一旦找到它就会通过一些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=8B1=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 中的值。

【问题讨论】:

  • 请告诉我们您尝试了什么?要求代码的问题必须表明对正在解决的问题的最低限度的理解。包括尝试的解决方案、它们为什么不起作用以及预期的结果。另见:Stack Overflow question checklist
  • 好的,Siddarth,感谢您的清单——我会尝试更好地澄清。
  • 这些数字与月份有关吗?它看起来像财务数据...
  • 是的,他们是!基本上是将月份加在一起,但它们并不相邻,所以我尝试使用这个编号方案来表示月份。

标签: loops excel while-loop excel-2007 vba


【解决方案1】:

好吧,如果 B 始终是一个静态数字,只需创建一个列,其中包含从 B 开始的可能数字,并计算附加到一个月的所有可能数字。因此,如果 B=20 且 A

AC   AD 
Jan  20
Feb  21
...
Dec  32

然后创建一个公式,将这些数字与您在 A1 中选择的数字进行比较看起来像这样:

=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,而不是分配的数字)。这样它看起来对用户来说很好(他们不一定会理解这些数字)并且仍然会输出您想要的结果。

【讨论】:

    猜你喜欢
    • 2016-10-26
    • 2013-07-03
    • 2017-02-09
    • 2019-02-18
    • 2021-06-12
    • 2019-05-17
    • 2013-06-26
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多