[英]VBA stop using temporary ranges
我是 vba 的新手,所以我需要一些帮助来提高我的宏的效率。 它确实返回了预期的结果,但是我知道必须有更快的方法来做到这一点,所以我只是没有 vba 的经验知道如何操作。
我有一列包含分配给项目的人员的姓名。 有的只有一个名字,有的可能有多个,例如:
目前,我的代码通过此列,用逗号分隔名称,并将它们单独输入到一个新范围中,如下所示:
然后,我使用一个集合作为唯一名称,并将它们输入到最终所需的列表中。 名字必须出现3次,空白行,接下来的三行是下一个名字,以此类推。最后应该是这样的:
目前我的代码如下
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
它可以工作,但是必须有某种方法比将名称输入新范围然后删除范围更有效。 如何使用集合或数组或类似的东西使其更快? 任何想法都会非常感激
编辑:我现在已经更新了代码,它正在使用一个集合,从 substring 中获取值。 这会在单元格中输入项目 (0, 1, 2, ...) 而不是键(这里的键是名称)。 如何让它返回密钥而不是项目编号?
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 的建议
祝你好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.