2013-10-05 41 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