三变量循环的VBA

三变量循环的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

我对VBA很陌生,但我正在学习。我有一个工作表“模型”,有18个表格。我用“开始”和“结束”定义了它们的范围。正如您在下面的VBA中所看到的,第一个表在C3:E13中,最后一个表在C224:E234中。 我想复制这些并将它们一个一个地粘贴到Sheet1中

它们必须粘贴在单元格B5、B21、B38、…、B166中。因此,第一个表应该粘贴在B5中,第二个表应该粘贴在B21中,以此类推

所以我的问题是,如何在for循环中创建这个变量“output”(定义输出行数)

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解决方案绝对是最好的解决方案。这只是获得相同结果的另一种方式,允许更明确的变量设置