0

我有一个数据集,10 列宽,行数不断增加。

在 CI 列中有一组特征,例如“搜索”将有几行与之对应;“过滤器”将有几行与之对应,依此类推。但是,这些可以按任何顺序排列,所以我可以有一些“搜索”功能,然后是一些“过滤器”功能,然后是更多“搜索”功能...

我需要为 D:F 列中的选定单元格创建一个命名范围,其中 C 中的值是我需要的功能。例如,这将是一个名为“T1”的命名范围,它D3:F6可能来自D71:F71所有“搜索”功能,但不是“过滤”功能。

我尝试在名称管理器中使用偏移和计数。但理想情况下,我需要在我已经存在的宏中使用 VBA,这样我就不需要在每次添加新行时都进入并更改命名范围。

理想情况下,代码应该是... 如果列 C 包含单词“Filter”,则每次出现单词“Filter”时,为其右侧的三列创建一个命名范围。

我在名称管理器中使用了 Offset 和 Count:

=OFFSET(Features!$D$3, 0, 0, COUNTA(Features!$D$3:$D$9), COUNTA(Features!$D$3:$F$3))

Sub mySub()

    Dim Features As Worksheet
    Dim myNamedRange As Range

    Dim myRangeName As String
    Set Features = ThisWorkbook.Worksheets("Search")

    If Range.("C") is "Search"
    Set mRangeName= myWorksheet.Range("D:F")

    myRangeName = "Search"

    ThisWorkbook.Names.Add Name:=Search, RefersTo:=myNamedRange

End Sub

任何帮助将不胜感激。我希望我已经足够澄清了这个问题。

4

1 回答 1

2

如果我理解正确,那么您可以尝试以下操作:

Sub test()
Dim featuresRng As Range
Dim rng As Range
Dim sht As Worksheet
Dim counter As Long
Dim cell As Range

Set sht = ThisWorkbook.Worksheets("Name of your worksheet")
Set featuresRng = sht.Range(sht.Range("C1"), sht.Range("C" & sht.Rows.Count).End(xlUp)) 'dynamically set the range of features
counter = 0 'this counter will help us avoid Union(Nothing, some range), which would give an error

For Each cell In featuresRng 'loop through the range of features
    If cell.Value = "search" Then
        counter = counter + 1
        If counter = 1 Then
            Set rng = sht.Range(cell.Offset(0, 1), cell.Offset(0, 3))
        Else
            Set rng = Union(rng, sht.Range(cell.Offset(0, 1), cell.Offset(0, 3))) 'build the range
        End If
    End If
Next cell
Debug.Print rng.Address
sht.Names.Add "Something", rng
End Sub

上面的代码循环遍历特征范围,每当找到值为“搜索”的单元格时,它就会在一个范围内添加相应的 D、E 和 F 单元格。最后,您有一个总范围,您可以随意命名。

例如,如果您有以下设置:

在此处输入图像描述

那么你会得到这样的:

在此处输入图像描述

所以结果范围地址将是$D$1:$F$2,$D$8:$F$8,$D$10:$F$12,$D$15:$F$19

现在,如果您希望每次找到关键字时都创建单独的命名范围,您可以相应地修改代码,如下所示:

Sub test2()
Dim featuresRng As Range
Dim rng As Range
Dim sht As Worksheet
Dim counter As Long
Dim cell As Range

Set sht = ThisWorkbook.Worksheets("Name of your worksheet")
Set featuresRng = sht.Range(sht.Range("C1"), sht.Range("C" & sht.Rows.Count).End(xlUp)) 'dynamically set the range of features
counter = 0
For Each cell In featuresRng
    If cell.Value = "search" Then
        counter = counter + 1
        Set rng = sht.Range(cell.Offset(0, 1), cell.Offset(0, 3))
        sht.Names.Add "Something" & counter, rng
    End If
Next cell

End Sub
于 2019-06-11T09:22:04.767 回答