Vba excel как определить выделенную ячейку

Определение адреса выделенного диапазона ячеек на листе 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
Регистрация: 01.01.1970

#1

02.11.2021 15:01:16

Доброе время суток!
Задача: по нажатию кнопки данные выделенных ячеек должны быть перенесены в нужную таблицу
Вопрос: как правильно обратиться к выделенным ячейкам?
Определяю объектом активную книгу

Код
Set oLO = ActiveWorkbook

Пытаюсь определить выделенные ячейки на листе «lotout»

Код
oLO.Worksheets("lotout").Selection <Object doesn't support this property or method>
oLO.Worksheets("lotout").Range.Selection <Wrong number of arguments or invalid property assignment>

За подсказку спасибо!

 

БМВ

Модератор

Сообщений: 21378
Регистрация: 28.12.2016

Excel 2013, 2016

По вопросам из тем форума, личку не читаю.

 

syt navy

Пользователь

Сообщений: 83
Регистрация: 01.01.1970

Спасибо. Добавил активацию данного листа. Всё теперь определяется

 

Если у Вас ячейки уже выделены то я полагаю:
Selection.Copy
А можно и в массив погрузить данные

Изменено: Семен Фадеев02.11.2021 15:25:32

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#5

02.11.2021 15:33:36

syt navy, здравствуйте

Цитата
syt navy: Добавил активацию данного листа

неправильно поняли — медведь имел ввиду, что Selection ЗАПОМНИТЬ нужно

Код
Dim rng As Range
Set rng = Selection

и потом просто rng.Copy Workbooks(«NewBook»).Sheets(«NewSheet») или типа того
Если только значения нужны, то вообще без диапазона обходимся — грузим в массив и выгружаем, где нужно

Изменено: Jack Famous02.11.2021 15:34:32

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

БМВ

Модератор

Сообщений: 21378
Регистрация: 28.12.2016

Excel 2013, 2016

#6

02.11.2021 16:04:41

Цитата
Jack Famous написал:
неправильно поняли — медведь имел ввиду, что Selection ЗАПОМНИТЬ нужно

я имел в виду что запомнить можно, но не обязательно. все зависит от того что нужно с этим выделением сделать.

По вопросам из тем форума, личку не читаю.

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#7

02.11.2021 16:09:53

Цитата
БМВ: можно, но не обязательно

разумеется — если переносить на соседний лист и/или только значения

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

syt navy

Пользователь

Сообщений: 83
Регистрация: 01.01.1970

#8

03.11.2021 08:32:27

Цитата
Jack Famous написал:
неправильно поняли — медведь имел ввиду, что Selection ЗАПОМНИТЬ нужно

Я его понял. У меня дальше активным становился другой лист, поэтому не мог обратиться к Selection. Добавил дополнительно активацию листа с выделением, и всё стало работать. А Selection  я потом кидаю в коллекцию, с которой уже работаю.

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

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

Понравилась статья? Поделить с друзьями:
  • Vba excel как определить адрес ячейки
  • Vba excel как определить формат ячейки excel
  • Vba excel как объявить массив
  • Vba excel как обратиться к строке
  • Vba excel как обратиться к листу по имени