Определение адреса выделенного диапазона ячеек на листе Excel с помощью кода VBA. Определение номера первой и последней строки. Программное выделение диапазона.
Адрес выделенного диапазона
Для определения адреса выделенного диапазона ячеек в VBA Excel используется свойство Address объекта Selection.
Объект Selection — это совокупность всех выделенных ячеек на листе Excel. Это может быть одна ячейка, смежный или несмежный диапазон ячеек, представляющий коллекцию смежных диапазонов. Если выделение состоит из несмежного диапазона, адреса смежных диапазонов, из которых он состоит, будут перечислены через запятую.
Смежный диапазон — прямоугольная область смежных (прилегающих друг к другу) ячеек.
Несмежный диапазон — совокупность (коллекция) смежных диапазонов (прямоугольных областей смежных ячеек).
Стоит отметить: несмотря на то, что в выделенном диапазоне может содержаться много ячеек, активной может быть только одна. Она представлена объектом ActiveCell. Для определения ее адреса в коде VBA Excel также используется свойство Address.
Sub Primer1() MsgBox «Адрес выделенного диапазона: « & Selection.Address & _ vbNewLine & «Адрес активной ячейки: « & ActiveCell.Address & _ vbNewLine & «Номер строки активной ячейки: « & ActiveCell.Row & _ vbNewLine & «Номер столбца активной ячейки: « & ActiveCell.Column End Sub |
Скопируйте и запустите код на выполнение. В результате получите что-то вроде этого, зависящее от того, какие диапазоны вы выберите:
Определение адресов выделенного диапазона и активной ячейки
Выделение ячеек и диапазонов
Выделить несмежный диапазон ячеек можно следующим образом:
Sub Primer2() Range(«B4:C7,E5:F7,D8»).Select End Sub |
Как видно из примера, в адресной строке объекта Range перечисляются адреса смежных диапазонов, составляющих общий несмежный диапазон, через запятую. Выделение осуществляется методом Select объекта Range.
Определение номеров первой и последней строки
Чтобы вычислить номера первой и последней строки выделенного диапазона, будем исходить из того, что первая ячейка смежного диапазона находится на первой строке, а последняя — на последней строке выделенного диапазона.
Sub Primer3() Dim i1 As Long, i2 As Long i1 = Selection.Cells(1).Row i2 = Selection.Cells(Selection.Cells.Count).Row MsgBox «Первая строка: « & i1 & _ vbNewLine & «Последняя строка: « & i2 End Sub |
Результат будет таким, зависит от выделенного диапазона:
Номера первой и последней строки выделенного смежного диапазона
Таким же образом можно вычислить номера первого и последнего столбцов выделенного диапазона, которые можно использовать для обработки информации по столбцам.
Обратите внимание, что для несмежных диапазонов этот пример не работает.
На практике я использовал определение номеров первой и последней строк по выделенному диапазону для формирования файла загрузки данных держателей дисконтных карт на сервис отправки СМС-сообщений. Оказалось, что базу данных клиентов заполнять в таблице Excel намного удобнее, чем на портале сервиса, а для загрузки в сервис достаточно сформировать несложный файл. Заполнил новые строки, выделил их по любому столбцу, нажал кнопку и файл готов.
syt navy Пользователь Сообщений: 83 |
#1 02.11.2021 15:01:16 Доброе время суток!
Пытаюсь определить выделенные ячейки на листе «lotout»
За подсказку спасибо! |
||||
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
По вопросам из тем форума, личку не читаю. |
syt navy Пользователь Сообщений: 83 |
Спасибо. Добавил активацию данного листа. Всё теперь определяется |
Если у Вас ячейки уже выделены то я полагаю: Изменено: Семен Фадеев — 02.11.2021 15:25:32 |
|
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#5 02.11.2021 15:33:36 syt navy, здравствуйте
неправильно поняли — медведь имел ввиду, что Selection ЗАПОМНИТЬ нужно
и потом просто rng.Copy Workbooks(«NewBook»).Sheets(«NewSheet») или типа того Изменено: Jack Famous — 02.11.2021 15:34:32 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||||
БМВ Модератор Сообщений: 21378 Excel 2013, 2016 |
#6 02.11.2021 16:04:41
я имел в виду что запомнить можно, но не обязательно. все зависит от того что нужно с этим выделением сделать. По вопросам из тем форума, личку не читаю. |
||
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#7 02.11.2021 16:09:53
разумеется — если переносить на соседний лист и/или только значения Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||
syt navy Пользователь Сообщений: 83 |
#8 03.11.2021 08:32:27
Я его понял. У меня дальше активным становился другой лист, поэтому не мог обратиться к Selection. Добавил дополнительно активацию листа с выделением, и всё стало работать. А Selection я потом кидаю в коллекцию, с которой уже работаю. |
||
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#9 03.11.2021 09:13:53
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
|
Давайте посмотрим как определить событие выбора определной ячейки. Первое — это надо определить, что вообще что-то выбрали. Для этого создайте книгу. Запустите редактор VBA и щелкните на листе. Для данного листа будет создана функция SelectionChange, если ее нет, то у Вас всегда есть возможность ее выбрать. Теперь впишите код сообщения в функцию, чтобы увидеть, что происходит.
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) MsgBox Target.Address End Sub
У Вас теперь есть возможность щелкать по ячейкам конкретного листа, я еще раз повторяю и вы получите сообщение с адресом ячейки. Сообщение выбора ячейки обрабатывается локально. А что если у нас надо обрабатывать это сообшение с трех листов и желательно вместе. Для этого нужно создать модуль и в нем процедуру обработки. Я пока поместил туда просто вывод информационного окна.
Public Sub Selection_Cell(ByVal Addres As String, ByVal List As String) MsgBox Addres + " " + List End Sub
И соотвественно надо пересылать туда данный с каждого листа.
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) Selection_Cell Target.Address, Target.Worksheet.Name End Sub
Вот с этого момента можно вставлять вызов функции Selection_Cell на каждый лист в ответ на реакцию выделения.
Но это еще не все. Дело в том, что передается объект типа RANGE, то есть нет разницы передана одна ячейка или диапазон. Но при выделении диапазона внутрь него может попасть и наша ячейка. Итак, нам надо бы анализировать диапазон. Давайте договоримся, что нам надо обязательно отловить момент выделения ячейки $A$1. Вот на всех листах. У нас для этого все есть. Процедура общая, в которой есть адрес. И реакция на выделение на каждом листе. Смотрим код:
Public Sub Selection_Cell(ByVal Addres As String, ByVal List As String) On Error GoTo Ends Dim Test As Range Dim Find As Range Dim Result As Range Dim x As Integer Set Find = Range("$A$1") Set Test = Range(Addres) Set Result = Intersect(Test, Find) x = Result.Count MsgBox "$A$1" Ends: End Sub
Идея простая. Мы имеем переданный диапазон Test и нужный Find. Как узнать, что один включает другой ??? Вызовем операцию пересечения Intersect. Результатом будет диапазон, который содержит пересечение. Так вот если искомая нам ячейка в нем есть, то нормально, а если нет, то обращение к Count вызовет ошибку. Этим мы и воспользовались.
И, чуть не забыл…
Как определить выделен ли данный рейндж или нет?
Как выделить кучу областей с помощью select понятно.
А как для произвольной ячейки узнать выделена она сейчас или нет?
6 ответов
267
05 декабря 2006 года
Cutty Sark
1.2K / / 17.10.2002
Здорово, Cutty Sark!! Спасибо, буду знать!
А про ячейки можешь что-нибудь подсказать, пожалуйста?
Конечно, могу.
Давай только по порядку и поподробнее.
Предположим, что сейчас выделен диапазон А1:С10.
А у тебя диапазон B5:E8.
Какой ответ ты хочешь получить и на какой вопрос?
263
05 декабря 2006 года
koltaviy
816 / / 16.12.2004
Конечно, могу.
Давай только по порядку и поподробнее.
Предположим, что сейчас выделен диапазон А1:С10.
А у тебя диапазон B5:E8.
Какой ответ ты хочешь получить и на какой вопрос?
Он хочет узнать вделена ли конкретная ячейка или нет!!
К примеру на листе с помощью Ctrl выделено несколько ячеек/несколько диапозонов..Как узнать выделена ли ячейка, к примеру, A5??
А действительно как??
Если один диапозон — через Selection, а так — не понятно!!:confused:
267
05 декабря 2006 года
Cutty Sark
1.2K / / 17.10.2002
Он хочет узнать вделена ли конкретная ячейка или нет!!
К примеру на листе с помощью Ctrl выделено несколько ячеек/несколько диапозонов..Как узнать выделена ли ячейка, к примеру, A5??
А действительно как??
Если один диапозон — через Selection, а так — не понятно!!:confused:
Если он имеет в виду именно это, то вот так:
Код:
Sub Test()
Dim r As Range
Set r = Application.Intersect(Selection, Range(«A1»))
If r Is Nothing Then
MsgBox «Не выделена.»
Else
MsgBox «Выделена.»
End If
End Sub
263
05 декабря 2006 года
koltaviy
816 / / 16.12.2004
Точно!!:)
Не сказал бы, что это жизненно важно;), но будем знать!!
267
05 декабря 2006 года
Cutty Sark
1.2K / / 17.10.2002
Application.Intersect и Application.Union периодически пригождаются в деле.
14K
09 декабря 2006 года
Njif
29 / / 05.12.2006
Спасибо большое!
Теперь я почти что счастливый человек
Определение активных составляющих книги
Мне кажется, многие загонялись таким вопросом, как определить активную ячейку (на которой находится курсор), строку или столбец. Или же хотелось получить адрес в формате А1, В4 и т.д. Вот сегодня я и покажу, как это сделать, потому, что очень удобно, когда ты знаешь активные элементы книги.
Номер активной строки
Практически все активные элементы определяются при помощи такого слова — Active, кторое записывается перед определением активного элемента. Таким образом, номер активной строки можно вычислить следующим образом:
Sub Stroka()
s = ActiveCell.Row
MsgBox «Активная строка под номером » & s, vbInformation, «Активная строка»
End Sub
Номер активного столбца и стороки
Аналогично определению строки столбец определяется по такому же принципу, только в конце добавляется не строка, а столбец:
Sub Stroka()
s = ActiveCell.Row
b = ActiveCell.Column
MsgBox «Активная строка под номером » & s & » » & _
vbNewLine & «Активный столбец под номером » & b, vbInformation, «адрес»
End Sub
Определяем номер последней заполненной строки и столбца
Sub Last_Stroka_and_Stolbec()
‘ищем последнюю заполненную строку и столбец и выводим сообщение о номере
Stroka = ActiveSheet.Cells.Find(What:=»*», SearchDirection:=xlPrevious, _
SearchOrder:=xlByRows).Row
Stolbec = ActiveSheet.Cells.Find(What:=»*», SearchDirection:=xlPrevious, _SearchOrder:=xlByRows).Column
MsgBox «Последняя строка под номером » & Stroka & » » & _
vbNewLine & «Последний столбец под номером » _
& Stolbec, vbInformation, «Адрес»
End Sub
Определяем активную ячейку
Исходя из выше записанных выражений теперь можно смело определить координаты активной ячейки. То-есть определяем активную строку, активный столбец и получаем координаты активной ячейки. Выглядеть это будет так:
Sub yacheika()
sk = ActiveCell.Row
st = ActiveCell.Column
MsgBox «Активная ячейка имеет координаты Cells(» & sk & «,» & st & «)», _
vbInformation, «Активная ячейка»
End Sub
Адрес активной ячейки
Многие думали, а как получить адрес активной ячейки? Очень просто, делается это так:
Sub adres()
A = ActiveCell.Address
MsgBox «Абсолютный адрес активной ячейки — » & A, vbInformation, «Адрес»
End Sub
Но такая запись может не устроить некоторых, потому что вней присутствуют $, т.е. абсолютное значение, а не относительное. Но и это можно поправить. Доллары уберутся, если записать код так:
Sub adress()
A = ActiveCell.Address(0, 0)
MsgBox «Относительный адрес активной ячейки — » & A, vbInformation, «Адрес»
End Sub
В скобках оператора Address указано какое именно значение должно быть относительным, а какое абсолютным. Если Address(0,0), то и строка и столбец записаны относительными (первый ноль отвечает за строку, второй ноль — это столбец). Если в строке поставить вместо ноля еденицу, то строка будет абсолютным значением, а столбец относительным. Причём значения следующих записей равнозначны:
Address(1, 0) = Address(True, False)
Адрес выделенного диапазона ячеек
Адрес выделенного диапазона можно получить следующим образом
Sub diapazon()
‘используйте любую переменную для определения адреса
A = Selection.Rows.Address(0, 0) ‘Через строку
b = Selection.Columns.Address(0, 0) ‘Через столбец
c = Selection.Address(0, 0)
MsgBox «Выделенный диапазон — » & A, vbInformation, «Адрес»
End Sub
Координаты выделенного диапазона
Не знаю почему, но у многих возникает какая-то сложность определения координат выделенного диапазона, хотя существует очень много способов. Я приведу пример одного, но который будет понятен сейчас.
Sub Kdiapazon()
a = Selection.Row
b = Selection.Column
K1 = Cells(a, b).Address(0, 0)
aa = a + Selection.Rows.Count — 1
bb = b + Selection.Columns.Count — 1
K2 = Cells(aa, bb).Address(0, 0)
MsgBox «Первая координата выделенного диапазона — » & K1 & vbNewLine & _
«Вторая координата выделенного диапазона — » & K2, vbInformation, «Координаты»
End Sub
a — Определяет номер первой строки выделенного диапазона;
b — Определяет номер первого столбца выделенного диапазона;
K1 — Определяем первую координату выделенного диапазона;
aa — Определяем номер последней строки выделенного диапазона;
bb — Определяем номер пследнего столбца выделенного диапазона;
K2 — Определяем вторую координату выделенного диапазона;
Selection.Rows.Count — определяет количество строк в выделенном диапазоне;
Selection.Columns.Count — определяет количество столбцов в выделенном диапазоне;
У многих возник вопрос: А почему вычитаем единицу? Всё потому, что первая координата входит в выделенный диапазон и нам её надо не потерять.
Имя активной книги
Имя активной книги возможно вычислить такой записью:
Sub WorkbookName()
Name = ActiveWorkbook.Name
MsgBox «Имя активной книги — » & Name, vbInformation, «Имя активной книги»
End Sub
Имя активного листа
Имя активного листа можно определить так:
Sub SheetsName()
Name = ActiveSheet.Name
MsgBox «Имя активного листа — » & Name, vbInformation, «Имя активного листа»
End Sub