[英]VBA for-loop with three variables
我对VBA还是很陌生,但是我正在学习。 我有一个工作表“模型”,其中有18个表。 我用“开始”和“结束”定义了它们的范围。 因此,您可以在下面的VBA中看到,第一个表位于C3:E13中,最后一个表位于C224:E234中。 我想复制这些并将它们一张一张地粘贴在Sheet1中。
在那里必须将它们粘贴到单元格B5,B21,B38,...,B166中。 因此,第一个表应粘贴在B5中,第二个表应粘贴在B21中,依此类推。
所以我的问题是,如何在我的for循环中创建此变量“输出”(定义输出行号)?
Dim start As Long
Dim eind As Long
Dim output As Long
For start = 3 To 224 Step 13
end = start + 10
'output = --->>> this should be 5, 21, 38, ..., 166.
'So something like output = 5 To 166 Step 16
Sheets("Model").Select
Range("C" & start & ":E" & end).Select
Selection.Copy
Sheets("Sheet1").Select
Range("B" & output).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Next start
提前谢谢了!
请注意, 21 + 16
是37
,而不是您的注释中的38
。 不知道那是错字。 进行了修订,以避免Select
不必要的99%的Select
,并避免使用相对昂贵的Copy
,而建议将值从一个范围直接转移到另一个范围。
Dim start As Long
Dim end As Long
Dim output As Long
Dim tbl as Range
Dim dest as Range
output = 5
For start = 3 To 224 Step 13
end = start + 10
Set tbl = Sheets("Model").Range("C" & start & ":E" & end)
Set dest = Sheets("Sheet1").Range("B" & output).Resize(tbl.Rows.Count, tbl.Columns.Count)
dest.Value = tbl.Value
output = output + 16
Next
如果您的表是通过“插入”>“表”创建的正确表,则可以执行以下操作:
Dim tbl as ListObject
Dim t as Long
Dim dest as Range
For t = 1 to Sheets("Model").ListObjects.Count
Set tbl = Sheets("Model").ListObjects(t)
Set dest = Sheets("Sheet1").Range("B" & (5 + ((t - 1) * 16)))
dest.Resize(tbl.Rows.Count, tbl.Columns.Count).Value = tbl.Value
Next
尽管我建议做的事情大不相同,但让我回答您的实际问题,因为它仍然可以使用,并且仍然是完全有效的编程问题。
这样做的方法是实际上有一个单独的“计数器”变量(我通常从我的旧c ++大学课程中称它为i
),然后在循环语句中相应地递增start
, end
和output
。 如下所示:
Dim i As Integer
Dim start As Long
Dim end_ As Long
Dim output As Long
i = 0
Do
start = 3 + i * 13
end_ = start + 10
output = 5 + i * 16
' ... your code....
i = i + 1
Loop While start <= 224
基本上,您可以根据需要设置所有变量,并根据需要设置退出条件。
我希望这有意义并为您工作!!
您可以尝试这样的事情。 尝试增量(例如循环步长值, j + 10
, i + 10
和j = j + 11
),以获取想要的范围与表格的高度/宽度之间的间距。
Public Sub copyTables()
Dim i As Integer, j As Integer
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = ThisWorkbook.Sheets("Sheet1")
Set ws2 = ThisWorkbook.Sheets("Sheet2")
j = 5
For i = 3 To 224 Step 11
ws2.Range("B" & j, "D" & j + 10).Value = ws1.Range("C" & i, "E" & i + 10).Value
j = j + 11
Next i
Set ws1 = Nothing
Set ws2 = Nothing
End Sub
您可以尝试以下方法:
Sub main()
Dim iTab As Long
With Worksheets("Model").Range("C3:E13")
For iTab = 1 To 18
Worksheets("Sheet1").Range("B5:D15").Offset((iTab - 1) * 16).Value = .Offset((iTab - 1) * 13).Value
Next iTab
End With
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.