首页 > 解决方案 > Excel VBA 转置 1 个工作簿中的范围,然后将值传输到第 2 个工作簿追加到末尾

问题描述

我对 VBA 和学习仍然很陌生 - 我需要复制值(比如工作簿 A 中的范围 A)并将值转移到工作簿 B 中的范围 B。这些值需要转置,并稍微重组(1 列到移动到第一列)。

对我来说,我可以看到两种满足需求的方法。1.) 将范围 A 重组为垂直设置到一个新工作表中,然后从整个范围传输值并附加到工作簿 B 的底部。这会创建更多数据,但无需查找标题。

2.) 保持范围 A/工作簿 A 格式并使用循环/数组?要查找值,如果工作簿 A 的标题上存在新值,则将值添加到工作簿 B 的标题行 - 否则,在工作簿 A 中找到相应的值标题到工作簿 B 并传输值。这可以使数据保持统一,这是我喜欢的——但比我知道的要复杂得多。

我当前的代码有点乱。最初,我试图执行上面的选项 1,但从盲复制/传输值作为开始,然后修改以优化流程....并且它使用复制/粘贴特殊转置,这非常慢。我很难过,因为我仍然不熟悉循环,但更具体地说 - 转置功能。我听说它需要设置为数组。

我不是在找人为我解决代码,只需要帮助理解循环/转置数组。

Sub test()

Dim Cell As Range
Dim lastRow As Long
Dim lastRow2 As Long
Dim LastColumn As Long
Dim LastColumn2 As Long
Dim TargtRng As Range
Dim TargtRng2 As Range
Dim TargtRng3 As Range
Dim TargtRng4 As Range


'Chronology
With Sheets("Consolidated Change List")


For Each Cell In .Range("A4:A" & .Cells(.Rows.Count, "A").End(xlUp).Row)
    If Cell.Value <= Range("F2").Value Then
     ' Copy initial data set
     lastRow = Worksheets("Sheet1").Cells(Rows.Count, "F").End(xlUp).Row + 1
     Set TargtRng = .Range(Cell, Cell.Offset(, 8))
     Worksheets("Sheet1").Cells(lastRow, "A").Resize(TargtRng.Rows.Count,   TargtRng.Columns.Count).Value = TargtRng.Cells.Value

     ' Copy and Transpose other Rms/Rates
        'Target Range 2 is the Room types to be transposed
         LastColumn = Worksheets("Consolidated Change List").Cells(3, Worksheets("Consolidated Change List").Columns.Count).End(xlToLeft).Column
         Set TargtRng2 = Worksheets("Consolidated Change   List").Range(Range("J3"), Range("J3").End(xlToRight))
         TargtRng2.Copy
         Worksheets("Sheet1").Cells(lastRow, "H").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True

        ' Target Range 3 is the cell row within loop, new rates to transpose
        'LastColumn2 = .Cells(Cell, Worksheets("Consolidated Change List").Columns.Count).End(xlToRight).Column
        Set TargtRng3 = .Range(Cell.Offset(, 10), Cells(Cell, LastColumn))
        TargtRng3.Copy
        Worksheets("Sheet1").Cells(lastRow, "I").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True

        ' Target Range 4 is the Change order through Segment to be copied over
        Set TargtRng4 = .Range(Cell, Cell.Offset(, 7))
        lastRow2 = Worksheets("Sheet1").Cells(Rows.Count, "H").End(xlUp).Row
        Worksheets("Sheet1").Range(Cells(lastRow, "A"), Cells(lastRow2, "G")).Value = TargtRng4.Cells.Value






        End If
    Next Cell
End With


End Sub

要求 要求

当前 - 工作簿 A 的屏幕截图 当前 - 工作簿 A 的屏幕截图

上述选项 1 的预期转置屏幕截图 上述选项 1 的预期转置屏幕截图

要求:

  1. 从工作簿 A 复制范围 A 中的值并复制/转置(更喜欢传输值而不是专门为速度粘贴)到工作簿 B,范围 B
  2. 此示例文件未描述 2 个工作手册;工作簿 A(当前选项卡)中的内容和工作簿 B(预期转置选项卡)中的预期值的视觉参考
  3. 标题值下可能存在范围 A 的空白,这些空白应在不需要时被忽略/绕过
  4. 工作簿 B 中的范围 B 略微重组,因为 Dt_TmStamp 列移动到第一列
  5. 理想情况下,智能逻辑可以找到完全匹配的传输与盲复制/转置。如果包含以下项目符号,则可以将范围 A 和工作簿 A 中的结构保留到 Workboo B:
  6. vba 需要在工作簿 B 中找到相应的标题值 - 这是因为标题值可能会更改(排序顺序、删除旧值、添加新值)
  7. 它需要稍微重组并将 Dt_TmStamp 列保持为工作簿 B 中的第一列
  8. 标题值将保留在 Workbook B/RangeB 的第一行 - 但是,应在末尾添加新值,可以保留旧值
  9. 随着值的添加,表在工作簿 B 中增长;需要附加到最后一行。标题值保留在第一行

谢谢!

标签: excelvba

解决方案


推荐阅读