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

Vba 是否将整列(列中的每个值)放入数组?,vba,excel,duplicates,excel-2010,Vba,Excel,Duplicates,Excel 2010,所以我在做一个宏来做很多事情。一件事是在sheet2的sheet1中找到重复的单元格。给定表1中的A列,表2中B列的任何值是否与表1中A列的任何值匹配 我知道有删除重复项的方法,但我只想标记它们,而不是删除 我在想过滤的问题。我知道过滤时可以选择多个条件,因此,如果有一列包含20个不同的值,可以在过滤器中选择5个值,它将为特定列显示包含这5个值的行。所以我记录了一个宏,检查了代码,我发现它使用了一个字符串数组,其中每个要搜索的值都在一个字符串数组中。有没有办法只指定整个列并将每个值添加到字符串数

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

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

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


提前感谢

这里有三种不同的方法将项目加载到数组中。第一种方法速度快得多,但只是将所有内容存储在列中。不过,您必须小心,因为它创建的多维数组不能传递给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()指定一个变量


我不确定是否有其他人会有这个问题,所以我想我会把我找到的答案贴出来。我喜欢@Ripster发布的数组解决方案(谢谢,它几乎成功了),但在这种情况下它不会真正起作用。我正在处理的是一个大数据表,其中有一个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()
引用或
范围(cells(),cells())
类引用进行筛选


我祝愿每个人在他们未来的Endevor中好运!再次感谢@ripster

,因此第一个是我需要使用的,我正在处理大量数据(目前我的测试文件有50000行,但我被告知它们越来越大)因此,逐行处理需要很长时间。有没有一种方法可以将其用于筛选功能?我尝试在代码中插入以下行:
ActiveSheet.Range(“$J$1:$J$59770”).AutoFilter字段:=1,Criteria1:=strArray
您的其余代码在上面,但它只使用列中的最后一个值。运算符:=xlFilterValues是筛选项目数组时必需的。
ActiveSheet.UsedRange.AutoFilter字段:=1,Criteria1:=strArray,运算符:=xlFilterValues
我不确定您是否可以使用第一种方法使用自动过滤器是因为它创建了一个多维数组。多亏了ripster,我同意它并没有真正起作用。我发布了一个我发现有效的解决方案:)我做了测试,实际上选项2完全有效。如果你没有真正激活细胞,那么在一列中循环大约需要2秒钟。我做了一个从1到100000的循环,从A1开始,每次递增,它都会从ActiveCell.offset(I,0)和MessageBox中获取值,然后在末尾加上2秒
`Selection.AutoFilter
ActiveSheet.Range("$C$1:$C$12").AutoFilter Field:=1, Criteria1:=RGB(156, 0 _
    , 6), Operator:=xlFilterFontColor`