excel - 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 中的值并复制/转置(更喜欢传输值而不是专门为速度粘贴)到工作簿 B,范围 B
- 此示例文件未描述 2 个工作手册;工作簿 A(当前选项卡)中的内容和工作簿 B(预期转置选项卡)中的预期值的视觉参考
- 标题值下可能存在范围 A 的空白,这些空白应在不需要时被忽略/绕过
- 工作簿 B 中的范围 B 略微重组,因为 Dt_TmStamp 列移动到第一列
- 理想情况下,智能逻辑可以找到完全匹配的传输与盲复制/转置。如果包含以下项目符号,则可以将范围 A 和工作簿 A 中的结构保留到 Workboo B:
- vba 需要在工作簿 B 中找到相应的标题值 - 这是因为标题值可能会更改(排序顺序、删除旧值、添加新值)
- 它需要稍微重组并将 Dt_TmStamp 列保持为工作簿 B 中的第一列
- 标题值将保留在 Workbook B/RangeB 的第一行 - 但是,应在末尾添加新值,可以保留旧值
- 随着值的添加,表在工作簿 B 中增长;需要附加到最后一行。标题值保留在第一行
谢谢!
解决方案
推荐阅读
- sql - Oracle 用户如何在 oracle18c 中查询另一个模式中的表?
- php - 如何对数组中的字符串值求和
- node.js - 如何根据另一个属性选择一个属性 - mongodb
- excel - excel电子表格优化器
- javascript - 未捕获(承诺中)类型错误:无法读取未定义的属性“模式”
- boost - cmake find_package(Boost) 选择 PATH
- javascript - 我想在视图端javascript中使用控制器中的数据
- c# - 活动连接数达到最大 Mongo Atlas
- amazon-web-services - 为什么我在删除缓存 Amazon S3 网站后在我的网站上收到 502 Bad Gateway 错误
- google-cloud-platform - 无权访问我的虚拟机实例,没有足够的权限