Excel 在循环中使用偏移来复制和粘贴

Excel 在循环中使用偏移来复制和粘贴,excel,vba,for-loop,copy,offset,Excel,Vba,For Loop,Copy,Offset,我有生物力学数据,即通过视频记录收集的人行走数据,并存储为每个帧编号的3列数据。在同一工作表中的一个单独的数据表中,我有数据告诉我每个生物力学事件发生的excel行号,即脚触地或离开地面。我试图将存储在一个电子表格中的生物力学数据按行进行转换,以便每一步都在自己的列中。然而,每个生物力学事件,即每一步是不同的行数 生物力学原始数据如下所示: 我想让它做的是将单个事件步骤复制到第二个工作表中,如下所示: 相反,代码成功地在每个生物力学事件的循环中运行,但将数据放在相同的位置,A4。这是因为我不知道

我有生物力学数据,即通过视频记录收集的人行走数据,并存储为每个帧编号的3列数据。在同一工作表中的一个单独的数据表中,我有数据告诉我每个生物力学事件发生的excel行号,即脚触地或离开地面。我试图将存储在一个电子表格中的生物力学数据按行进行转换,以便每一步都在自己的列中。然而,每个生物力学事件,即每一步是不同的行数

生物力学原始数据如下所示:

我想让它做的是将单个事件步骤复制到第二个工作表中,如下所示:

相反,代码成功地在每个生物力学事件的循环中运行,但将数据放在相同的位置,A4。这是因为我不知道如何在循环内基于变量使用偏移:

我目前拥有的代码如下:

Private Sub CommandButton1_Click()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Sheets("Sheet2")
Dim LeftStrike As Range, FrameLTD As Range, FrameLTDx As Range
Dim lrL As Long, LastFrame As Long
Dim LeftTD As Variant
Dim LeftTDx As Variant

lrL = ws.Range("H" & ws.Rows.Count).End(xlUp).Row
LastFrame = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

Set LeftStrike = ws.Range("H2:H" & lrL)

For Each FrameLTD In LeftStrike
   If InStr(FrameLTD, "Foot Strike") Then
           LeftTD = FrameLTD.Offset(0, 2)
          'COMMENT: Set LeftTDx = LeftTD + 1
         ws.Range("A" & LeftTD, "D" & LastFrame).Copy ws2.Range("A4")

        ' COMMENT: ws.Range("A" & LeftTDx, "D" & LastFrame).Copy ws2.Range("FrameLTD").Offset(0, 5)

    End If
Next FrameLTD
End Sub
我想让该计划做的是: 1.找到字符串footstroke,告诉我上面两列的值,并将其称为LeftTD,这样做。 2.从LeftTD的行号值开始,将A列到D列中的单元格复制到新工作表中,从A4开始执行此操作。 3.对于下一次脚击和所有剩余的脚击,请在步骤1和2中执行相同的操作,但是,如果复制单元格时偏移了上一次复制粘贴事件的0,5,则不会执行此操作。 4.在H列为空之前执行此操作

我的想法是,如果我将变量声明为variant,那么我可以告诉它将下一个LeftTD计算为LeftTD+1,然后告诉它将范围变量的范围偏移5,这样就行了。但如果我取消对这些行的注释,则会出现类型不匹配错误。另外,有趣的是,如果我按F8键并一步一步地运行程序,它只会在程序的第2、第5、第7和第9次的每一步复制每个生物力学事件

所以我的具体问题是,如何在通过范围变量循环的For循环中使用变量偏移量


我曾考虑过使用.Find和.FindNext,但对于一个接近我需要做的示例来说,web上提供的信息确实很缺乏。事实上,我也很难找到有关复制和粘贴的信息,包括可变行和可变偏移量列。如能提供任何见解,将不胜感激。谢谢

添加一个计数器来标识目的地

Dim DestCol As Long
'...
DestCol = 1
For Each FrameLTD In LeftStrike
    If InStr(FrameLTD, "Foot Strike") Then
        LeftTD = FrameLTD.Offset(0, 2)
        ws.Range("A" & LeftTD, "D" & LastFrame).Copy ws2.Cells(4, DestCol)
        DestCol = DestCol + 5
    End If
Next FrameLTD

你的意思是你想粘贴在A4,F4等?如果是这样,你可以使用一个计数器ws2.RangeA4.offset,每次递增5。