Excel DO而不是范围

时间:2013-08-16 16:47:11

标签: excel vba

我在excel中写一个宏。我有这样的代码,只需从电子表格中获取一块数据:

Range("E1:O25").Select
Selection.Copy

我可以这样做,因为我知道在这个特定的电子表格中我想要的值被分类到前25行。对于未来的电子表格,我不会知道。

Range("O1").Select
Do Until Selection.Value <> 0
    'get last cell that has a 0 value
     Selection....
Loop
Range("O1: SELECTIONFROMLOOP").Select
Selection.Copy

但我不确定我应该在选择中做什么......&#39; 我想也许有一个增量变量,但我真的不知道VBA的最佳实践。 有人有建议吗?

2 个答案:

答案 0 :(得分:1)

我真的不喜欢选择范围。大部分时间都没有必要。 我宁愿也不要乱用剪贴板,因为它是“全局”变量的一大块。

如果您只需要将数据从“E1:EX”移动到“O1:OX”,我会执行以下操作。

i = startRow
do while ThisWorksheet.Cells(i,col1).Text <> ""
    thisWorksheet.Cells(i, targetCol).Value = ThisWorksheet.Cells(i,col1).Text
    i = i + 1
loop

答案 1 :(得分:0)

我会这样做:

Sub duh()
    Dim start As Range: Set start = Range("o1")
    Dim r As Range
    Dim doCopy As Boolean: doCopy = False

    For Each r In Range(start, start.End(xlDown))
        If r.Value <> 0 Then
            If r.Row <> start.Row Then
                Range(start, r.Offset(-1)).Copy
                doCopy = True
            End If
            Exit For
        End If
    Next

    If doCopy Then ActiveSheet.Paste Range("a1")
End Sub

首先,我们将start定义为要开始的单元格。 r将代表我们正在评估的单元格。如果粘贴完成,doCopy将设置为true(如果我们没有要复制的内容,则为false)。

For Each r...循环将遍历从start到列底部的每个单元格(这可能不是您想要的......)

当我们找到非零值时,首先检查我们是否还在第一行。如果我们是,那么我们将退出循环。如果我们不在第一行,则Range(start, r.Offset(-1)).Copy会将从start开始并在r以上的单元格结束的范围复制到剪贴板;将doCopy设置为True并退出循环。最后,仅在doCopy为True时执行粘贴。