繁体   English   中英

VBA 停止使用临时范围

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM