循环

时间:2018-02-06 20:20:33

标签: excel vba excel-vba

我需要从工作表中提取一系列数据,其中前16行始终相同,但下面的数据会有所不同。我可以用这个

找到起始单元格
Sheets("AA").Next.Select
Range("A17").Select
Selection.End(xlDown).Offset(2, 2).Select

然后我想使用(上面选择的起始单元格)计数单元格到包含数据的单元格的末尾。我试过这个

Range(Selection, Range(Selection.End(xlDown)).Rows.Count

及其上的各种变化但似乎无法使其发挥作用。我需要能够回顾起始单元格和行数,以便使用循环将数据从该单元格下拉到最后一个单元格(另一个主题我可能会在我到达目的地时提出问题)

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您对为什么尝试执行此操作的解释会让您觉得自己的工作量超出了自己的需要。

让我们创建几个函数。

我们将调用nextBlankCell的第一个函数,它将自动获取空范围之前的最后一个单元格。在您的情况下,我们甚至可以使用您的选择来确定这一点 - 我们将在下一个函数中执行此操作。

nextBlankCell函数

Function nextBlankCell(ByVal startRng As Range) As Range
    Set nextBlankCell = startRng.End(xlDown)
End Function

接下来,让我们创建一个功能,自动为您设置整个范围。在这种情况下,它将是从您当前选择到包含使用上述函数获得的数据的最后一行的范围。

getRngDownwards函数

Function getRngDownwards() As Range

    Dim celStart As Range, celEnd As Range, ws As Worksheet
    Set celStart = Selection
    Set ws = celStart.Parent
    Set celEnd = nextBlankCell(celStart)
    Set getRngDownwards = ws.Range(celStart, celEnd)

End Function

在上面的函数中,我们有两个范围celStartcelEndcelStart只是您当前的选择。如果您必须使用Selection (大多数情况下必要),我总是希望立即您的选择设置为静态范围。

celEnd是包含列中最后一个使用过的单元格的范围。

我们还通过使用选择的父对象来确定工作表ws Protip:我们避免了ActiveSheet

现在你可以进行测试了:

Sub test()

    ' This test shows you the address of the range
    MsgBox getRngDownwards.Address

    ' This test visually shows you the range
    getRngDownwards.Select

End Sub