将整个列(列中的每个值)放入数组中?

9

我正在制作一个宏来完成一些任务。其中一项任务是从sheet2中查找与sheet1中的单元格重复的内容。给定sheet1中的columnA,sheet2中的columnB中是否有任何值匹配到sheet1中columna的任何值。

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

我考虑使用筛选功能。我知道当你筛选时,可以选择多个条件,所以如果您有一个包含20个不同值的列,在筛选器中选择5个值,它将显示该特定列中具有这5个值的行。因此,我录制了一个使用筛选器的宏,并检查了代码,我看到它使用了一个字符串数组,其中每个要搜索的值都在一个字符串数组中。是否有一种方法可以仅指定整个列并将每个值添加到字符串数组中?

先感谢您的帮助。

2个回答

19

下面有三种不同的方式来将项目加载到数组中。第一种方法速度更快,但是只是简单地将所有内容存储在列中。然而需要注意的是,这会创建一个多维数组,不能传递给AutoFilter。

方法1:

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,你上面的其余代码,但它只使用了该列中的最后一个值。 - user1759942
当筛选一组项目时,需要使用运算符:=xlFilterValues。ActiveSheet.UsedRange.AutoFilter Field:=1, Criteria1:=strArray, Operator:=xlFilterValues - Ripster
我不确定您是否可以在AutoFilter中使用第一种方法,因为它会创建一个多维数组。 - Ripster
谢谢Ripster,我同意它确实不起作用。我发布了一个我发现的解决方案,它会起作用 :) - user1759942
我进行了测试,实际上选项2完全可行。如果您没有实际激活单元格,循环列需要大约2秒钟。我从1到100,000制作了一个循环,并且每次从A1开始增量时,它会获取ActiveCell.offset(i,0)的值并在最后用messagebox显示出来,就像需要2秒钟。 - user1759942

1

不确定其他人是否会遇到这个问题,所以我想发表我找到的答案。我喜欢@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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接