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

问题描述 投票:0回答:1

我有生物力学数据(即人走动),该数据随视频记录一起收集并存储为每个帧编号的3列数据。在同一工作表的单独数据表中,我有数据告诉我每个生物力学事件发生在哪个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.对于下一个“脚底罢工”以及所有剩余的“脚底罢工”,请在步骤1和2中执行相同的操作,然后从上一个复制和粘贴事件中复制偏移量为(0,5)的单元格(它不会这样做) 。4.执行此操作,直到H列为空(这样做)。

我的想法是,如果我将变量声明为“ variant”,那么我可以告诉它将下一个LeftTD计为LeftTD +1,然后告诉它将范围变量的范围偏移5。但是,如果我取消注释这些行,则会收到类型不匹配错误。同样,有趣的是,如果我按F8键并逐步执行程序,则它只会在程序的第二,第五,第七和第九次复制每个生物力学事件(每个步骤)。

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

我曾考虑过使用.Find和.FindNext,但实际上缺少一个网络上可用的信息来作为一个与我需要做的事情接近的示例。确实,对于我来说,很难找到包含可变行和可变偏移量列的复制和粘贴信息。任何提供的见解将不胜感激。谢谢!!!!

excel vba for-loop copy offset
1个回答
1
投票

添加计数器以标识目的地

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
© www.soinside.com 2019 - 2024. All rights reserved.