copy a row of varied length, transpose it, and paste at the end of a column
我正在处理一个宏,以将不同数量的单元格复制到一行中,转置并粘贴到另一张工作表中,在下一列的空白单元格中。然后的想法是将每个转置项与它所在的行中的ID相匹配。 ID列中的行数也将有所不同。
在下面的示例中,ID 1与Co D和Co R相关联。转置会导致需要将ID 1复制到与目标相邻的两个单元中。我创建的此示例将它们放在同一张纸上,但是对于代码本身,它将在另一张纸上。
在复制要移调的范围时出现问题。我似乎无法弄清楚如何抓住整个行。宏正确地将值粘贴到了目的地中的下一个可用单元格中,但是我现在使用的代码版本仅复制了行中的最后一个结果,而不是我打算复制的整个行。我什至还没有达到将ID与"目标"列中的Co匹配的部分,但是我已经很害怕了。我的代码如下;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | Sub Testing() Dim TearS As Worksheet: Set TearS = Worksheets(1) Dim FeeS As Worksheet: Set FeeS = Worksheets(2) Dim EntryS As Worksheet: Set EntryS = Worksheets(3) Dim Stage2 As Worksheet: Set Stage2 = Worksheets(4) Dim Stage3 As Worksheet: Set Stage3 = Worksheets(5) Dim Bbg As Range: Set Bbg = EntryS.Range("F4:T199") Dim TDest As Range: Set TDest = Stage2.Range("F5:T200") Dim DateA As Range: Set DateA = Stage2.Range("G5:G200") Dim DateB As Range: Set DateB = TearS.Range("E5:E200") Dim DesA As Range: Set DesA = Stage2.Range("J5:J200") Dim DesB As Range: Set DesB = TearS.Range("O5:O200") Dim DesC As Range: Set DesC = Stage3.Range("C5:C200") Dim CpnMatA As Range: Set CpnMatA = Stage2.Range("Y5:Y200") Dim CpnMatB As Range: Set CpnMatB = TearS.Range("P5:P500") Dim SettA As Range: Set SettA = Stage2.Range("I5:I200") Dim SettB As Range: Set SettB = TearS.Range("Q5:Q200") Dim MinA As Range: Set MinA = Stage2.Range("AA5:AA200") Dim MinB As Range: Set MinB = Stage3.Range("D5:D200") Dim MWOB As Range: Set MWOB = TearS.Range("N5:N200") Dim Cel As Range For Each Cel In DesC If IsEmpty(Cel) = False Then Cel.Offset(0, 1).End(xlToRight).Copy TearS.Range("N3").End(xlDown).Offset(1).PasteSpecial Paste:=xlPasteAll, _ Operation:=xlNone, SkipBlanks:=False, Transpose:=True End If Next Cel End Sub |
编辑:您可以在下面的答案中看到吉普车的解决方案,可以轻松地工作。确保源数据中没有错误,否则您可能会遇到运行时错误13.
在将值传递回工作表之前,请尝试在二维数组中转置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | Sub rewrite() Dim lr As Long, a As Long, b As Long, val As Variant, vals As Variant With Worksheets("sheet6") .Range("F:G").Clear lr = Application.Max(.Cells(.Rows.Count,"B").End(xlUp).Row, _ .Cells(.Rows.Count,"C").End(xlUp).Row, _ .Cells(.Rows.Count,"D").End(xlUp).Row, _ .Cells(.Rows.Count,"E").End(xlUp).Row) vals = .Range(.Cells(2,"A"), .Cells(lr,"E")).Value2 For a = LBound(vals, 1) To UBound(vals, 1) ReDim val(1 To UBound(vals, 2), 1 To 2) For b = LBound(val, 1) To UBound(val, 1) - 1 If CBool(Len(vals(a, b + 1))) Then val(b, 1) = vals(a, 1) val(b, 2) = vals(a, b + 1) End If Next b .Cells(.Rows.Count,"F").End(xlUp).Offset(1, 0).Resize(UBound(val, 1), UBound(val, 2)) = val Next a End With End Sub |