VBA中的循环和索引
我有使用C/C++的经验,但我不熟悉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
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
之前遇到过问题。我想知道这是否真的更快——我会尝试设置一个小测试,看看它们在我的电脑上有多相似。