带有三个变量的VBA for循环

时间:2016-11-01 16:16:59

标签: excel vba excel-vba for-loop

我对VBA很新,但我正在学习。我有一张工作表" Model"有18张桌子。我用' start'来定义他们的范围。并且'结束'。因此,您可以在下面的VBA中看到,第一个表位于C3:E13,最后一个表位于C224:E234。 我想复制这些并在Sheet1中逐个粘贴它们。

在那里它们必须粘贴在细胞B5,B21,B38,......,B166中。因此第一个表应该粘贴在B5中,第二个表应该粘贴在B21中等等。

所以我的问题是,如何创建这个变量'输出' (在我的for循环中定义输出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

非常感谢提前!

4 个答案:

答案 0 :(得分:4)

请注意,根据您的评论,21 + 1637,而非38。不确定这是不是一个错字。修改为avoid 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>创建的正确表格。表,那么你可以这样做:

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

答案 1 :(得分:0)

虽然我建议做的事情完全不同,但是让我回答你的实际问题,因为它仍然有用,并且仍然是一个完全有效的编程问题。

这样做的方法是实际上有一个单独的"计数器"变量(我通常从我的旧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

基本上,您可以根据需要设置所有变量,并根据需要设置退出条件。

我希望这有意义并且适合你!!

答案 2 :(得分:0)

你可以尝试这样的事情。使用增量(例如循环步长值,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

答案 3 :(得分:0)

你可以试试这个:

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