Страницы: 1
RSS
Выделение видимого диапазона по условию, vba, macor
 

Доброго дня.
Частично вопрос относится в этой теме: “Почему ошибка "Compile error. Object required", VBA, Error”
Помогите пожалуйста разобраться вот в таком коде. Зада "начать" выделять диапазон в соответствии со значениями строки и колонки. Файл прикрепил. Синем цветов (a, b) соответственно определяемая строка и колонка.

Спасибо большое.

Код
Sub test()
    Dim lastrow As Long
    Dim c As Range
    Dim rng As Range
    
    With ThisWorkbook.Worksheets("Sheet2")
        lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
        For Each c In .Range("A1:A" & lastrow)
            If (c.Text) = "a" Then 'find this value in row
                If rng Is Nothing Then
                    Set rng = .Range("A" & c.Row).Resize(, 12) '12 = L column
                End If
            End If
        Next c
    End With
    If Not rng Is Nothing Then rng.Select
    Range(Selection, Selection.End(xlDown)).Select 'now selected all rows till the end of worksheet, but need to select viseble row
End Sub
 
Цитата
Alex D написал:
выделять диапазон в соответствии со значениями строки и колонки.
вот вообще ни фига не понятно, чего надо. Честно.
Поэтому дальше только предположения, возможно, неверные.
Код
If rng Is Nothing Then
    Set rng = .Range("A" & c.Row).Resize(, 12) '12 = L column
End If

И? Т.е. здесь сохраняется первый диапазон, отвечающий условию. Точно это надо или все строки с "а" в столбец А?
Код
If rng Is Nothing Then
    Set rng = .Range("A" & c.Row).Resize(, 12) '12 = L column
else
    Set rng = Union(rng.Range("A" & c.Row).Resize(, 12))
End If

Или цель найти первое совпадение и выделить все от него до конца диапазона? Почему тогда нет выхода из цикла? Зачем весь столбец данных ворошить после того как нашли уже?
Как следствие с этой строкой еще непонятнее:
Код
Range(Selection, Selection.End(xlDown)).Select

какая роль и что она должна делать?

В общем объясните сначала так, чтобы понять можно было задачу.
Ах, да. Если опираться тупо на сам код, а не на объяснение, то возможно, он должен выглядеть так:
Код
Sub test()
    Dim lastrow As Long
    Dim c As Range
    Dim rng As Range
     
    With ThisWorkbook.Worksheets("Sheet2")
        lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
        For Each c In .Range("A1:A" & lastrow)
            If (c.Text) = "a" Then 'find this value in row
                If rng Is Nothing Then
                    Set rng = .Range("A" & c.Row).Resize(, 12) '12 = L column
                    Exit For 'все нашли, дальше не ищем
                End If
            End If
        Next c
        If Not rng Is Nothing Then
            rng.Resize(lastrow - rng.Row + 1).Select
        End If
    End With
End Sub
Изменено: Дмитрий(The_Prist) Щербаков - 06.02.2020 16:40:26
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал: Честно.
Спасибо за честность. Попробую переформулировать.
Стоит задача выделать нужный диапазон. В столбце А, есть конкретное значение в моем случае это Cell("A19") = "a". От отчета к отчёту строка меняется. Таким образом, мы выбираем нужную нам строку. Далее. В столбце L, Cell("L2") = "b" есть второе значение, по которому определяется нужный столбец.
Задача выделить все "видимые значения", то есть все что ниже строки 19 и все что не выходит за столбец L.
Старался объяснить. Спасибо.
Изменено: Alex D - 06.02.2020 17:15:19
 
Ну так а код мой в конце попробовали или нет? Он делает ровно то, что надо. Другой вопрос в том, что у Вас данные кое-как записаны и lastrow неясно по какому вообще принципу определить для выделения. Если по столбцу D, скажем - то выделится все нормально, до конца. А если данные могут меняться и не факт, что макс. заполненная ячейка будет в столбце D - надо понимать, есть ли еще где-то данные. Т.к. можно через UsedRange определить:
Код
Sub test()
    Dim lastrow As Long
    Dim c As Range
    Dim rng As Range
      
    With ThisWorkbook.Worksheets("Sheet2")
        lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
        For Each c In .Range("A1:A" & lastrow)
            If (c.Text) = "a" Then 'find this value in row
                If rng Is Nothing Then
                    Set rng = .Range("A" & c.Row).Resize(, 12) '12 = L column
                    Exit For 'все нашли, дальше не ищем
                End If
            End If
        Next c
        If Not rng Is Nothing Then
            rng.Resize((.UsedRange.Row + .UsedRange.Rows.Count - 1) - rng.Row + 1).Select
        End If
    End With
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Надо выделить диапазон Вi:Lj, в котором i - номер строки с первым найденным а по столбцу В, а j - номер последней заполненной строки по столбцу А?

Вы извините, что я так сразу прям. :)
Кому решение нужно - тот пример и рисует.
 
Цитата
Пытливый написал:
Вi:Lj,
Спасибо за коментарий.
Нужно выделить Ai, Lj (в прикрепленном примере это видно выделеным желтым цветом)
 
Цитата
все что ниже строки 19 и все что не выходит за столбец L
Код
Sub DiapazonSelect()
Dim iLastRow As Long
Dim a_Row As Long
Dim b_Col As Long
  iLastRow = Cells(Rows.Count, "D").End(xlUp).Row
  a_Row = Columns(1).Find("a", , xlValues, xlWhole).Row
  b_Col = Rows(2).Find("b", , xlValues, xlWhole).Column
  Range(Cells(a_Row, 1), Cells(iLastRow, b_Col)).Interior.ColorIndex = 6
End Sub
 
Kuzmich, а что делать, когда в D тоже не будет значений, но они будут в Е? :) Я на это заострял внимание, но ТС как-то не хочет отвечать как правильно определить нижнюю границу таблицы(по каким критериям). Поэтому и код у меня ориентируется на последнюю ячейку UsedRange. И в приложенном файле вполне корректно код выполняется.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
а что делать, когда в D тоже не будет значений
Определяем последнюю строку так
Код
iLastRow = Range("A:L").Find("*", Range("A1"), xlValues, xlWhole, xlByRows, xlPrevious).Row
 
Kuzmich, и опять же - а что если на листе ниже еще таблица?
Я же не про неправильность Вашего решения говорю, а про то, что пока ТС не озвучит условие для определения нижней границы чем-то кроме "там выделено желтым" - мы решения задачи нормально не предложим :)
Изменено: Дмитрий(The_Prist) Щербаков - 06.02.2020 18:27:16
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
ТС
Спасибо большое за комментарии и предложение варианты. Тестировал.

С нижней границе, все так. Она так же меняется. Все верно, нормально задай вопрос, нормально ответят. Моя вина. Так же пытался понять как
в предложенном Вами решении определять нужную колонку и пристроить решение @Kuzmich
Пока ничего не придумал...
Код
Sub test()    Dim lastrow As Long
    Dim c As Range
    Dim rng As Range
       
    With ThisWorkbook.Worksheets("Sheet2")
        lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
        For Each c In .Range("A1:A" & lastrow)
            If (c.Text) = "a" Then 'find this value in row
                If rng Is Nothing Then
                    Set rng = .Range("A" & c.Row).Resize(, 12) 'я говорю про эту строку кода
                    Exit For 'все нашли, дальше не ищем
                End If
            End If
        Next c
        If Not rng Is Nothing Then
            rng.Resize((.UsedRange.Row + .UsedRange.Rows.Count - 1) - rng.Row + 1).Select
        End If
    End With
End Sub
 
Код
Sub test()
    Dim lastrow As Long,b_Col as long
    Dim c As Range
    Dim rng As Range
        
    With ThisWorkbook.Worksheets("Sheet2")
        lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row
        b_Col = .Rows(2).Find("b", , xlValues, xlWhole).Column
        For Each c In .Range("A1:A" & lastrow)
            If (c.Text) = "a" Then 'find this value in row
                If rng Is Nothing Then
                    Set rng = .Range("A" & c.Row).Resize(, b_Col) 'я говорю про эту строку кода
                    Exit For 'все нашли, дальше не ищем
                End If
            End If
        Next c
        If Not rng Is Nothing Then
            rng.Resize((.UsedRange.Row + .UsedRange.Rows.Count - 1) - rng.Row + 1).Select
        End If
    End With
End Sub
Изменено: Дмитрий(The_Prist) Щербаков - 06.02.2020 20:09:33
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
@Дмитрий(The_Prist) Щербаков Спасибо большое. Тестировал. Все отлично подошло.
@Пытливый Спасибо большое за помощь
Страницы: 1
Наверх