Страницы: 1
RSS
Как получить номера строк выделенных ячеек с учетом фильтра для использования в макросе VBA?
 
Добрый день!
Возникла такая задача:
В таблице excel у меня содержатся данные по товарам, у каждого товара есть статус (например, new, ready). Для выбранных товаров мне нужно по значениям в определенных столбцах формировать ссылку для поиска в браузере. Я написал макрос VBA, чтобы с помощью функции Shell в нужном мне браузере открывалась ссылка, сформированная по значениям нужных столбцов из выделенной ячейки. Хотелось бы, чтобы можно было выделить сразу несколько строк и выполнить поиск сразу по всем (т.е. чтобы в браузере открылось несколько вкладок с поиском по каждому выделенному товару). Но проблема в том, что это нужно сделать только по нескольким товарам со статусом ready, а когда я включаю фильтр по статусу ready и выделяю несколько строк, то фактически при этом выделяются еще и промежуточные строки (например, статус ready находится в первой и третьей строке, если я выделяю при включенном фильтре эти строки, то автоматически выделяется еще и строка 2).
Прикрепляю пример файла (там есть макрос OpenBrowser).
Дополнительные вопросы:
- для функции Shell как будто не срабатывает аргумент WindowStyle. Я в макросе прописал значение vbMinimizedNoFocus, т.е. хочу чтобы ссылка открылась "в фоне" чтобы файл Excel остался открытым. Но все равно открывается браузер и фокус переходит туда.
- значения нужных мне столбцов для ссылки я получаю с помощью Cells(ActiveCell.Row, <Номер столбца>).Value. Но в таблицу в будущем могут быть добавлены новые столбцы и номер нужного столбца изменится. Можно ли считывать значения по названию столбца таблицы, а не по номеру (таблица "умная", т.е. отформатирована как таблица)?
Заранее спасибо.
Изменено: uv22 - 24.06.2019 17:58:35 (опечатка)
 
Вариант:    
Код
    Dim lr As Long
    Dim i As Long
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
 If Rows(i).Hidden = False Then
    MsgBox Cells(i, 2).Value
    'здесь Ваш код со ссылкой на Cells(i, 2).Value
 End If
Next i
 
Цитата
uv22 написал:
Можно ли считывать значения по названию столбца таблицы, а не по номеру (таблица "умная"
Не только можно, но и нужно.
Цитата
uv22 написал:
то автоматически выделяется еще и строка 2).
Да хоть 100. Вашему макросу это по барабану, т.к. количество ActiveCell не может быть отличным от 1.
Код
x = Cells(ActiveCell.Row, ActiveCell.ListObject.ListColumns("Name").Range.Column).Value
 
Код
Sub OpenBrowser(s$)
Dim SrchStr As String
SrchStr = "C:\Program Files\Opera\opera.exe https://yandex.ru/search/?text=" & s
'MsgBox SrchStr
Shell SrchStr, vbMinimizedNoFocus
End Sub
Sub x()
    Dim ar As Range, r As Range
    With [Таблица1].ListObject.DataBodyRange
        For Each ar In .SpecialCells(xlCellTypeVisible).Areas
            For Each r In ar.Rows
                OpenBrowser Intersect(r, .ListObject.ListColumns("Name").Range)
            Next
        Next
    End With
End Sub

по поводу открытия в фоне тут, скорее всего, нужно использовать winapi
SetForegroundWindow/SetWindowPos + SetActiveWindow/SetFocus или чего еще
 
Попробовал варианты Андрей Лящук и Igor_61 - оба работают как надо (за исключением того, что происходит открытие в браузере по всем отфильтрованным строкам, а не только по выделенным из них). Вариант Igor_61 выглядит проще. Доработал его по совету RAN считыванием по названию столбца таблицы, а не по номеру. Итоговый вариант прикрепил. Насчет открытия в фоне наверно мне будет сложновато изучить WinAPI, да и не особо этот момент критичен.
Благодарю за помощь!
Изменено: uv22 - 25.06.2019 12:28:26
 
Цитата
uv22 написал:
Насчет открытия в фоне наверно мне будет сложновато изучить WinAPI
Можно так. Обратите еще, пожалуйста, внимание на вызов браузера по умолчанию (для тех, у кого не установлена Opera).
Код
#If VBA7 Then
Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
#Else
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
#End If

Sub OpenBrowser()
    Dim lr As Long
    Dim i As Long
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
        If Rows(i).Hidden = False Then
            Shell "cmd /c start https://yandex.ru/search/?text=" & Cells(i, [Таблица1].ListObject.ListColumns("Name").Range.Column).Value
        End If
    Next i
    Application.Wait Now + 3 / 24 / 3600   ' ждем 3 секунды
    SetForegroundWindow Application.hwnd   ' делаем Excel активным окном
End Sub
Изменено: sokol92 - 25.06.2019 14:01:38
Владимир
 
sokol92, проверил ваш вариант как с браузером по умолчанию, так и с Opera - чтото не срабатывает. Т.е. по прежнему фокус переходит в браузер и не возвращается в Excel. Может от версии Excel/ Windows зависит? У меня Excel 2010/ Windows 7.
Изменено: uv22 - 25.06.2019 18:14:54
 
От версии вряд ли зависит, я проверял на конфигурациях Excel 2007, Win XP и Excel 2016, Win 10. Скорее всего, за указанные в #6 три секунды браузер не успевает открыть и обработать Выши ссылки и вновь делает свое окно активным. Попробуйте изменить время паузы.
Владимир
Страницы: 1
Наверх