在循环中使用偏移量进行复制和粘贴

Using offset within a loop to copy and paste

我有生物力学数据(即一个人走路),它是通过视频记录收集的,并存储为每个帧编号的 3 列数据。在同一个工作表的单独数据 table 中,我有数据告诉我每个生物力学事件发生在哪个 excel 行号(即脚撞击地面或离开地面)。我正在尝试获取存储在一个电子表格中的生物力学数据,并将其转置,以便每个步骤都在其自己的列中。但是,每个生物力学事件(即每个步骤)都是不同的行数。

生物力学原始数据可以在这里看到:biomechanics raw data

我想要它做的是将单个事件(步骤)复制到第二个工作表,如下所示:desired biomechanic event output

相反,代码 运行 成功地完成了每个生物力学事件的循环,但将数据放在同一个地方,"A4"。这是因为我不知道如何在循环中使用基于变量的偏移量:current biomechanic event output with undesired overlay of data

我目前的代码在这里:

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. 找到字符串 "Foot Strike" 并告诉我 2 列的值并将其命名为 LeftTD(它会这样做)。 2. 从 LeftTD 的行号值开始,复制 A 列到 D 列中的单元格并将其粘贴到从 A4 开始的新工作表中(它执行此操作)。 3. 对于下一个 "Foot Strike" 和所有剩余的,在步骤 1 和 2 中执行相同的操作,但是然后从之前的复制和粘贴事件中复制具有偏移量 (0,5) 的单元格(它不会执行此操作). 4. 这样做直到 H 列为空(确实如此)。

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

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

我考虑过使用 .Find 和 .FindNext,但是网络上可用的信息确实缺乏接近我需要做的示例。确实,查找关于可变行和可变偏移列的复制和粘贴的信息对我来说也很难找到。任何提供的见解将不胜感激。谢谢!!!!

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

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