嵌套For ...下一个循环复制和粘贴几次

时间:2016-04-07 19:57:17

标签: excel vba excel-vba loops

我想要复制单元格"A2:A" & patientprofiles + 1并将它们粘贴到D列的第一个未使用的行中(即,D列中已经存在的内容与我要粘贴的内容之间应该没有空白单元格,但是我也不想粘贴已经存在的东西)。然后我想用用户定义的次数重复这个过程(这个变量将被称为g1_observations)。然后,我想将单元格"A" & patientprofiles + 2 & ":A" & 2 * patientprofiles + 1复制到D列中新的最后一行(即,考虑到我刚刚粘贴了patientprofiles个单元格数g1_observations次列D的底部。我想继续用户定义的次数重复此过程(此次数由变量numberofgrids定义)。

例如:假设用户已定义将有三个网格。网格1将有2个观测值,网格2将有3个观测值,网格3将有4个观测值。还可以想象患者配置文件已设置为40。

如果是这种情况,单元格D1:D121中已经存在值,所以我想在D122中开始粘贴。我想将细胞A2:A41(40个细胞,因为患者的配置文件= 40)粘贴到细胞D122:D161;我想将细胞A42:A81粘贴到细胞D162:D201并再次粘贴到D:202:D241;并且我想将细胞A82:A121粘贴到细胞D242:D281,再次粘贴到细胞D282:D321,并再次粘贴到细胞D322:D361。我将每个“网格”粘贴的时间少于该网格的观察次数,因为所有网格的第一组观察结果都包含在单元格D2:D121中。 结束示例

我很确定我需要使用嵌套的For ... Next循环才能做到这一点,但我遇到内外循环问题。我认为外循环应该是这样的:

Dim i as long
For i = 0 to numberofgrids - 1
    [insert inner loop here]
Next

就内环而言,我并不确定我在做什么,因为当我从两个网格粘贴时它会不断粘贴自己。我使用的当前代码重复使用For ... Next循环并且不起作用:

Dim myLastRow as Integer
myLastRow = Worksheets("Work").UsedRange.Rows.Count
Dim j as Long
For j = 1 To g1_observations - 1
    If j = 1 Then
        Range(Cells(2, 1), Cells((patientprofiles + 1), 1)).Copy _
        Destination:=Worksheets("Work").Cells(j * myLastRow + 1, 4)
    ElseIf j > 1 Then
        Range(Cells(2, 1), Cells((patientprofiles + 1), 1)).Copy _
        Destination:=Worksheets("Work").Cells((j + 1) * (myLastRow / 2) + 1, 4)
    Else: Range("A1").Select
    End If
Next

For j = 1 To g2_observations - 1
    If j = 1 Then
        Range(Cells(patientprofiles + 2, 1), Cells((2 * patientprofiles + 1), 1)).Copy _
        Destination:=Worksheets("Work").Cells(j * myLastRow + 1, 4)
    ElseIf b > 1 Then
        Range(Cells(patientprofiles + 2, 1), Cells((2 * patientprofiles + 1), 1)).Copy _
        Destination:=Worksheets("Work").Cells((b + 1) * (myLastRow / 2) + 1, 4)
    Else: Range("A1").Select
    End If
Next

它贴在自身上,有时会跳过线条。我无法弄清楚如何将myLastRow与循环协调。

我认为内循环可能应该从这样开始:

Dim j as Long
For j = 0 to gj_observations - 1
    Range(Cells(j * XXX + 2, 1), Cells((j + 1) * patientprofiles + 1).Copy _
    Destination:=Worksheets("Work").Cells(myLastRow * j + 1) , 4

但是我遇到了困难,因为变量被称为g1_observations,g2_observations,g3_observations等,一直到g10_observations,显然gj_observations不起作用。我想循环“g”和“_”之间的数字,但我不知道如何让VBA以这种方式读取变量,或者这是否可能。

任何人都可以帮助我吗?我的思绪正在试图理解循环的概念,特别是在每个级别都有不同的变量。

另外,附带问题,你怎么告诉VBA在If语句中什么都不做?我目前通过编写Else: Range("A1").Select选择A1,但我确信有更好的方法。

2 个答案:

答案 0 :(得分:2)

当您编写宏时,使用范围并避免在循环中一次操作一个单元格是更好的做法。你的宏运行得更快,代码也会更清晰。

如果要创建一组可以按编号访问的变量,可以使用称为数组的变量。这是一个非常基本的概念,几乎存在于每种编程语言中,因此我将向您推荐MSDN或您最喜爱的VBA语言参考指南。

Dim ws As Worksheet
Dim lr As Long          ' Last Row
Dim szpp As Long        ' Size (rows) patient profiles
Dim szgobsrv(2) As Long ' Size (rows) observation groups
Dim i As Long
Dim j As Long
Dim SourceCells As Range
Dim TargetCell As Range

Set ws = Sheets("Work")

szpp = 40
szgobsrv(0) = 1
szgobsrv(1) = 2
szgobsrv(2) = 3

For i = 0 To UBound(szgobsrv)
    lr = ws.UsedRange.Row + ws.UsedRange.Rows.Count - 1

    ' copy the patient profile cells multiple times depending on group size
    For j = 0 To szgobsrv(i) - 1
        Set SourceCells = ws.[A2].Offset(i * szpp).Resize(szpp)
        Set TargetCell = ws.[D1].Offset(lr + j * szpp)
        SourceCells.Copy TargetCell
    Next

Next

请注意ResizeOffset方法的用法。这些是有用的Range方法,可以将范围的大小和位置更改为固定数量。

答案 1 :(得分:1)

您过度编写值时遇到的主要问题是您没有使用Offset。

关于嵌套循环要记住的另一个重要事项是嵌套循环在上层循环的每个循环中运行i次。我在想这里的嵌套循环可能不适合你。你可能只是让它们成为所有独立的循环?

如果要循环到变量中包含的数字,可能需要将该变量设置为等于数字。

示例:

 g2_observations =2
 For j = 1 To g2_observations - 1

除此之外,我确实很难理解你需要什么,但希望这有帮助吗?

numberofgrids = input
i = 1 to numberofgrids
    gridCount = gridCount + 1
    'Loop Stuff
    Case Select gridCount

    Case is = 1
    'logic
    Case is = 2
    'logic
    Etc etc 
    End Select

    If numberofgrids = gridCount Then 
        Exit For
    End If
Next i