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
中)。
名称管理器结果:
我有以下列表:
我想制作一个 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
中)。
名称管理器结果: