Создайте именованный диапазон на основе значения в другом столбце, не включенном в диапазон - PullRequest
0 голосов
/ 11 июня 2019

У меня есть набор данных, шириной 10 столбцов, с постоянно растущим числом строк.

В столбце C у меня есть набор функций, например, «Поиск», которому будет соответствовать несколько строк; «Фильтр», которому будет соответствовать несколько строк и т. Д. Однако они могут быть в любом порядке, поэтому я мог бы иметь некоторые функции «Поиск», а затем некоторые функции «Фильтр», а затем еще некоторые функции «Поиск» ...

Мне нужно создать именованный диапазон для выбранных ячеек в столбцах D: F, где значение в C - это функция, которая мне нужна. Это может быть, например, именованный диапазон с именем «T1», который начинается с D3:F6 и, возможно, D71:F71 для всех функций «Поиск», но не для функций «Фильтр».

Я попытался использовать смещение и счет в диспетчере имен. Но в идеале мне нужно использовать VBA в моем уже существующем макросе, поэтому мне не нужно заходить и менять именованные диапазоны каждый раз, когда добавляется новая строка.

В идеале код был бы похож на ... Если в столбце C содержится слово «Фильтр», создайте именованный диапазон для трех столбцов справа от него, каждый раз, когда появляется слово «Фильтр».

Я использовал Offset and 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

Любая помощь будет принята с благодарностью. Надеюсь, я достаточно прояснил проблему.

1 Ответ

2 голосов
/ 11 июня 2019

Если я правильно понимаю, вы можете попробовать что-то вроде следующего:

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 в диапазон. В итоге у вас есть общий диапазон, который вы можете назвать как хотите.

Например, если у вас есть следующие настройки:

enter image description here

Тогда вы получите вот это:

enter image description here

Таким образом, адрес полученного диапазона будет $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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...