【问题标题】:Why does "Range(...).End(xlDown).Row" return 1048576?为什么“Range(...).End(xlDown).Row”返回 1048576?
【发布时间】:2015-08-25 16:29:03
【问题描述】:

我想在 VBA 的 for 循环中复制一些值。因此,我通过以下方式计算限制:

For iCounter = 1 To (Range(...).End(xlDown).Row - Range(...).Row  + 1)

遗憾的是 Range(...).End(xlDown).Row 返回 1048576。当我调试时,突然值变为正确的值。相同的代码在 VBA 代码的其他一些位置也能正常工作。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    要记住的主要事情是End 方法在 VBA 中重现了使用 Ctrl+箭头键的功能。这些用于在值块之间导航。

    从 A1 开始:

    点击Ctrl+Down

    这说明了当您在由多个单元格组成的块的开头或结尾处使用Ctrl+Down 时会发生什么——您转到该块的末尾。当您说有时代码运行良好时,您隐含地指的是这种情况。

    现在 -- 再次点击Ctrl+Down

    你跳到了下一个街区。现在,再做一次:

    那个方块的底部。最后,再次:

    嗯——没有下一个区块可以去——所以它一直向下。这对应于让您感到奇怪的情况。它会把你带到这里:

    但是——现在发生了一件很酷的事情:按Ctrl + Up——Excel 会向上搜索下一个块:

    this是A列中最后一个有数据的单元格。

    因此——您在 Excel VBA 中经常看到以下代码:

    Cells(Rows.Count,1).End(xlUp)
    

    获取列中最后使用的单元格(在本例中为 1)或列中的第一个单元格(如果整个列为空白)。

    【讨论】:

    • 说得好! OP,注意这也是 .End(xlDown),.End(xlToRight).End(xlToLeft) 的工作方式。
    【解决方案2】:

    很好奇你在说调试时获得正确的值。这让我觉得你可能需要展示更多的代码。不管怎样,没关系,我只是决定玩得开心。这里有多个示例代码 sn-ps 可以满足您的要求。希望它能给你或任何其他感兴趣的人一些关于如何解决这个问题的想法,因为它很常见。

    我绝对会避免单独使用 End(xlwhatever)。它使代码变得不健壮,因为值很容易被打乱。花时间创建一个更优雅的解决方案并不难。通过针对您的特定用途定制和组合以下方法,您应该能够提出一些非常强大的方法。

    Sub CellLoop1()
        'Colors cells from row i to last value in column
        For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
            Cells(i, 1).Interior.Color = RGB(0, 200, 0)
        Next
    End Sub
    Sub CellLoop2()
        'Colors cells from row i to end of continuous values or until row 100
        Dim i As Integer
        i = 1
        Dim r As Range
        Set r = Cells(i, 1)
            Do Until r.Value2 = "" Or i > 100
                r.Interior.Color = 123
                i = i + 1
                Set r = Cells(i, 1)
            Loop
    End Sub
    Sub CellLoop3()
        'Colors cells from row i until occurance of 5 continuous blanks
        Dim i As Integer
        i = 1
        Dim r As Range
        Set r = Cells(i, 1)
        Dim BlankChain As Integer
        Do Until BlankChain >= 5
            r.Interior.Color = 123
            If r.Value = Empty Then
                BlankChain = BlankChain + 1
            Else
                BlankChain = 0
            End If
            i = i + 1
            Set r = Cells(i, 1)
        Loop
    End Sub
    Sub CellLoop4()
        'Colors cells from row i until no value in sight (in next k number of rows)
        Dim i, k, BlankCount As Integer
        i = 1
        k = 10
        Dim r, SightRange As Range
        Set r = Cells(i, 1)
        Dim NoValueInSight As Boolean: NoValueInSight = False
        Do Until NoValueInSight
            Set SightRange = Range(r, r.Offset(k - 1, 0))
            BlankCount = Application.WorksheetFunction.CountBlank(SightRange)
            If BlankCount = SightRange.Rows.Count Then
                NoValueInSight = True
            Else
                r.Interior.Color = RGB(255, 50, 255)
            End If
            i = i + 1
            Set r = Cells(i, 1)
        Loop
    End Sub
    Sub CellLoop5()
        'Colors all values under range r (set as "A1")
        Dim r, UnderRange As Range
        Set r = Range("A3")
        Set UnderRange = Range(r, Cells(Rows.Count, 1))
        Dim i, n, BlankCount As Double: i = r.Row: n = 0
        BlankCount = Application.WorksheetFunction.CountBlank(UnderRange)
        Do Until n = (UnderRange.Rows.Count - BlankCount)
            If Cells(i, 1) <> "" Then
                n = n + 1
                Cells(i, 1).Interior.Color = RGB(200, 200, 200)
            End If
            i = i + 1
        Loop
    End Sub
    Sub CellLoop6()
        'Colors all values under range r (set as "A1")
        Dim r As Range
        Set r = Range("A1")
        If r.Value = "" Then Set r = r.End(xlDown)
        Do Until r.Value = ""
            r.Interior.Color = RGB(255, 100, 100)
            If r.Offset(1, 0).Value <> "" Then
                For i = r.Row To r.End(xlDown).Row
                    Cells(i, 1).Interior.Color = RGB(255, 100, 100)
                Next
            End If
            Set r = r.End(xlDown)
        Loop
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2012-12-12
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 2016-04-21
      • 2018-09-26
      相关资源
      最近更新 更多