VBA:过滤列表并将结果存储为命名范围

VBA: Filtering a list and storing result as named ranges

我有以下列表:

我想制作一个 VBA 代码来过滤他们在哪个商店工作的不同名称,并将结果存储在一个命名范围中,其中包含商店的名称 - 范围是来自列出在那家商店工作的人。

例如,命名范围将是 London - 包含单元格 B2 和 B7,依此类推。

编辑:

我知道这是错误的,但我就是无法解决这个问题。 VBA 目前不是我想要的...我首先创建了一个新的命名范围列,然后继续。

Sub NamedRange()

Dim arr() As Variant

arr = Sheet1.Range("D2:D4").Value

    Dim i As Integer
    Dim j As Integer
    Dim Name As String
    Dim k1 As Range, k2 As Range

    Lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row

    i = 0

    Do While i < 4
    Name = arr(i)
    For j = 1 To Lastrow
    k1 = Match(arr(i), Cells(i, 1).Value, 0)
    k2 = Union(k1, k2)

    Next j

    Range(k2).Select
    Application.Goto Reference:=arr(i)

    Loop


End Sub

EDIT2:花了两个小时试图理解 AdvancedFilter 函数。使用 x1FilterCopy 选项使其工作,但我的整个 Excel-sheet 将以这种方式变得一团糟。有没有什么方法可以过滤并将过滤后的范围存储在变量中。天哪,VBA,你怎么变成这样了?

试试这个。

请注意,如上所述,以这种方式使用命名范围可能不是最佳方法。

最好解释一下您的最终目标(因为您可以过滤数据并从那里进行操作)。

话虽如此,这正是您要找的。

对于 B2:B10 中的每个单元格,我们将查看该值是否存在命名范围。

如果命名范围不存在,我们创建一个。

如果确实存在,我们将两个范围合并。

然后,我们可以点击我们的部门和 select 范围,获取它们的值。

复制并粘贴此宏和 运行 NameTheRanges

然后,当您单击部门时,您可以将事件代码添加到 sheet 一到 select 范围。

Sub NameTheRanges()

ClearAllNamedRanges 
Dim c As Range
For Each c In Range("B2:B10")
    If Not DoesNamedRangeExist(c.Value) Then
        c.Offset(0, -1).Name = c.Value
    Else
        Union(Range(c.Value), c.Offset(0, -1)).Name = c.Value
    End If
Next c

End Sub

Function DoesNamedRangeExist(NR As String) As Boolean
Dim checker As Range
On Error Resume Next
Set checker = Range(NR)
On Error GoTo 0
If checker Is Nothing Then
    DoesNamedRangeExist = False
Else
    DoesNamedRangeExist = True
End If
End Function

Sub ClearAllNamedRanges()
Dim NR
For Each NR In ActiveWorkbook.Names
    NR.Delete
Next
End Sub

事件代码到 select 范围(在您使用的 sheet 中 - 在我的例子中是 Sheet1):

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.CountLarge > 1 Then Exit Sub
If Not Intersect(Target, Range("E2:E4")) Is Nothing Then Range(Target.Value).Select

End Sub

单击利物浦时的结果(在单元格 E3 中)。

名称管理器结果: