【问题标题】:MS Excel VBA - Loop Through Rows and Columns (Skip if Null)MS Excel VBA - 循环遍历行和列(如果为空则跳过)
【发布时间】:2016-10-06 15:46:36
【问题描述】:

你好 stackoverflow 社区,

我必须承认我主要在 MS Access 中编写代码,并且对 MS Excel VBA 的经验非常有限。

我目前的目标是,我收到了一份费用报告,其中扣除了其他国家/地区的货币,该报告有许多具有不同帐户名称的列,这些列可能已填充或可能为空。

我目前有一个宏,它将打开一个输入框并询问 HostCurrency/USD 汇率,我的下一步将从第一条记录开始(第 14 行;A-K 列包含有关扣除的个人信息)然后跳到第一个扣除账户(扣除账户从 L 列开始并跨越到 DG 列)检查每个单元格是否为空,如果它继续向右移动,如果它包含一个值,那么我想将该值乘以我的外汇汇率在输入框中输入的变量,并使用转换更新单元格。执行完最后一列(DG)后,我想移至下一行(第 15 行)并再次开始该过程,直到“已使用范围”中的“LastRow”。

我非常感谢任何可能指向我的目标的反馈、解释或链接。提前感谢您抽出宝贵时间阅读本文!

【问题讨论】:

    标签: vba excel loops range


    【解决方案1】:

    首先,您确实应该尝试自己编写代码并发布您拥有的内容,以便有人可以尝试为您指明正确的方向。如果你的范围是静态的,这是一个非常简单的问题。您可以尝试以下方式:

    Sub calcRate(rate As Double, lastrow As Integer)
        Dim rng As Range
        Set rng = Range("L14" & ":DG" & lastrow)
    
        Dim c As Variant
        For Each c In rng
            If c.Value <> "" Then
                c.Value = c.Value * rate
            End If
        Next
    
     End Sub
    

    此代码将逐步遍历给定范围内的每个单元格并应用代码,而无需多次循环。现在您可以从输入 ratelastrow 的表单中调用 calcRate 子。

    【讨论】:

    • 我会让 lastrow 很长,但我怀疑 OP 会有超过 32000 行。
    【解决方案2】:

    这将在不循环的情况下完成。

    Sub fooooo()
    Dim rng As Range
    Dim mlt As Double
    Dim lstRow As Long
    mlt = InputBox("Rate")
    
    With ActiveSheet
        lstRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set rng = .Range(.Cells(14, 12), Cells(lstRow, 111))
        rng.Value = .Evaluate("IF(" & rng.Address & " <>""""," & rng.Address & "*" & mlt & ","""")")
    End With
    End Sub
    

    如果您的工作表是静态的,您可以将 ActiveSheet 替换为 WorkSheets("YourSheetName")。将"YourSheetName" 更改为工作表的名称。

    【讨论】:

    • @scott16150s 如果您有大量行,您会发现这一行比遍历每个单元格要快。
    • @scott16150s 我注意到您试图将两者都标记为正确。将您最终使用的那个标记为正确的。我赞成另一个,因为这是一个很好的答案。您需要决定哪种方式最适合您的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    相关资源
    最近更新 更多