2013-08-16 102 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