Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: AutoFilter - необходимы номера строк Добавлено: 24.01.08 13:47  

Автор вопроса:  APS | ICQ: 234458121 
На листе создан Автофильтр (через меню). Соответственно, он устанавливает любые условия в любом количестве столбцов.
Моя задача работать только с теми строками, которые выбраны автофильтром.
Dim r As Range
Set r = ActiveSheet.AutoFilter.Range
a = r.CurrentRegion.Columns(1).SpecialCells(xlVisible).Address
c = r.CurrentRegion.Columns(1).SpecialCells(xlVisible).Count - 1
Debug.Print a, c

В а я получаю список адресов ячеек первого столбца (например, $A$2,$A$612,$A$620,$A$637), в с я получаю количество отобранных строк.
Каким образом можно получить номера отобранных строк?
Или может быть есть другое решение, как одновременно работать с отобранными данными. Для примера в столбце F хранятся адреса email, как их выдернуть оттуда для отправки почты (как отправить почту я знаю).

Ответить

  Ответы Всего ответов: 13  

Номер ответа: 1
Автор ответа:
 APS



ICQ: 234458121 

Вопросов: 38
Ответов: 107
 Профиль | | #1 Добавлено: 24.01.08 13:49
Можно конечно тупо перебирать символы переменной a в поисках запятых и т.д., выдергивая оттуда номера строк. Но больно метод какой-то идиотский. Думается, есть более простое решение.

Ответить

Номер ответа: 2
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #2
Добавлено: 24.01.08 15:56
самый прямой и не сложный (хотя и далеко не лучший ) способ это сделать - это перебрать все строки с первой строки данных и для каждой из них проверять, видимая ли строка. для строк, которые не скрыты, проделывать некоторые действия..

Ответить

Номер ответа: 3
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #3 Добавлено: 24.01.08 16:16
http://forum.sources.ru/index.php?showtopic=218316
сообщение 11

Ответить

Номер ответа: 4
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #4
Добавлено: 24.01.08 16:37
Dim r As Range
Set r = ActiveSheet.AutoFilter.Range
a = r.CurrentRegion.Columns(1).SpecialCells(xlVisible).Address
c = r.CurrentRegion.Columns(1).SpecialCells(xlVisible).Count - 1
a = "," & a
Dim MyArr() As String
MyArr = Split(a, ",$A$";)

в итоге в массиве MyArr номера строк. Останется только потом преобразовать их в числовые значения (Val)

Ответить

Номер ответа: 5
Автор ответа:
 APS



ICQ: 234458121 

Вопросов: 38
Ответов: 107
 Профиль | | #5 Добавлено: 24.01.08 18:08
Executioner - отдельное спасибо, по моему, самый простой способ.
bi-lya - к сожалению, в Вашем примере не нашел ничего полезного. Или что-то не понял.

Ответить

Номер ответа: 6
Автор ответа:
 APS



ICQ: 234458121 

Вопросов: 38
Ответов: 107
 Профиль | | #6 Добавлено: 28.01.08 15:03
К сожалению, способ Executioner не всегда подходит, т.к. в выборке могут быть адреса, идущие подряд и тогда строка адресов будет выглядеть так: $A$1:$A$2,$A$733:$A$735.
Видимо, придется все-таки перебирать все строки. Но строк несколько тысяч, интересно, сколько времени будет занимать перебор?

Ответить

Номер ответа: 7
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #7 Добавлено: 28.01.08 16:11
Ну а если сразу обрабатывать?
Set r = ActiveSheet.AutoFilter.Range
a = r.CurrentRegion.Columns(1).SpecialCells(xlVisible).Address
MyArr = Split(a, ",";)
For Each i In MyArr
  Set rr = Range(i)
  For Each ii In rr
    MsgBox ii.Value
  Next
Next

Ответить

Номер ответа: 8
Автор ответа:
 APS



ICQ: 234458121 

Вопросов: 38
Ответов: 107
 Профиль | | #8 Добавлено: 30.01.08 17:35
Ну а если сразу обрабатывать?

Ты посмотри мое сообщение 6. При таком выборе данных
MyArr = Split(a, ",";)
работает некорректно.
Я сделал по другому, а именно перебором. Строк пока пару тыщ, комп на это тратит меньше секунды, даже незаметно. Пробовол перебирать вообще все строки на листе, уходит 10 сек. - не критично. Конечно, всегда хочется сделать красиво, но не всегда на это есть время.
Function RowNumbers()
    
    Dim MyArr() As Long
    
    With Worksheets("Total";).UsedRange
        endpoint = .Cells(.Rows.Count, .Columns.Count).Row
    End With

    For i = 3 To endpoint
        r = Worksheets("Total";).Rows(i).Hidden
        If r = False Then
            n = n + 1
            ReDim Preserve MyArr(n) As Long
            MyArr(n) = i
            Debug.Print i
        End If
    Next
    
End Function

Ответить

Номер ответа: 9
Автор ответа:
 night-roll



Вопросов: 36
Ответов: 326
 Профиль | | #9 Добавлено: 31.01.08 02:41
Моя задача работать только с теми строками, которые выбраны автофильтром.

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

сделал бы вот так...
    Dim r As Range
    Dim a As String, c As Long
    Dim T As Range
    Set r = ActiveSheet.AutoFilter.Range.CurrentRegion.Columns(1).SpecialCells(xlVisible)
        With r
            a = .Address
            c = .Count - 1
        End With
    Debug.Print a, c
    
    For Each T In r
        Debug.Print T.Row;
    Next

Ответить

Номер ответа: 10
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #10 Добавлено: 31.01.08 02:51
APS, почему вы решили, что не корректно? Там как раз и "разбиваются" все адреса типа "$A$733:$A$735"

Ответить

Номер ответа: 11
Автор ответа:
 night-roll



Вопросов: 36
Ответов: 326
 Профиль | | #11 Добавлено: 31.01.08 03:10
Там как раз и "разбиваются" все адреса типа "$A$733:$A$735"
to bi-lyaтам разбиваются диапазоны!

Ответить

Номер ответа: 12
Автор ответа:
 APS



ICQ: 234458121 

Вопросов: 38
Ответов: 107
 Профиль | | #12 Добавлено: 31.01.08 09:46
Отдельное спасибо. Вот он самый простой и изящный способ.

Ответить

Номер ответа: 13
Автор ответа:
 bi-lya



Вопросов: 1
Ответов: 125
 Профиль | | #13 Добавлено: 31.01.08 14:01
to night-roll, там "разбиваются" адреса диапазонов - я имел ввиду свой пример в 7 сообщении, эту часть
For Each i In MyArr
  Set rr = Range(i)
  For Each ii In rr
    MsgBox ii.Value
  Next
Next
;)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам