【发布时间】:2015-09-29 23:23:22
【问题描述】:
我有一个后端原始输出数据集,它由多个列组成,其中一些列是空的,除了标题。
我想将此数据传输到另一个工作表中,我们称之为后端 - 已处理。在此工作表中,我将准备一个标题行,其中包含原始数据集中包含的一些标题。处理后的工作表中不会有任何新的标题(所以基本上标题(已处理)是标题(原始输出)的子集)。
曾经,我用一个函数(索引和匹配)来解决这个问题,但是随着原始数据集的增加,从性能的角度来看,这变得不太理想。
从那时起,我一直在阅读 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 是原始原始数据输出的标头所在的位置。范围 b7:t7 是处理过的数据表的表头所在的位置。
作为 VBA 的初学者,我很高兴它可以工作,但仍然认为还有很大的改进空间:
1) 它仍然很慢,大约需要 10 秒才能完成 40x500 阵列。 2)我不知道如何让它停止寻找下一个标题,如果最后一个标题是空白的(范围 b7:t7 的结尾) 3) 我非常愿意采用新的/更好的方法来解决这个问题。
【问题讨论】:
-
一个快速的胜利是在代码的开头包含
Application.ScreenUpdating = False,在结尾包含Application.ScreenUpdating = True。这避免了 Excel 必须更新屏幕显示 -
谢谢米格尔!我添加了它并获得了一些秒数!