如何在VBA中定义具有重复值的范围的名称?

时间:2015-04-17 02:44:59

标签: vba excel-vba duplicates excel

我想知道如何为具有重复值的范围定义名称,并使其自动运行整个表。请参阅下表。

    A       B
1   CODE    Display
2   100     000
3   100     000
4   100     010
5   100     020
6   100     030
7   100     100
8   110     000
9   110     010
10  110     020
11  110     030
12  110     100
13  110     101
14  110     200
15  110     204
16  110     208
17  110     209

现在,我知道我可以使用Names.Add方法来定义。但是,我的问题是能够获取 A列中重复值的名称范围,如代码段所示。

我想将范围B2:B7 的名称定义为“t_100”。我能想到的是从A2:A7,偏移1列获取地址范围,然后使用Names.Add方法引用B2:B7。由于A2:A7范围仅包含“100”,因此它引出了如何获得连续重复值范围的问题。

这是我最初的想法。

1 个答案:

答案 0 :(得分:0)

过滤已知值然后引用.SpecialCells(xlCellTypeVisible将是一个很好的方法,可以将具有重复列A值的单元格聚集在一起。计数以查看当您沿着列向下移动时是否有任何特定值是该值的第一次出现将确保您不会不必要地重复操作。

Sub t_000_name_table()
    Dim rw As Long, val As Variant
    With ActiveSheet
        With .Cells(1, 1).CurrentRegion
            .AutoFilter
            For rw = 2 To .Rows.Count
                val = .Cells(rw, 1).Value
                If Not CBool(Application.CountIf(.Cells(1, 1).Resize(rw - 1, 1), val)) Then
                    .AutoFilter field:=1, Criteria1:=val
                    With .Offset(1, 1).Resize(.Rows.Count - 1, 1)
                        .SpecialCells(xlCellTypeVisible).Name = Format(val, "\t\_000")
                    End With
                    .AutoFilter field:=1
                End If
            Next rw
            .AutoFilter
        End With
    End With
End Sub

我使用了一个简写名称声明语句,它严重依赖默认值。它应该作为工作簿范围绝对单元格范围寻址进入引用:。如果您希望更改范围或其他属性,可以使用Name Object .Add的MSDN VBA参考。

这也适用于非连续范围。