Страницы: 1
RSS
VBA: задать Range с помощью переменных
 
Добрый день!
Снова нужен совет. Не могу задать Range. Есть также подозрение что я выбрал самый длинный путь и можно проще все сделать, но как - не нашел.
По задумке, сначала пользователь выделяет ячейку на активном листе, которая используется как значение поиска (этого в коде нет, поскольку несущественно) потом на другом листе массив ячеек в котором осуществляется поиск (ra) мышью.
Код
Dim ra As Range
Dim fSearchCellList As String

With Application.InputBox("Выберите массив  в котором ищем совпадения", "Где ищем?", Type:=8)
        fSearchCellList = .Parent.Name ' имя листа
        fSearchCelladr = .Address() '  диапазон в виде "$B$1:$B$27"
    End With
fSearchCelladrN = Mid(fSearchCelladr, 1, (InStr(1, fSearchCelladr, ":") - 1)) ' первая ячейка
fSearchCelladrE = Mid(fSearchCelladr, (InStr(1, fSearchCelladr, ":") + 1)) ' последняя ячейка

Set ra = Worksheets(fSearchCellList).Range("B1:B27") 'а вот тут начинаются затыки уже на этапе обращения листу

Заранее спасибо
 
Изначально не туда пошли...
Зачем вообще нужен был адрес?

Код
    Dim r As Range, ra As Range
    Set r = Application.InputBox("Выберите массив  в котором ищем совпадения", "Где ищем?", Type:=8)

    MsgBox r.Parent.Name

    Set ra = r.Parent.Range("B1:B27")    ' никаких затыков
    ra.Select
Изменено: Hugo - 02.07.2013 11:11:43
 
Hugo, небольшое дополнение. Я полагаю, что имя листа не просто так нужно, а значит для подстаховки лучше и его активировать, чтобы не получить ошибку:
Код
Dim r As Range, ra As Range
Set r = Application.InputBox("Выберите массив  в котором ищем совпадения", "Где ищем?", Type:=8)
r.Parent.Select
Set ra = r.Parent.Range("B1:B27")    ' никаких затыков
ra.Select
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Ну select (как и MsgBox) только для демонстрации, в задаче вероятно можно обойтись без селектов.
А активировать лист не стал ещё и по той причине, что этот лист в данном случае и так активный - в него ведь только что тыкали мышью  :)
Изменено: Hugo - 02.07.2013 11:43:06
 
Смысл в том, что если
Set r = Application.InputBox(...
то мы имеем объект, с которым можем работать.
Можно попросить указать например верхнюю левую ячейку диапазона, и далее оффсетами или ресайзом получить нужный диапазон.
Или попросить выделить сразу весь диапазон.
Вот например демонстрация - выделите область:

Код
    Set r = Application.InputBox("Выберите массив  в котором ищем совпадения", "Где ищем?", Type:=8)

    r(1).Select
        MsgBox r.Parent.Name
    r.Select

До MsgBox будет выделена одна ячейка, затем вся выбранная область.
 
Ещё уточнение.
Application.InputBox("...", "...", Type:=8)  не работает на листах, где есть с УФ формулой и на других листах.
Поэтому я применяю такой "протез", подсказанный кем-то на старой Планете, кажется где-то ЗДЕСЬ
Код
Function RangeInputBox(Optional Prompt$ = "Выделите на листе диапазон ячеек", Optional Title$ = "Выбор диапазона данных" ;)  As Range
' замена Application.InputBox("...", "...", Type:= 8) , не работающего на других листах и листах с УФ формулой
 Dim sFormula$: sFormula = Application.InputBox(Prompt:=Prompt, Title:=Title, Default:="=" & Selection.Address, Type:=0)
 On Error Resume Next
 Set RangeInputBox = Range(Trim(Mid(Application.ConvertFormula(sFormula, xlR1C1, xlA1, True), 2)))
 On Error GoTo 0
End Function
Изменено: Alex_ST - 02.07.2013 12:04:13
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Hugo, я пытался сослаться на Range неактивного листа таким способом
Код
Set ra = Worksheets(fSearchCellList).Range(fSearchCelladr)
 
Зачем?
 
Hugo, мне надо было указать каким-то образом область в которой будет осуществляться поиск
примерно вот так
Код
For Each cel In Range(Cells(fCellRow, fCellCol), Cells(fCellLastRow, fCellCol)) 'перебор ячеек на активном листе
       na = ra.Find(cel).Offset(0, 2)

т.е. на активной странице берется диапазон ячеек, и каждая ячейка из диапазона сравнивается с массивом на неактивном листе
Изменено: jfd - 02.07.2013 13:49:13
 
Так когда юзер ткнул мышью, сразу и задавайте переменную этого обьекта, эту ra. Зачем вообще эти адреса?
Хотя вероятно сработает и с адресами - только зачем? Тестить/проверять лениво...
Изменено: Hugo - 02.07.2013 14:22:23
 
спасибо всем кто принял участие
Страницы: 1
Наверх