vba - 通过匹配Header传输数据

标签 vba excel

我有一个后端原始输出数据集,它由多个列组成,其中一些列除了标题之外是空的。

我想将此数据传输到另一个工作表中,我们将其称为“后端 - 已处理”。在此工作表中,我将准备一个标题行,其中包含原始数据集中包含的一些标题。处理后的工作表中不会有任何新标题(因此基本上标题(已处理)是标题(原始输出)的子集)。

曾经,我曾经使用函数(索引和匹配)来解决这个问题,但随着原始数据集的不断增长,从性能角度来看,这变得不太理想。

从那时起,我一直在阅读 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/

相关文章:

ms-access - 使用 vba 在 Access 2010 中使用来自不同表单的 ID 打开表单

vba - 从事件单元格开始选择一系列单元格

vba - 过滤表后范围类的删除方法失败

python - 如何使用 openpyxl 在 python 中写入新单元格

vba - 赋值左侧的函数调用必须返回变量或对象错误

VBA 错误 1004 - QueryTable.Add

excel - 如何将Excel中的数据曲线拟合为多变量多项式?

excel - VBA点击IE中的元素

excel - 如何在 Excel 或 apache POI 中输入 "format as table"?

java - 强制只读 Apache POI 中的第一张表