【问题标题】:Iterating through populated rows遍历填充的行
【发布时间】:2014-08-14 03:48:33
【问题描述】:

所以我正在尝试使用 VBA 遍历 Excel 电子表格中的工作表。我想遍历每一行,然后遍历每一列,尽管谷歌搜索,我实际上找不到一种直观的方法来做到这一点。

我假设必须填充一行的第一个单元格,如果不是,那么它必须是结束。我可以强制执行这个

我目前的方法是遍历行,然后尝试获取第一个单元格的值,但我无法弄清楚。我在这里和其他地方遇到了一些使用范围等的问题,但没有什么可以帮助我编写代码。

目前的做法是:

Set sh = ActiveSheet
RowCount = 0
For Each rw In sh.Rows
    'If Row.Cells(1, 1).Value = "" Then Exit For
    RowCount = RowCount + 1
Next rw
MsgBox (RowCount)

现在,当我运行它时,我得到了一些巨大的数字,这是错误的,因为该表只有大约 25 行。我注释掉了第一行,因为它不起作用。

当发现第一个单元格为空的行时,我可以在 For 循环的第一行中更改什么以正确中断?

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    看起来您只是对行和列进行了硬编码;否则,进行一些小的调整,我想你就在那里:

    Dim sh As Worksheet
    Dim rw As Range
    Dim RowCount As Integer
    
    RowCount = 0
    
    Set sh = ActiveSheet
    For Each rw In sh.Rows
    
      If sh.Cells(rw.Row, 1).Value = "" Then
        Exit For
      End If
    
      RowCount = RowCount + 1
    
    Next rw
    
    MsgBox (RowCount)
    

    【讨论】:

    • 我建议使用Exit For 而不是GoTo BREAK 提前退出循环。
    • 我认为这不是最好的方法......空行或带有空单元格的行呢?我认为使用 ActiveSheet.UsedRange.Rows 更清洁(见第二个答案)
    • 如何从特定行开始执行此操作?
    • @NikoTumi - 您将切换到 while 循环 - 将 rw 作为整数而不是 Range 数据类型,并在每次循环后递增(行 = 行 + 1)。其他一切都应该一样。
    【解决方案2】:

    我将在我的回答中做出几个假设。我假设您的数据从 A1 开始,并且每行的第一列中没有空单元格有数据。

    此代码将:

    1. 查找 A 列中包含数据的最后一行
    2. 遍历每一行
    3. 在当前行中查找包含数据的最后一列
    4. 循环遍历当前行中的每个单元格,直到找到的最后一列。

    这不是一种快速的方法,但会按照您的建议逐个迭代。


    Sub iterateThroughAll()
        ScreenUpdating = False
        Dim wks As Worksheet
        Set wks = ActiveSheet
    
        Dim rowRange As Range
        Dim colRange As Range
    
        Dim LastCol As Long
        Dim LastRow As Long
        LastRow = wks.Cells(wks.Rows.Count, "A").End(xlUp).Row
    
        Set rowRange = wks.Range("A1:A" & LastRow)
    
        'Loop through each row
        For Each rrow In rowRange
            'Find Last column in current row
            LastCol = wks.Cells(rrow, wks.Columns.Count).End(xlToLeft).Column
            Set colRange = wks.Range(wks.Cells(rrow, 1), wks.Cells(rrow, LastCol))
    
            'Loop through all cells in row up to last col
            For Each cell In colRange
                'Do something to each cell
                Debug.Print (cell.Value)
            Next cell
        Next rrow
        ScreenUpdating = True
    End Sub
    

    【讨论】:

    • +1 如何找到最后一行的好技巧……这对我来说是另一个问题。 VBA 绝对不是我的强项。
    • 不错的解决方案,但必须使用 rrow.Row 才能使其工作。
    【解决方案3】:

    为了任何搜索类似内容的人的利益,请参阅工作表.UsedRange
    例如? ActiveSheet.UsedRange.Rows.Count
    和循环如
    For Each loopRow in Sheets(1).UsedRange.Rows: Print loopRow.Row: Next

    【讨论】:

    • 不知道为什么这没有得到更多的投票。 “UsedRange”似乎是你所需要的
    • 这以最简单的方式解决了我的问题,所以+1!
    • 这种方式在包含未使用列的行的大型电子表格上应该更快。如果没有使用,为什么要遍历一行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多