在VBA中循环和索引

时间:2013-10-05 17:42:46

标签: excel vba excel-vba

我有使用C / C ++的经验,但我是VBAExcel的新手 我所拥有的是:

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进行索引以及我做错了什么?

3 个答案:

答案 0 :(得分:3)

你有一个错字:

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

应该是

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

答案 1 :(得分:1)

海因兹有答案。

你可以稍微整理一下代码。无需提及默认参数。也许使用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

答案 2 :(得分: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

虽然此示例仅设置为复制单元格值,但可以轻松包含该范围的其他属性(即格式化等)。