#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. К сожалению, я не могу, так как это чувствительно. Я думаю, проблема в том, что у вас не может быть нескольких диапазонов с одним и тем же именем, поэтому каждый раз, когда функция выполняет цикл, она просто перезаписывает предыдущий диапазон с этим именем?