我是 vba 的新手,所以我需要一些帮助来提高我的宏的效率。它确实返回了预期的结果,但我知道必须有一种更快的方法来做到这一点,我只是没有 vba 经验,不知道如何做。
我有一列包含分配给项目的人员姓名。有的只有一个名字,有的可能有多个,例如:
目前,我的代码遍历此列,用逗号分隔名称,然后将它们单独输入到一个新范围中,如下所示:
然后我使用唯一名称的集合并将它们输入到最终所需的列表中。名称必须出现三次,空行,接下来的三行是下一个名称,依此类推。最后应该是这样的:
目前我的代码如下
Sub FindUniques()
Dim Ws As Worksheet, Ns As Worksheet
Dim SubString() As String, m As Integer, k As Long, NameCount As Integer
Dim allNames As New Collection, tempRng As Range
Set Ns = Worksheets("Sheet2")
Set Ws = Worksheets("Sheet1")
'Loops through the Assigned To column, separates and finds unique names
On Error Resume Next
For i = 1 To Ws.Range("A:A").End(xlDown).Row - Range("Assigned_to").Row
SubString = Split(Range("Assigned_to").Offset(i), ", ")
For j = 0 To UBound(SubString)
allNames.Add (allNames.count), SubString(j)
Next j
Next i
On Error GoTo 0
NameCount = allNames.count
For k = 1 To NameCount
For m = 1 To 4
Ns.Cells((k - 1) * 4 + m + 7, 2) = allNames.Key(k)
Next
Range("Names").Offset((k - 1) * 4).ClearContents
Next
End Sub
它有效,但是必须有某种方法比将名称输入新范围然后删除该范围更有效。我如何使用集合或数组或类似的东西来使其更快?任何想法将不胜感激
编辑:我现在已经更新了代码,它正在使用一个集合,从子字符串中获取值。这将在单元格中输入项目 (0, 1, 2, ...) 而不是键(这里的键是名称)。我如何让它返回 key 而不是项目编号?
最佳答案
VBA 中最慢的部分是工作表交互,因此我们应该尽量减少它。
Sub FindUniques()
Dim ws As Worksheet, ns As Worksheet
Dim splitStr() As String, nameStr As Variant
Dim dict As New Dictionary
Dim lastRow As Long, i As Long
Set ns = Worksheets("Sheet2")
Set ws = Worksheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
'Loops through the Assigned To column, separates and finds unique names
For i = 2 To lastRow
splitStr = Split(CStr(ws.Cells(i, 1).Value), ", ")
For Each nameStr In splitStr
If Not dict.Exists(nameStr) Then dict.Add nameStr , 0
Next
Next i
i = 2
For Each nameStr In dict.Keys
ns.Cells(i, 1).Resize(3).Value = nameStr
i = i + 4
Next
End Sub
根据@Toddleson 和@BigBen 的建议编辑
祝你好运!
关于arrays - VBA 停止使用临时范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73417510/