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

时间:2014-01-21 20:25:45

标签: vba excel-vba duplicates excel-2010 excel

所以我正在做一个宏来做一堆事情。有一件事是从sheet2中找到sheet1中的单元格重复。给定表1中的columnA,sheet2上columnB中的任何值都与columna sheet1中的任何值匹配。

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

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

提前致谢

2 个答案:

答案 0 :(得分:15)

以下是将项目加载到数组中的三种不同方法。第一种方法要快得多,但只是将所有内容存储在列中。你必须小心这一点,因为它创建了一个多维数组,而不是可以传递给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

方法2:

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

答案 1 :(得分: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