三变量循环的VBA
我对VBA很陌生,但我正在学习。我有一个工作表“模型”,有18个表格。我用“开始”和“结束”定义了它们的范围。正如您在下面的VBA中所看到的,第一个表在C3:E13中,最后一个表在C224:E234中。 我想复制这些并将它们一个一个地粘贴到Sheet1中 它们必须粘贴在单元格B5、B21、B38、…、B166中。因此,第一个表应该粘贴在B5中,第二个表应该粘贴在B21中,以此类推 所以我的问题是,如何在for循环中创建这个变量“output”(定义输出行数)三变量循环的VBA,vba,excel,for-loop,Vba,Excel,For Loop,我对VBA很陌生,但我正在学习。我有一个工作表“模型”,有18个表格。我用“开始”和“结束”定义了它们的范围。正如您在下面的VBA中所看到的,第一个表在C3:E13中,最后一个表在C224:E234中。 我想复制这些并将它们一个一个地粘贴到Sheet1中 它们必须粘贴在单元格B5、B21、B38、…、B166中。因此,第一个表应该粘贴在B5中,第二个表应该粘贴在B21中,以此类推 所以我的问题是,如何在for循环中创建这个变量“output”(定义输出行数) Dim start As Long
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
非常感谢 尽管我会建议您采取完全不同的做法,但让我回答您的实际问题,因为它仍然有效,并且仍然是一个完全有效的编程问题 <>这是一个单独的“计数器”变量(我通常称它为代码>代码> i >代码>从我的旧C++课程中),然后在循环语句中相应地增加代码< >开始<代码>,<代码>结束<代码>和<代码>输出< /代码>。这将如下所示:
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
Dim i作为整数
开始的时间越长越好
昏暗的尽头uuu一样长
将输出变暗为长
i=0
做
开始=3+i*13
结束=开始+10
输出=5+i*16
' ... 你的代码。。。。
i=i+1
开始时循环虽然我会建议以完全不同的方式进行操作,但让我回答您的实际问题,因为它仍然有效,并且仍然是一个完全有效的编程问题
<>这是一个单独的“计数器”变量(我通常称它为代码>代码> i >代码>从我的旧C++课程中),然后在循环语句中相应地增加代码< >开始<代码>,<代码>结束<代码>和<代码>输出< /代码>。这将如下所示:
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
Dim i作为整数
开始的时间越长越好
昏暗的尽头uuu一样长
将输出变暗为长
i=0
做
开始=3+i*13
结束=开始+10
输出=5+i*16
' ... 你的代码。。。。
i=i+1
开始时循环注意,根据您的评论,21+16
是37
,而不是38
。不确定那是不是打字错误。修改为99%是不必要的,并且为了避免相对昂贵的复制
,而直接将值从一个范围转移到另一个范围
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创建的正确表,则可以执行以下操作:
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
请注意,根据您的评论,21+16
是37
,而不是38
。不确定那是不是打字错误。修改为99%是不必要的,并且为了避免相对昂贵的复制
,而直接将值从一个范围转移到另一个范围
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创建的正确表,则可以执行以下操作:
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
你可以试试这样的。利用增量(例如循环步长值、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
你可以试试这样的。利用增量(例如循环步长值、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
你可以试试这个:
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
这些表是真的吗(例如,从Insert>表格功能区)?(仅供参考,建议避免使用)这些表是真的吗(例如,从Insert>表格功能区)?(仅供参考,建议避免使用)回答不错-您甚至可以在启动for循环之前将输出设置为5,然后去掉IIF()
@JohnBustos yes,你说得对。我更喜欢这个。修改过了。那好多了,谢谢。你让我的生活更轻松;)回答不错-在开始for循环之前,您甚至可以将输出设置为5,然后去掉IIF()
@JohnBustos是的,您是对的。我更喜欢这个。修改过了。那好多了,谢谢。你让我的生活更轻松;)谢谢!这样说是有道理的:)很高兴这是有道理的,很高兴你得到了你想要的。不过,我相信你接受了正确的解决方案-@DavidZemens解决方案绝对是最好的解决方案。这只是获得相同结果的另一种方式,并允许更明确的变量设置。非常感谢!这样说是有道理的:)很高兴这是有道理的,很高兴你得到了你想要的。不过,我相信你接受了正确的解决方案-@DavidZemens解决方案绝对是最好的解决方案。这只是获得相同结果的另一种方式,允许更明确的变量设置