Создание динамического диапазона на основе значения ячейки

#vba #excel

#vba #excel

Вопрос:

Я новичок в VBA и пытаюсь создать динамические диапазоны на основе значений ячеек, содержащихся в столбце A. На одном листе много диапазонов, и размер каждого диапазона будет меняться, поэтому я не могу идентифицировать ячейку как отправную точку для диапазона, поскольку она изменится. У меня есть список разных имен диапазонов в столбце A листа 2, который я могу использовать для создания разных диапазонов, если это необходимо. Я думаю, что лучший способ сделать это — использовать find, но опять же, я очень новичок в этом. Вот что у меня есть до сих пор (не так много, я знаю). Любая помощь приветствуется! Спасибо!

  Sub NameRange()

Dim rngselect As Range, FinalRange As Range, cell As Range
Dim ws As Worksheet

Set ws = Worksheets("OOE")
Set rngselect = ws.Range("$A:Z")

ws.Columns(i, 1).Find(California).Select
.Name = "Cali"

End Sub
  

Комментарии:

1. Какие значения находятся в столбце A? То есть, как они указывают вам, какой диапазон вы хотите?

2. Это имена, такие как Калифорния, средний Запад. Он указывает категорию для данных в остальной части строки. Это отвечает на ваш вопрос?

3. Если California является строкой, а не переменной, она должна быть записана как "California"

4. О, так вы хотите создать именованные диапазоны? Я неправильно понял и подумал, что вы хотите ввести строки диапазона в A, чтобы помочь вам определить диапазон like A1:D10 .

5. Да, это правильно, Кайл. Извините за путаницу!

Ответ №1:

Я делал это раньше, и это не так просто, как кажется. Именованные диапазоны являются свойствами всей книги и поэтому должны быть уникальными. VBA НЕ выдаст ошибку, если вы измените диапазон имени (и не уведомит вас).

С учетом сказанного, — не выбирайте диапазон, в этом нет необходимости. — поскольку вы ограничены столбцом A, используйте цикл, если найденное значение находится в столбце B

 ' Worksheet with names
Dim name_ws as Worksheet
' Assuming you're worksheet with the names is in the same workbook and named "Names"
Set name_ws = ThisWorkbook.Worksheets("Names")

' Find might be better but I haven't had my coffee so you'll get the double loop
for j = 1 to name_ws.Cells.SpecialCells(xlCellTypeLastCell).Row
   for i = 1 to ws.Cells.SpecialCells(xlCellTypeLastCell).Row
      if ws.Cell(i, 1) = name_ws.Cells(j, 2) then _
         Range(ws.Cell(i,1), ws.Cell(i, 26)).Name = name_ws.Cells(j, 1)
   next i
next j
  

Пожалуйста, обратите внимание: ws — это ваша переменная, и вы не указываете начальную и конечную ячейки вашего именованного диапазона в вопросе, поэтому я просто перешел на 26 ячеек.

Пожалуйста, обратите внимание: я предполагаю, что столбец B листа с именами содержит переменную поиска, а столбец A содержит имя, которое вы хотите использовать

Комментарии:

1. Спасибо J Reid. Я получил следующую ошибку: «Ошибка компиляции: метод элемента данных не найден». Есть ли также способ указать код на другой лист, который содержит каждое имя, чтобы он создавал диапазоны с помощью этого вместо копирования этого кода и изменения имени для каждого диапазона?

2. Привет, Эшли, я отредактировал код. Следовало добавить новый, потому что мне интересно узнать об этой «ошибке компиляции». Вы сохранили набор ws = Worksheets(«OOE»)???

3. На самом деле я только что понял, что, похоже, он заменяет имя каждый раз до последней строки. Таким образом, после завершения макроса единственной именованной строкой является последняя. Есть идеи о том, почему это происходит?

4. Можете ли вы опубликовать скриншот своих данных?

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