我在一张名为 tbl_raw
的表中有 99 列.我需要将这些列中的 96 个复制到另一个具有相同标题名称的表中,但它们以不同的顺序重新排列。最有效的方法是什么?
我知道的唯一方法是:raw_data.Range("tbl_raw[EMPLOYEE]").Copy
processed_data.Range("tbl_processed[EMPLOYEE]").PasteSpecial
但是,这需要大量代码(96 * 2 = 192 行),我不确定是否有更有效的方法来做到这一点。
我尝试使用 https://www.thespreadsheetguru.com/blog/2014/6/20/the-vba-guide-to-listobject-excel-tables ,但我也想不出一种方法来处理这些信息。
任何指导将不胜感激。
最佳答案
避免处理复制 ListObject 列并使用直接值传输。
Option Explicit
Sub raw2processed()
Dim lc As Long, mc As Variant, x As Variant
Dim raw_data As Worksheet, processed_data As Worksheet
Dim raw_tbl As ListObject, processed_tbl As ListObject
Set raw_data = Worksheets("raw")
Set processed_data = Worksheets("processed")
Set raw_tbl = raw_data.ListObjects("tbl_raw")
Set processed_tbl = processed_data.ListObjects("tbl_processed")
With processed_tbl
'clear target table
On Error Resume Next
.DataBodyRange.Clear
.Resize .Range.Resize(raw_tbl.ListRows.Count + 1, .ListColumns.Count)
On Error GoTo 0
'loop through target header and collect columns from raw_tbl
For lc = 1 To .ListColumns.Count
Debug.Print .HeaderRowRange(lc)
mc = Application.Match(.HeaderRowRange(lc), raw_tbl.HeaderRowRange, 0)
If Not IsError(mc) Then
x = raw_tbl.ListColumns(mc).DataBodyRange.Value
.ListColumns(lc).DataBodyRange = x
End If
Next lc
End With
End Sub
关于excel - VBA将数据从一个表复制到另一个表并重新排列列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55189590/