VBA for-loop有三个variables

我对VBA相当陌生,但我正在学习。 我有一个工作表“模型”,有18个表。 我用“开始”和“结束”来定义他们的范围。 因此,您可以在下面的VBA中看到,第一个表格在C3:E13中,最后一个表格在C224:E234中。 我想复制这些并在Sheet1中一一粘贴。

在那里他们必须粘贴在单元格B5,B21,B38,…,B166。 所以第一个表格应该粘贴在B5,第二个粘贴在B21等等

所以我的问题是,我怎么能在我的for循环中创build这个variables“输出”(它定义输出rownumber)?

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 + 1637 ,而不是38根据您的意见。 不知道这是否是一个错字。 修改以避免Select哪个是99%不必要的,并且避免相对昂贵的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 

如果您的表格是从“插入”(Insert)>“表格”(Table)创build的适当的表格,则可以执行如下操作:

 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 

虽然我会build议完全不同的做法,但让我回答你的实际问题,因为它仍然可以工作,并且仍然是一个完全有效的编程问题。

这样做的方法是实际上有一个单独的“计数器”variables(我通常从我的旧c ++大学课程中称之为i ),然后在循环语句中相应地增加startendoutput 。 那看起来如下:

 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 

基本上,那么你可以根据需要设置所有的variables,并根据需要设置退出标准。

我希望这是有道理的,为您工作!

你可以尝试这样的事情。 玩弄增量(例如循环步数值, j + 10i + 10j = 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