На листе создан Автофильтр (через меню). Соответственно, он устанавливает любые условия в любом количестве столбцов.
Моя задача работать только с теми строками, которые выбраны автофильтром.
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, как их выдернуть оттуда для отправки почты (как отправить почту я знаю).
Можно конечно тупо перебирать символы переменной a в поисках запятых и т.д., выдергивая оттуда номера строк. Но больно метод какой-то идиотский. Думается, есть более простое решение.
самый прямой и не сложный (хотя и далеко не лучший ) способ это сделать - это перебрать все строки с первой строки данных и для каждой из них проверять, видимая ли строка. для строк, которые не скрыты, проделывать некоторые действия..
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)
К сожалению, способ Executioner не всегда подходит, т.к. в выборке могут быть адреса, идущие подряд и тогда строка адресов будет выглядеть так: $A$1:$A$2,$A$733:$A$735.
Видимо, придется все-таки перебирать все строки. Но строк несколько тысяч, интересно, сколько времени будет занимать перебор?
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
Ты посмотри мое сообщение 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
Моя задача работать только с теми строками, которые выбраны автофильтром.
Я, конечно, мало понимаю эти автофильтры, но...
Каким образом можно получить номера отобранных строк?
сделал бы вот так...
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