Vba 嵌套用于…下一个要复制和粘贴多次的循环

Vba 嵌套用于…下一个要复制和粘贴多次的循环,vba,excel,loops,Vba,Excel,Loops,我想复制单元格“A2:A”&patientprofiles+1,并将它们粘贴到D列中第一个未使用的行中(即,D列中已经存在的单元格和我想粘贴的单元格之间不应该有空白单元格,但我也不想粘贴到已经存在的单元格上)。然后我想重复这个过程一次用户定义的次数(这个变量将被称为g1\u observations)。然后我想将单元格“A”&patientprofiles+2&“:A”&2*patientprofiles+1复制到D列中最近使用的新行(即,考虑到我刚刚在D列底部粘贴了patientprofile

我想复制单元格
“A2:A”&patientprofiles+1
,并将它们粘贴到D列中第一个未使用的行中(即,D列中已经存在的单元格和我想粘贴的单元格之间不应该有空白单元格,但我也不想粘贴到已经存在的单元格上)。然后我想重复这个过程一次用户定义的次数(这个变量将被称为
g1\u observations
)。然后我想将单元格
“A”&patientprofiles+2&“:A”&2*patientprofiles+1
复制到D列中最近使用的新行(即,考虑到我刚刚在D列底部粘贴了
patientprofiles
number of cells
g1_observations
次数。我想继续重复这个过程,重复用户定义的次数(次数由变量
numberofgrids
定义)

例如:假设用户定义了三个网格。网格1将有2个观察值,网格2将有3个观察值,网格3将有4个观察值。还假设patientprofiles已设置为40

如果是这种情况,单元格D1:D121中已经有值,因此我想开始在D122中粘贴。我想粘贴单元格A2:A41(40个单元格,因为patientprofiles=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
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
就内部循环而言,我不确定我在做什么,因为当我从两个网格粘贴时,它会一直粘贴在自身上。我使用的当前代码重复了…下一个循环,但不起作用:

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
它会粘在自己身上,有时会跳过线条。我真的不知道如何使我的星图与循环相协调

我认为内部循环应该从以下内容开始:

Dim i as long
For i = 0 to numberofgrids - 1
    [insert inner loop here]
Next
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_观测值、g2_观测值、g3_观测值等等,一直到g10_观测值,显然,
gj_观测值
不起作用。我想循环“g”和“u”之间的数字,但我不知道如何让VBA以这种方式读取变量,或者如果可能的话

这里有人能帮我吗?我的脑子在转,因为我试图理解循环的概念,特别是在每一个层次上都有不同的变量


另外,还有一个附带问题,您如何告诉VBA在If语句中不执行任何操作?我目前让它通过编写
Else:Range(“A1”)来选择A1。选择
,但我确信有更好的方法来执行此操作。

过度编写值的主要问题是您没有使用偏移量

关于嵌套循环要记住的另一件重要事情是,嵌套循环在上层循环的每个循环中运行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

过度写入值的主要问题是没有使用偏移量

关于嵌套循环要记住的另一件重要事情是,嵌套循环在上层循环的每个循环中运行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

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

如果你想创建一组可以通过数字访问的变量,你可以使用一种叫做数组的东西。这是一个非常基本的概念,几乎存在于每种编程语言中,所以我会参考你或你最喜欢的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

请注意和方法的用法。这些方法非常有用,可以通过固定数量更改范围的大小和位置。

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

如果你想创建一组可以通过数字访问的变量,你可以使用一种叫做数组的东西。这是一个非常基本的概念,几乎存在于每种编程语言中,所以我会参考你或你最喜欢的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

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

If
块的所有子句中,您可以简单地将其保留在没有任何内容的情况下,让Excel不执行任何操作。
Else
子句是可选的。因此,您可以只删除它整个
Else:Range(“A1”)。选择
行。您会发布工作表示例吗?在
If
块的所有子句中,您只需将其保留,不包含任何内容即可