【问题标题】:Create a named range based on a value in another column not included in range根据未包含在范围内的另一列中的值创建命名范围
【发布时间】:2019-06-11 08:15:58
【问题描述】:

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

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

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

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

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

我在名称管理器中使用了 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

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

【问题讨论】:

    标签: excel vba


    【解决方案1】:

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

    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
    

    【讨论】:

    • 这绝对是完美的,非常感谢!也感谢您的解释,我相信我最终会在 VBA 中再次使用动态范围。
    • @PKen 很高兴我能帮上忙! :)
    • 另一个快速的问题?如果我想根据两个条件形成一个范围,我可以使用相同的方法吗?
    • @PKen 当然。只需将您的条件与ANDOR 或任何其他逻辑运算符的任意组合结合起来,并相应地调整if - then 语句。当然,您可能需要根据您想要做的进一步修改上面的代码。尽力而为,如果做不到,请发布一个新问题;)
    • 嗨@Stavros Jon :) 我发布了一个新问题 - 很抱歉打扰你,但你以前很有帮助! stackoverflow.com/questions/56559947/…
    猜你喜欢
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多