2014-03-26 22 views
0

我是VBA的真正新手,我試圖創建一個複製/粘貼循環來自動執行任務。我已經試了幾天,到目前爲止還沒有成功,所以需要一點幫助!如何在Excel VBA中執行循環拷貝?

所以基本面如下。我有兩個靜態列表,一個包含6個字符串(static1),另一個包含37個字符串(static2)。我需要以特定格式顯示這些文件以允許導入帶有固定導入規格的另一個程序。我需要static1重演中,我做了下面的代碼的6塊:

Sheet3.Range("I1:I6").Copy 
    For i = 0 To totalChannels 
    Cells(1 + 6 * i, 2).Select 
ActiveSheet.Paste 

我完全理解這是如何工作的,static1在細胞I1舉行:I6,它的簡單複製,再而粘貼直至達到totalChannels指定的最大金額。

static2稍微複雜一點。 static2包含在單元格G1:G37中我需要在循環中創建一個循環來複制單元格G1並將其粘貼到312個連續行中,然後複製單元格G2並將其粘貼到312個連續行中,依此類推,直至到達G37。

我一直在逐漸接受vba的教育,但是這個領先於我目前所在的位置,我無法在網上找到一個資源以簡單的方式向我解釋這個問題 - 希望這裏有人能幫助! !

我希望我已經解釋了一切不夠徹底,

感謝。

+1

你應該看看這篇文章** [如何避免使用.select](http://stackoverflow.com/questions/10714251/excel-macro-avoiding-using-select)** –

+0

謝謝 - 有趣的文章。 – roastbeeef

回答

4

連續動作更多的是想象力的鍛鍊一個其他的東西。有很多方法可以做你想做的事。

例如,如果要按順序複製A1:A5B1:B25,以下工作原理足夠簡單,而無需使用for-loop。

Sub RapidFireOne() 

    Dim SrcRng As Range 
    Set SrcRng = Sheet1.Range("A1:A5") 

    'Copy in one go to Column B. 
    SrcRng.Copy Sheet1.Range("B1:B25") 

End Sub 

結果:

enter image description here


如果你真的想通過循環來做到這一點,你想跨越範圍序列做到這一點,使用Step屬性,就像這樣:

Sub RapidFireTwo() 

    Dim SrcRng As Range 
    Set SrcRng = Sheet1.Range("A1:A5") 

    'Copy repeatedly to Column B with one space between. 
    For Iter = 1 To 25 Step 5 
     SrcRng.Copy Sheet1.Range("B" & Iter) 
    Next 

End Sub 

結果與第一個相同。


如果要複製每個細胞批次範圍就像你與static2做什麼,下面的方法會奏效,那麼修改(基本上改變5317或諸如此類):

Sub RapidFireThree() 

    'This one copies each cell sequentially. 
    Dim SrcRng As Range 
    Set SrcRng = Sheet1.Range("A1:A5") 

    'Copy each cell in order to Column B. 
    Set TargetRng = Sheet1.Range("B1:B5") 
    For Each Cell In SrcRng 
     Cell.Copy TargetRng 
     Set TargetRng = TargetRng.Offset(5, 0).Resize(5, 1) 
    Next 

End Sub 

結果:

enter image description here


讓我們知道這是否有幫助。

+0

要增加更多靈活性,在第二個示例中,可以通過'For Iter = 1 To 25 Step SrcRng.Rows.Count'來更改'For Iter = 1 To 25 Step 5'。順便說一句,很好的答案(+1)。 –

+0

,看起來絕對完美 - 謝謝。我現在還沒有機會將其實施到我的代碼中,因爲我剛剛走出門,但早晨我會給它一個bash - 謝謝! – roastbeeef

+0

步驟命令+1 - 我對那個不熟悉 - 太棒了! – DanK

1

此代碼應該可以幫助您完成此任務。在另一個循環內做一個循環非常簡單,但你應該儘量避免它在可能的地方。例如,該代碼需要O(n^2)計時(http://en.wikipedia.org/wiki/Big_O_notation),這意味着如果靜態1或靜態2的大小增長,那麼性能會降低兩倍。在編程中,您總是希望拍攝O(1)或靜態時間(這意味着無論您通過它輸入的數據量如何,處理過程都將保持不變。 VBA是一種腳本語言,可以讓你在語法上作弊很多,但是開發良好的編碼習慣會爲你節省大量的痛苦。偉大的語言開始學習編程!

Sub Test() 
'Always explicitly define your variables 
Dim oStatic2 As Range 
Dim oWksht As Excel.Worksheet 
Dim srow As Integer 
Dim ct As Integer 
Dim pstrow As Integer 
Dim column As String 

'Use 'SET' when setting object instances; primitive variables don't require it 
Set oWksht = ThisWorkbook.Sheets("Sheet1") 
Set static2 = oWksht.Range("G1:G37") 

'set placemark 
pstrow = 1 

'set column to paste into 
column = "A" 

'Loop through each cell in static2 
For srow = 1 To 37 
    'Set individual cell to be copied 
    Set static2 = oWksht.Range("G" & srow) 
    static2.Copy 
    'Loop through 312 sequential rows for each single row in the outer loop 
    For ct = pstrow To (pstrow + 312) 
     oWksht.Range(column & ct).PasteSpecial 
     pstrow = pstrow + 1 
    Next 
Next 

'Always release memory for objects after finished using 
Set oWksht = Nothing 
Set static2 = Nothing 

End Sub