【发布时间】: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 代码的其他一些位置也能正常工作。
【问题讨论】:
我想在 VBA 的 for 循环中复制一些值。因此,我通过以下方式计算限制:
For iCounter = 1 To (Range(...).End(xlDown).Row - Range(...).Row + 1)
遗憾的是 Range(...).End(xlDown).Row 返回 1048576。当我调试时,突然值变为正确的值。相同的代码在 VBA 代码的其他一些位置也能正常工作。
【问题讨论】:
要记住的主要事情是End 方法在 VBA 中重现了使用 Ctrl+箭头键的功能。这些用于在值块之间导航。
从 A1 开始:
点击Ctrl+Down:
这说明了当您在由多个单元格组成的块的开头或结尾处使用Ctrl+Down 时会发生什么——您转到该块的末尾。当您说有时代码运行良好时,您隐含地指的是这种情况。
现在 -- 再次点击Ctrl+Down:
你跳到了下一个街区。现在,再做一次:
那个方块的底部。最后,再次:
嗯——没有下一个区块可以去——所以它一直向下。这对应于让您感到奇怪的情况。它会把你带到这里:
但是——现在发生了一件很酷的事情:按Ctrl + Up——Excel 会向上搜索下一个块:
而this是A列中最后一个有数据的单元格。
因此——您在 Excel VBA 中经常看到以下代码:
Cells(Rows.Count,1).End(xlUp)
获取列中最后使用的单元格(在本例中为 1)或列中的第一个单元格(如果整个列为空白)。
【讨论】:
.End(xlDown)、,.End(xlToRight) 和 .End(xlToLeft) 的工作方式。
很好奇你在说调试时获得正确的值。这让我觉得你可能需要展示更多的代码。不管怎样,没关系,我只是决定玩得开心。这里有多个示例代码 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
【讨论】: