簡體   English   中英

具有三個變量的VBA for循環

[英]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 + 1637 ,而不是您的注釋中的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 ),然后在循環語句中相應地遞增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

基本上,您可以根據需要設置所有變量,並根據需要設置退出條件。

我希望這有意義並為您工作!!

您可以嘗試這樣的事情。 嘗試增量(例如循環步長值, 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM