【问题标题】:MsgBox loop for each row using Excel Visual Basic使用 Excel Visual Basic 对每一行进行 MsgBox 循环
【发布时间】:2015-07-10 13:25:46
【问题描述】:

这是第一次在 Excel 中使用 VBA。我正在练习使用公式并使用 Excel 单元格和 MsgBoxes 显示值。

我当前的问题很可能是一个简单的解决方案,但尚未解决。

我想让我的 MsgBox 在填充每一行后显示以下内容:

味精弹出

Socks Gross Sale is 56.37

味精弹出

Lotion Gross Sale is 59.12
..etc

但是,当我第一次尝试运行注释掉的代码行 MsgBox Range("A14:A21").Value & " Gross Sale is " & Range("F14:F21").Value 时,它会给出错误 Run-time error '13': Type mismatch,所以它不起作用。

因此,到目前为止,我正在使用我的代码行 MsgBox Range("A14:A21").Value & " Gross Sale is " & Range("F14:F21").Value ,它只通过循环连续填充 Sock 行。有什么建议吗?

For Each Cell In Worksheets("Sheet1").Range("B14:E21").Cells

   Range("F14:F21").Formula = "=SUM((B14*D14)-((B14*D14)*E14))"
  'MsgBox Range("A14:A21").Value & " Gross Sale is " & Range("F14:F21").Value

  'Gives me first line only and makes pop up show twice as many times as (all)total rows
  MsgBox Range("A14").Value & " Gross Sale is " & Range("F14").Value

Next

【问题讨论】:

    标签: vba excel foreach msgbox


    【解决方案1】:

    您不能向 Msgbox 发送范围 .. 它正在寻找一个字符串 .. 您每次都需要构建字符串 ... 我推荐这样的东西:

    For i = 14 To 21
    
        MsgBox Range("a" & i).Value & " Gross Sale is " & Range("F" & i).Value
    
    Next i
    

    这将遍历您想要的 ROWS(又名 Lines)...并将您想要从中提取值的单元格拼接在一起...

    For Each Cell
    

    循环遍历每个单元...而不是行..

    【讨论】:

    • 这真的很接近我希望的方式(简短而简单)这很顺利!对此,我真的非常感激。我想一个单独的循环是最好的方法。
    • 是的,这就是基础,如果你想要/需要更多的动态范围,显然是硬编码的“14”和“21”;)
    • 没错。我希望慢慢地但肯定地让这种新的编码语言下降。昨天刚得知 Excel 使用 VBA O.o 。再次感谢!我要继续练习
    • 另一种偷偷摸摸的做事方式,就像 Iturner 在他的解决方案中暗示的那样:如果你命名一个范围,比如 Cells A14:A21(注意,只有 1 列),那么你可以使用 For each Cell并使用该命名范围。通过这种方式,您可以获得适当的迭代次数......并且您可以使用单元格 A14:A21 作为您的基础(提示:想想OFFSET 函数等;))祝你好运!
    • 我一定会检查更多版本:)
    【解决方案2】:

    您可以使用数组来保存工作表中的值,然后循环遍历两个数组的每个元素,在每次迭代中使用它们的索引来生成您想要的消息。

    Sub produceMsg()
        Dim i As Byte
        Dim arrProductName As Variant
        Dim arrGrossSale As Variant
        arrGrossSale = Range("F2:F9").Value
        arrProductName = Range("A2:A9").Value
    
        For i = 1 To UBound(arrGrossSale, 1)
            MsgBox (arrProductName(i, 1) & " Gross sale is " & arrGrossSale(i, 1))
        Next i
    End Sub
    

    从工作表中填充数组时,您始终会生成一个二维数组,无论您是否只为数组提供一维数组。这就是为什么我们必须在遍历数组时将第二维指定为“1”。希望这会有所帮助。

    【讨论】:

    • 这也很好用。我只选择了@Ditto,因为他更简单,但我确实喜欢为每个范围声明的名称。我没有这样想,所以我很高兴你给我看这个!要是我能“勾选”2 个答案就好了
    【解决方案3】:

    在旁注中,我进行了以下更新以在 MsgBox 上显示两位小数:

    MsgBox Range("a" & i).Value & " Gross Sale is $" & FormatNumber(Round(Range("F" & i).Value, 2), 2)
    

    我添加了FormatNumber,因为当我使用Round 时,它会删除任何第二个小数位为0 的数字。使用FormatNumber,它会保留0

    添加到@Ditto

    【讨论】:

      猜你喜欢
      • 2021-05-31
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多