arrays - VBA 停止使用临时范围

标签 arrays excel vba

我是 vba 的新手,所以我需要一些帮助来提高我的宏的效率。它确实返回了预期的结果,但我知道必须有一种更快的方法来做到这一点,我只是没有 vba 经验,不知道如何做。

我有一列包含分配给项目的人员姓名。有的只有一个名字,有的可能有多个,例如:

enter image description here

目前,我的代码遍历此列,用逗号分隔名称,然后将它们单独输入到一个新范围中,如下所示:

enter image description here

然后我使用唯一名称的集合并将它们输入到最终所需的列表中。名称必须出现三次,空行,接下来的三行是下一个名称,依此类推。最后应该是这样的:

enter image description here

目前我的代码如下

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/

相关文章:

java - java方法中int[]输入正确吗?

excel - 如何在 Excel 中获取显示值而不是实际值?

vba - 使用以编程方式添加的宏从工作表写入另一个工作表

regex - Excel VBA 正则表达式 : Format cell to Bold if starts with three spaces

excel - 使用Excel的查找和按2个字符串进行搜索

excel - 变量名称不匹配但仍然有效

arrays - Coldfusion - 如何遍历结构数组并动态打印出所有 KEY 值?

php - 来自字符串的多维数组

arrays - 快速索引越界

javascript - 通过 Javascript 在 Excel 中打开 HTML 页面