2013-08-16 69 views
0

我正在用excel写一个宏。我的代码只是这样做以数据块从电子表格:Excel DO而不是范围

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 

但我不知道它是什么,我应该做的“选择......” 我想也许有计数的增量变动,但我真的不知道VBA的最佳实践。 有没有人有任何建议?

回答

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为真时才进行粘贴。

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