嵌套对…下一个循环复制和粘贴几次

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

例如 :想象用户已经定义了将有三个网格。 网格1有2个观测值,网格2有3个观测值,网格3有4个观测值。 另外想象一下,病人档案已被设定为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。 我将每个“网格”的粘贴时间less于该网格的观察次数,因为所有网格的第一组观察结果是单元格D2:D121中包含的内容。 最后的例子

我很确定我需要使用一个嵌套的For … Next循环来做到这一点,但我有麻烦的内部和外部循环。 我认为外循环应该是这样的:

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

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

 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 

但我有困难,因为variables被称为g1_observations,g2_observations,g3_observations等,一直到g10_observations,显然gj_observations将无法正常工作。 我想循环使用“g”和“_”之间的数字,但我不知道如何让VBA以这种方式读取variables,或者如果可能的话。

有人可以帮我从这里出去吗? 我的想法是从试图理解循环的概念,特别是在每个级别的不同variables上转动。

另外,侧面的问题,你如何告诉VBA在If语句中什么也不做? 我现在通过编写Else: Range("A1").Select ,但是我相信有一个更好的方法。

在编写macros时,最好使用范围来避免在循环中一次处理一个单元格。 你的macros将运行得更快,代码将更清晰。

如果你想创build一组你可以用数字访问的variables,你可以使用一个叫做数组的东西。 这是几乎所有编程语言中都存在的一个非常基本的概念,所以我将把你引荐到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方法,可以改变一个范围的大小和位置一个固定的数量。

你值得重写的主要问题是你没有使用偏移量。

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

如果你想循环到variables中包含的数字,你可能想设置variables等于一个数字。

例:

  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