【问题标题】:VBA create loop for column B based on value in column AVBA根据A列中的值为B列创建循环
【发布时间】:2013-11-15 08:47:18
【问题描述】:

我有一个代码可以满足我的需要。问题是我必须手动进行范围选择我想创建一个条件循环。

这是我目前使用的代码

Sub Worksheet_functions()
    Dim Sumtotal As Long
    Sumtotal = WorksheetFunction.Sum(Selection)
    Range("e2").Value = Sumtotal
    Range("h2").Value = Range("e2") + Range("h2")
End Sub

这就是我的数据的样子

         Price Volume     E   H
          10    100
          10    50
          10    80
          9     100
          9     50
          8     100
          8     100
          10    50
          10    250

目前我正在根据价格列中的值从上到下手动选择交易量列。

条件是

  1. 如果价格相同,请继续选择它们,直到它们不同为止

  2. 如果价格下跌,那么这些选定的单元格应在 e4 中求和并添加到 h4

  3. 如果价格上涨,那么这些选定的单元格应在 e2 中求和并添加到 h4

对于我的示例,这看起来像:

              ( H2: 100+50+80  +50+250 = 530 )
              ( H4: 100+50  +100+100   = 350 )

               Price Volume     
               ( 10    100               
   100+50+80 < ( 10    50                
               ( 10    80
           Above volume to H2
                (9     100               
     100+50   < (9     50
           Above volume to H4 ( because 10>9)
                (8     100
      100+100 < (8     100
            Above volume to H4 ( because 9>8)    
                (10    50
       50+250 < (10    250              
             Above volume to H2 ( because 8<10)

任何建议

  1. 如何使用条件使其循环?

  2. 如何编写考虑到最后价格的代码?

【问题讨论】:

  • 按照你描述的方式,在 H4 中它只是Summed。还是我错过了什么。您对预期结果的说明也很模糊。请详细说明。
  • 是的,价格下跌的总和在H4,价格上涨的总和在H2。我将编辑预期结果以尝试使其更清晰
  • 啊所以一定是H4: 100+50+80, 100+50, 100+100然后H2: 50+250对吧?
  • 好的,我明白了。现在正在处理您可能的代码... :)
  • 将卷视为块。前 3 个区块进入 H2。然后价格变为 9。9 小于 10,因此 9 的块进入 H4。 8 比 9 小,因此 8 的块进入 H4。 10 比 8 大,因此 10 的块进入 H2。我知道我需要一些 for 循环和 if 语句

标签: loops excel if-statement vba


【解决方案1】:

这是获得您想要的东西的方法。
要做到这一点,要创建 loopNested If's 非常困难。
我让Excel 完成这项工作,并改用Formula

假设您的数据位于A1:B10

E2 的公式栏中输入此内容。

=IF(A2=A3,IF(ISNUMBER(A1),IF(A1<A2,1,IF(A1=A2,E1,0)),1),IF(ISNUMBER(A1),IF(A1<A2,1,IF(A1=A2,E1,0)),1))

将公式一直复制到E10 或直到您有数据的位置。

H2 中,在公式栏中输入:

=SUMIF(E:E,1,B:B)

类似H4,在编辑栏中输入:

=SUMIF(E:E,0,B:B)

但是,您希望下面的 VBA 代码也使用上述公式:

Dim ws as Worksheet, lrow as long

Set ws = Thisworkbook.Sheets("Sheet1")'assuming your data is in Sheet1

With ws
    lrow = .Range("A" & .Rows.Count).End(xlUp).Row
    .Range("E2:E" & lrow).Formula = "=IF(A2=A3,IF(ISNUMBER(A1),IF(A1<A2,1,IF(A1=A2,E1,0)),1),IF(ISNUMBER(A1),IF(A1<A2,1,IF(A1=A2,E1,0)),1))"
    .Range("E2:E" & lrow).Value = .Range("E2:E" & lrow).Value
    .Range("H2").Formula = "=SUMIF(E:E,1,B:B)"
    .Range("H2").Value = .Range("H2").Value
    .Range("H4").Formula = "=SUMIF(E:E,0,B:B)"
    .Range("H4").Value = .Range("H4").Value
End With

End Sub

有点晚了,但我希望这是你想要的。

【讨论】:

  • 我知道要弄清楚这段代码有多难,尤其是我的“要求”不清楚且难以定义。但你做到了,它正在做我该做的事情。几个星期以来,我一直在为此苦苦挣扎,试图找出不同的解决方案,让它变得更简单,这样即使我在 VBA 方面不太擅长,我仍然可以编写它。但到目前为止没有任何效果。我很沮丧,我不能感谢你! “L42”感谢您付出时间和精力来帮助我!感谢 stackoverflow 成为一个了不起的网站。
  • 不客气。我还从这里的 VBA 大师那里学到了很多东西,他们非常慷慨地投入了时间。我只是以他们的榜样生活,以尽我所能帮助他人。很高兴它帮助了你。
  • 顺便说一句,您可以将上面的公式进一步简化为这个公式=IF(ISNUMBER(A1),IF(A1&lt;A2,1,IF(A1=A2,E1,0)),1)。我现在在审查它时才想到。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2019-11-13
相关资源
最近更新 更多