【问题标题】:Put entire column (each value in column) in an array?将整列(列中的每个值)放入数组中?
【发布时间】:2014-02-11 15:39:21
【问题描述】:

所以我正在制作一个宏来做很多事情。一件事是从 sheet2 中找到 sheet1 中的单元格重复项。给定工作表 1 中的列 A,是否工作表 2 上的列 B 中的任何值都与工作表 1 中的任何值相匹配。

我知道有一个删除重复项,但我只想标记它们,而不是删除。

我在想一些关于过滤的事情。我知道当你过滤时你可以选择多个条件,所以如果你有一列有 20 个不同的值,你可以在过滤器中选择 5 个值,它将显示特定列的具有这 5 个值的行。所以我记录了一个宏,并检查了代码,我看到它使用了一个字符串数组,其中要搜索的每个值都在一个字符串数组中。有没有办法只指定一整列并将每个值添加到字符串数组中?

提前致谢

【问题讨论】:

    标签: vba excel duplicates excel-2010


    【解决方案1】:

    以下是将项目加载到数组中的三种不同方法。第一种方法要快得多,但只是将所有内容存储在列中。不过,您必须小心这一点,因为它会创建一个多维数组,该数组不能传递给 AutoFilter。

    方法一:

    Sub LoadArray()
        Dim strArray As Variant
        Dim TotalRows As Long
    
        TotalRows = Rows(Rows.Count).End(xlUp).Row
        strArray = Range(Cells(1, 1), Cells(TotalRows, 1)).Value
    
        MsgBox "Loaded " & UBound(strArray) & " items!"
    End Sub
    

    方法二:

    Sub LoadArray2()
        Dim strArray() As String
        Dim TotalRows As Long
        Dim i As Long
    
        TotalRows = Rows(Rows.Count).End(xlUp).Row
        ReDim strArray(1 To TotalRows)
    
        For i = 1 To TotalRows
            strArray(i) = Cells(i, 1).Value
        Next
    
        MsgBox "Loaded " & UBound(strArray) & " items!"
    End Sub
    

    如果您提前知道这些值并且只想将它们列出在一个变量中,您可以使用 Array() 分配一个变体

    Sub LoadArray3()
        Dim strArray As Variant
    
        strArray = Array("Value1", "Value2", "Value3", "Value4")
    
        MsgBox "Loaded " & UBound(strArray) + 1 & " items!"
    End Sub
    

    【讨论】:

    • 所以第一个是我需要使用的,我正在处理大量数据(目前我的测试文件有 50,000 行,但我被告知它们变得更大)所以它将需要很长时间才能逐行进行。有没有办法可以将它与过滤功能一起使用?我尝试在我的代码中加入以下行:ActiveSheet.Range("$J$1:$J$59770").AutoFilter Field:=1, Criteria1:=strArray,其余代码在上面,但它只使用列中的最后一个值。
    • Operator:=xlFilterValues 在筛选项目数组时是必需的。 ActiveSheet.UsedRange.AutoFilter Field:=1, Criteria1:=strArray, Operator:=xlFilterValues
    • 我不确定您是否可以将第一种方法与 AutoFilter 一起使用,因为它会创建一个多维数组。
    • 感谢 ripster,我同意它并没有真正起作用。我发布了一个我发现可行的解决方案:)
    • 我做了测试,实际上选项 2 完全有效。如果您实际上没有激活单元格,则循环遍历一列需要大约 2 秒。我做了一个从 1 到 100,000 的循环,每次递增时从 A1 开始,它从 ActiveCell.offset(i,0) 中获取值并在最后将它的消息框出来,你喜欢 2 秒
    【解决方案2】:

    不确定其他人是否会遇到这个问题,所以我想我会发布我找到的答案。我喜欢@Ripster 发布的数组解决方案(感谢这一点,它几乎可以工作),但在这种情况下它不会真正工作。我正在处理的是一张带有 1 个 ID 列的大数据表,我想检查其他表以查看该表中是否有重复项(使用 ID 列)。不过不要删除,只是标记,这样我就可以检查出来了。可能有超过 50K 行循环遍历每一行需要很长时间。

    所以,我发现我可以做的是将 ID 列从另一张表复制到主表中,并使用条件格式选项以某种颜色标记重复项。 (它会标记两列中的行)然后我可以按颜色过滤列,只显示我用来标记重复项的颜色。如果我以编程方式将一列添加到我正在检查行号的工作表中,我什至可以将该列包含在主工作表中,这样当我过滤颜色时,我可以看到它们在工作表中的哪些行。

    之后,我可以录制并调整一个宏,以便为我不太喜欢编程的同事自动执行此操作

    非常感谢!


    编辑 - 添加代码

    选择要比较的列后,这里是用红色文本标记重复项且不填充的代码:

      Selection.FormatConditions.AddUniqueValues
        Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
        Selection.FormatConditions(1).DupeUnique = xlDuplicate
        With Selection.FormatConditions(1).Font
            .Color = -16383844
            .TintAndShade = 0
        End With
        Selection.FormatConditions(1).StopIfTrue = False
    

    然后,由于两列都标记了重复项,因此您选择您实际要检查的列,然后是要过滤的代码:

    `Selection.AutoFilter
    ActiveSheet.Range("$C$1:$C$12").AutoFilter Field:=1, Criteria1:=RGB(156, 0 _
        , 6), Operator:=xlFilterFontColor`
    

    (在我的测试中,我使用 c 列作为要过滤的列,可以以编程方式使用 cells() 引用或 range(cells(), cells()) 类型的引用

    祝大家在未来的事业中一切顺利!再次感谢@ripster

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多