Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA中的循环和索引_Vba_Excel - Fatal编程技术网

VBA中的循环和索引

VBA中的循环和索引,vba,excel,Vba,Excel,我有使用C/C++的经验,但我不熟悉VBA和Excel 我得到的是: 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

我有使用C/C++的经验,但我不熟悉
VBA
Excel

我得到的是:

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

我试着寻找循环,但我不清楚在选择范围时索引是如何工作的。以下是我到目前为止所写的内容:

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的索引是如何工作的吗?我做错了什么

Range("A" & i:"L" & i).Select
应该是

Range("A" & i & ":L" & i).Select
海因茨有答案

您也可以稍微整理一下代码。无需提及默认参数。另外,将
一起使用可能会增加一些可读性。我喜欢将大多数对象限定为类
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

要使代码正常工作,只需按照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

虽然此示例仅设置为复制单元格值,但可以很容易地包括该范围的其他属性(即格式设置等).

在范围上使用VBA时,应避免使用
选择
参见一些示例+1使用此方法肯定更可靠,我认为这意味着剪贴板不会进入其中,因此简化了背景中的事情。我在使用
.Copy
之前遇到过问题。我想知道这是否真的更快——我会尝试设置一个小测试,看看它们在我的电脑上有多相似。