我有一个后端原始输出数据集,它由多个列组成,其中一些列除了标题之外是空的。
我想将此数据传输到另一个工作表中,我们将其称为“后端 - 已处理”。在此工作表中,我将准备一个标题行,其中包含原始数据集中包含的一些标题。处理后的工作表中不会有任何新标题(因此基本上标题(已处理)是标题(原始输出)的子集)。
曾经,我曾经使用函数(索引和匹配)来解决这个问题,但随着原始数据集的不断增长,从性能角度来看,这变得不太理想。
从那时起,我一直在阅读 VBA 代码,直到现在我得出的结论是:
Sub test()
Dim r As Range, c As Range, msg As String
With Sheets("Backend - raw").Range("4:4").CurrentRegion
For Each r In Sheets("Backend - processed").Range("b7:t7")
Set c = .Rows(1).Find(r.Value, , , xlWhole, , 0)
If Not c Is Nothing Then
.Columns(c.Column).Copy
r.PasteSpecial xlPasteValues
Else
msg = msg & vbLf & r.Value
End If
Next
Application.CutCopyMode = False
End With
End Sub
范围 4:4 是原始原始数据输出的 header 所在的位置。范围 b7:t7 是处理后的数据表的标题所在的位置。
作为 VBA 的初学者,我很高兴它能起作用,但仍然认为还有很大的改进空间:
1) 它仍然很慢,大约需要 10 秒才能完成 40x500 的数组。 2)如果最后一个标题为空(范围结束b7:t7),我不知道如何让它停止寻找下一个标题 3)我非常愿意接受新的/更好的方法来解决这个问题。
最佳答案
搜索、复制和粘贴可能是相当耗时的事情。您可能最好将标题读取一次到某种存储列表中(Collection
非常适合您,因为它可以将列号存储为其值,将标题文本存储为其键.
假设您只是复制和粘贴值(即您不需要将单元格格式传递到处理后的工作表中),那么将值读取到数组中,然后将该数组写入工作表中会更快。
下面的代码就是一个例子,但我确信,如果有更多的想法,它可以做得更快(例如,一旦使用了集合中的 header ,就将其丢弃,或者不必找到最后一行号对于每个单独的列)。
Dim rawSht As Worksheet
Dim procSht As Worksheet
Dim headers As Collection
Dim c As Integer
Dim v As Variant
Set rawSht = ThisWorkbook.Worksheets("Backend - raw")
Set procSht = ThisWorkbook.Worksheets("Backend - processed")
Set headers = New Collection
For c = 1 To rawSht.Cells(4, Columns.Count).End(xlToLeft).Column
headers.Add c, rawSht.Cells(4, c).Text
Next
For c = 2 To 20
rawCol = headers(procSht.Cells(7, c).Text)
v = rawSht.Range(rawSht.Cells(5, rawCol), rawSht.Cells(Rows.Count, rawCol).End(xlUp)).Value2
procSht.Cells(8, c).Resize(UBound(v, 1)).Value = v
Next
关于vba - 通过匹配Header传输数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32841933/