我在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的最佳实践。 有人有建议吗?
答案 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时执行粘贴。