【问题标题】:How to use VBA dictionary to store discontinuous range如何使用 VBA 字典存储不连续范围
【发布时间】:2022-08-13 22:24:07
【问题描述】:

我有一些不同样本的测试数据,有些样本可能测试超过1个,如果存在,我想要每个样本的最后一个测试数据。我尝试使用数组来存储数据并将其返回到工作表,但效率不够。所以,这次我想用VBA字典来存储每个样本的数据,然后返回到目标位置。

如果每一行的范围是连续的就ok了,我可以用样本数作为key,样本的每一行数据作为value。

但是,实际上,我需要跳过不需要的列,我尝试使用联合函数,例如 dic(sample) = Union ( .Range(...), .Range(...) )。可悲的是,它没有用。我想知道如何连接不连续的范围并将这个组合范围用作字典的值。

下面是VBA代码,我可以用字典来存储B到E的列。现在想跳过F,把B存储到E,G。不知道怎么修改下面的代码来实现我的目标。

dic(sample) = .Range(.Cells(ii, 2), Cells(ii, 5))

Sub DeleteDuplicate2()

Dim tar_sheet As Worksheet, ii As Integer

Dim dic As Object, arr As Variant

Dim arr1, arr2, arr3, sample As String

Set tar_sheet = ThisWorkbook.Sheets(\"data\")

Set dic = CreateObject(\"scripting.dictionary\")

tar_sheet.Activate

With tar_sheet

    For ii = 3 To 7
    
        sample = .Cells(ii, 3).Value
        
        dic(sample) = .Range(.Cells(ii, 2), Cells(ii, 5))
    
    Next ii
    
    arr = dic.items

End With

\'arr1 = arr
\'arr2 = Application.Transpose(arr)
arr3 = Application.Transpose(Application.Transpose(arr))

tar_sheet.Cells(10, 2).Resize(dic.Count, 4) = arr3

Set dic = Nothing

End Sub

    标签: excel vba dictionary


    【解决方案1】:

    通过复制选定的行/列从源数组构建目标数组。

    Option Explicit
    
    Sub DeleteDuplicate2()
    
        Dim tar_sheet As Worksheet
        Dim r As Long, i As Long, j As Long, lastRow As Long
        Dim dic As Object, arIn, arOut, sample
        
        Set tar_sheet = ThisWorkbook.Sheets("data")
        Set dic = CreateObject("scripting.dictionary")
        
        tar_sheet.Activate
        
        lastRow = 7
        With tar_sheet
            arIn = .Range("A3:BV" & lastRow).Value2
        
            For i = 1 To UBound(arIn)
                sample = Trim(arIn(i, 3))
                dic(sample) = i
            Next
            
            ReDim arOut(1 To dic.Count, 1 To 72)
            i = 0
            For Each sample In dic.keys
                r = dic(sample)
                
                i = i + 1
                
                ' A to D
                For j = 1 To 4
                   arOut(i, j) = arIn(r, j)
                Next
                ' G -
                For j = 5 To 72
                   arOut(i, j) = arIn(r, j + 2)
                Next
            Next
        
        End With
        tar_sheet.Cells(10, 2).Resize(UBound(arOut), 72) = arOut
        
        Set dic = Nothing
    
    End Sub
    

    【讨论】:

    • 感谢您的回答。在我的实际工作中,我有 72 列。那么除了 Array.我以前用过Array,但我觉得效率不够。
    • @SamLin 多少行?我可能会使用字典来保存唯一记录的行号。然后一次直接复制一行相关列。
    • 我一次有数百个样本,我使用样本作为唯一记录的键。关键是我有 72 列,我需要跳过列 E 和 F。如果我使用数组,我必须使用“for 循环”将值存储到数组中。
    • @Samlin您的意思是 A-D,G-BV 列吗?除非您有 100 的数千行,否则数组处理通常非常有效。
    • 是的,A-D、G-BV 列。我曾尝试使用数组来存储数据并将其返回到工作表,但效率不高。也许我可以结合数组和字典。正如您之前所做的那样,我可以使用字典来存储数据,将样本编号作为键,将数组(存储不连续的列)作为值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多