2013-10-05 64 views
3

我有C/C++經驗,但我是VBAExcel的新手。
我所擁有的是:在VBA中循環和索引

Range("A7:L7").Select 
Selection.Copy 
Range("R18").Select 
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ 
    False, Transpose:=True 
    'One column copied 

的問題是,我想通過細胞的整個範圍(一切從A6:L6一路攀升至A41:41)。

我試圖尋找For循環,但我不明白在選擇範圍時索引是如何工作的。這是我到目前爲止寫:

pasteLocation = 6 
For i = 6 To 41 
    Range("A" & i:"L" & i).Select 

    Selection.Copy 
    Range("R" & pasteLocation).Select '+12 every time to this counter 

    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ 
     False, Transpose:=True 

    pasteLocation = pasteLocation + 12 'want to move down by 12 every time 

Next i 

顯然,我做錯了什麼,因爲我得到「編譯錯誤:預期:列表分隔符或)」

任何人都可以解釋如何索引與VBA作品和什麼我做錯了?

+0

[看到這個](http://stackoverflow.com/questions/5035399/iterating-100-cells-takes-too-long/5035528#5035528) – ARich

+0

當在範圍上使用VBA時,你應該避免使用'select'參見[這](http://stackoverflow.com/a/10717999/445425)一些例子 –

回答

3

你有一個錯字:

Range("A" & i:"L" & i).Select 

應該

Range("A" & i & ":L" & i).Select 
1

Heinzi有答案。

你可以整理一下代碼。不需要提及默認參數。也可能使用With增加一些可讀性。我喜歡將大多數物體限定在Excel級別;可能有點過分但肯定不會造成任何傷害。

Option Explicit 

Sub slightlyTidier() 

Dim pasteLocation As Integer 
pasteLocation = 6 

Dim i As Integer 
For i = 6 To 41 

    With Excel.ActiveSheet 
     .Range("A" & i & ":L" & i).Copy 

     '+12 every time to this counter 
     .Range("R" & pasteLocation).PasteSpecial Paste:=xlPasteAll, Transpose:=True 
    End With 

     'want to move down by 12 every time 
    pasteLocation = pasteLocation + 12 
Next i 

End Sub 
1

爲了使代碼正常工作,您只需按照Heinzi的建議將冒號移動到雙引號內。既然你是VBA的新手,我認爲最好給你一個完整的解決方案。我刪除了.Select .Copy和.PastSpecial方法,因爲它們不是必需的,可以大大減慢代碼的執行速度。

這是我認爲是優化的解決方案:

Sub Solution() 

    Dim pasteLocation As Integer 
    pasteLocation = 6 

    Dim rngFrom As Range 
    Dim rngTo As Range 

    For i = 6 To 41 
     With Excel.ActiveSheet 
      Set rngFrom = .Range("A" & i & ":L" & i) 
      Set rngTo = .Range("R" & pasteLocation & ":R" & (pasteLocation + 12)) 
      rngTo.Value = rngFrom.Value 
     End With 
     pasteLocation = pasteLocation + 12 
    Next i 

End Sub 

雖然這個例子只設置複製單元格的值,該範圍的其他屬性可以很容易地被包括(即格式等)。

+0

+1肯定更可靠的使用這種方法,我認爲這意味着剪貼板沒有進入它,所以簡化了背景。在使用'.Copy'之前我遇到了問題。我想知道,如果它肯定更快 - 我會嘗試設置一個小測試來發現它們與我的電腦有多相似。 – whytheq