Excel vba номер строки выделенной ячейки

Определение адреса выделенного диапазона ячеек на листе 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 намного удобнее, чем на портале сервиса, а для загрузки в сервис достаточно сформировать несложный файл. Заполнил новые строки, выделил их по любому столбцу, нажал кнопку и файл готов.


 

Всем добрый день! Ситуация: пользователь выделил диапазон ячеек (например R5C1:R15C1 или R10C2:R20C5) Буду оч благодарен за подсказку, какая конструкция в VBA может определить номер самой верхней и самой нижней строки выделенного диапазона? (т.е. нужно получить 5 и 15 (10 и 20) для первого (второго) случая.

 

ran

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

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

Sub klb()  
a = Selection.Row  
b = a + Selection.Rows.Count — 1  
End Sub

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

Sub Êëóáîâ()  
Debug.Print Selection(1).Row  
Debug.Print Selection(1).Row + Selection.Rows.Count — 1  
End Sub

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

долбаная Виста…  

  Sub Клубов()  
Debug.Print Selection(1).Row  
Debug.Print Selection(1).Row + Selection.Rows.Count — 1  
End Sub

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Спасибо.  
Но возможно не правильно объяснил задачу.  
Я с помощью запроса прошу пользователя выделить необходимый ему диапазон ячеек.  
Sub DataLabelsFromRange()  
   Dim DLRange As Range  
   Dim Cht As Chart  
   Dim i As Integer, Pts As Integer  

          ‘  запрос диапазона  
   On Error Resume Next  
   Set DLRange = Application.InputBox _  
     (prompt:=»Укажите диапазон работы автооператора», Type:=8)  
     If DLRange Is Nothing Then Exit Sub  

  End Sub  

  мне нужно чтобы макрос определил первую и последнюю строку диапазона.которую выделил пользователь.

 

Юрий М

Модератор

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

Контакты см. в профиле

И чем Вас не устроили предыдущие ответы?

 

Не работает.  
Как вот в этот мой макрос вписать данные ответы????  
Чтоб он присвоил переменной a и b номер первой и последней строки соответственно

 

ran

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

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

А Selection на DLRange заменить слабо?

 

Юрий М

Модератор

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

Контакты см. в профиле

Возьмите две строки, например, RAN и замените Selection на Ваш диапазон:  
Sub DataLabelsFromRange()  
Dim DLRange As Range  
Dim Cht As Chart  
Dim i As Integer, Pts As Integer  

  ‘ запрос диапазона  
On Error Resume Next  
Set DLRange = Application.InputBox _  
(prompt:=»Укажите диапазон работы автооператора», Type:=8)  
If DLRange Is Nothing Then Exit Sub  
a = DLRange.Row  
b = a + DLRange.Rows.Count — 1  
End Sub

 

СПАСИБО!!!!  
Очень благодарен

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

Только не применяйте на листе условное форматирование с формулами условий, а то на таких листах Application.InputBox(…, Type:=8) глючит. Да и при указании диапазона на другой странице — тоже бывает.  
Буквально на днях в теме «VBA пример функции минимум» (

http://www.planetaexcel.ru/forum.php?thread_id=26054

) была предложена его не глючная альтернатива. Я уже почти все свои макросы под неё переделал.

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Юрий М

Модератор

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

Контакты см. в профиле

Алекс, пытаюсь спровоцировать ошибку (при УФ) — не получается :-)

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

Юрий, я сейчас смог повторить результат (просто нашел свой топик

http://www.planetaexcel.ru/forum.php?thread_id=15119

— «Проблемы с Application.InputBox (….., Type:=8) — не всякие значения хочет принимать» ) и подчистил по максимуму пример от всяких лишних кодов.  
Держите. Попробуйте, пожалуйста.

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

 

Alex_ST

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

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

На лицо ужасный, добрый внутри

#14

01.04.2011 13:09:37

Юрий, чтобы не оффтопить здесь, я поднял свой старый топик «Проблемы с Application.InputBox (….., Type:=8) — не всякие значения хочет»

С уважением, Алексей (ИМХО: Excel-2003 — THE BEST!!!)
<#0>

Содержание

  1. Определение номера строки по адресу ячейки
  2. 6 ответов
  3. Как определить последнюю ячейку на листе через VBA?

Определение номера строки по адресу ячейки

6 ответов

В Excel поставленная задача может быть решена так :

Dim iCell As Range, iRow As Long
Set iCell = Worksheets(1).UsedRange.Find( _
What:=»Образец_для_поиска», LookIn:=xlValues, LookAt:=xlWhole)

If Not iCell Is Nothing Then
iRow = iCell.Row ‘Номер строки,
‘который, на самом деле, нам не нужен, ибо :
iCell.EntireRow.Delete
Else
MsgBox «Увы, ничего не найдено», , «»
End If

В 1С Вы также можете использовать свойства EntireRow и Row

Да это так, но вот в 1С отладчик не знает, что такое Selection или Row!
Если писать
ExcelЛист.Rows(ПерваяЯчейка.Selection().Row()).Delete();
то ошибка такая
Метод объекта не обнаружен (Selection)

Если писать
ExcelЛист.Rows(ПерваяЯчейка.Selection.Row()).Delete();
то ошибка такая
Поле объекта не обнаружено (Selection)

[quote=Андре]я нашел ячейку . [/quote]

Если исходить из Ваших слов, то поиск ячейки уже реализован, однако, второй пост содержит лишь набор ключевых слов, использование которых, в представленном виде, не имеет особого смысла . при этом сам поиск и находка изволят отсутствовать.

Что касается об’екта Selection, то если предположить, что в момент выполнения инструкций выделен действительно диапазон (хотя это может быть и не так), то удаление всех строк этого диапазона, по идее, должно выглядить следующим образом (определение необходимости наличия или отсутствия скобок ложится на Вас) :

«Удивительное» открытие свойства Row, о возможности использовании которого, было сказано ещё в моём первом посте, равно как и о свойстве EntireRow

Источник

Как определить последнюю ячейку на листе через VBA?

Очень часто при внесении данных на лист Excel возникает вопрос определения последней заполненной или первой пустой ячейки. Чтобы впоследствии с этой первой пустой ячейки начать заносить данные. В этой теме я опишу несколько способов определения последней заполненной ячейки.

В качестве переменной, которой мы будем присваивать номер последней заполненной строки, у нас во всех примерах будет lLastRow . Объявлять мы её будем как Long . Для экономии памяти можно было бы использовать и тип Integer , но т.к. строк на листе может быть больше 32767(это максимальное допустимое значение переменных типа Integer ) нам понадобиться именно Long , во избежание ошибки. Подробнее про типы переменных можно прочитать в статье Что такое переменная и как правильно её объявить

Одинаковые переменные для всех примеров
Во всех примерах ниже мы будем запоминать номер последней строки или столбца в одни и те же переменные:

Dim lLastRow As Long ‘а для lLastCol можно было бы применить и тип Integer, ‘т.к. столбцов в Excel пока меньше 32767, но для однообразности назначим тоже Long Dim lLastCol As Long

Способ 1:
Определение последней заполненной строки через свойство End

lLastRow = Cells(Rows.Count,1).End(xlUp).Row ‘или lLastRow = Cells(Rows.Count, «A»).End(xlUp).Row

1 или «A» — это номер или имя столбца, последнюю заполненную ячейку в котором мы определяем. По сути обе приведенные строки дадут абсолютно одинаковый результат. Просто иногда удобнее указать номер столбца, а иногда его имя. Поэтому использовать можно любой из приведенных вариантов, в зависимости от ситуации.
Определение последнего столбца через свойство End

lLastCol = Cells(1, Columns.Count).End(xlToLeft).Column

1 — это номер строки, последнюю заполненную ячейку в которой мы определяем.

Данный метод определения последней строки/столбца самый распространенный. Используя его мы можем определить последнюю ячейку только в одном конкретном столбце(или строке). В большинстве случаев этого более чем достаточно.

Метод основан именно на принципе работы свойства End. На примере поиска последней строки опишу принцип так, как бы мы это делали руками через выделение ячеек на листе:

  • выделили самую последнюю ячейку столбца А на листе(для Excel 2007 и выше это А1048576 , а для Excel 2003 — А65536 )
  • и выполнили переход вверх комбинацией клавиш Ctrl + стрелка вверх . Данная комбинация заставляет Excel двигаться вверх(если точнее, то в направлении стрелки, нажатой вместе с Ctrl ) до тех пор, пока не встретиться первая ячейка с формулой или значением. А в случае, если сочетание было вызвано из уже заполненных ячеек — то до первой пустой. И как только Excel доходит до этой ячейки — он её выделяет
  • А через свойство .Row мы просто получаем номер строки этой выделенной ячейки
  • даже если в ячейке нет видимого значения, но есть формула — End посчитает ячейку не пустой. С одной стороны вполне справедливо. Но иногда нам надо определить именно «визуально» заполненные ячейки. Поиск ячеек при подобных условиях будет описан ниже(Способ 4: Определение последней ячейки через метод Find)
  • если на листе заполнены все строки в просматриваемом столбце(или будут заполнены несколько последних ячеек столбца или даже только одна последняя) — то результат может быть неверный(ну или не совсем такой, какой ожидали)
  • Данный способ игнорирует строки, скрытые фильтром, группировкой или командой Скрыть (Hide) . Т.е. если последняя строка таблицы будет скрыта, то данный метод вернет номер последней видимой заполненной строки, а не последней реально заполненной.

Ну а если надо получить первую пустую ячейку на листе(а не первую заполненную) — придется вспомнить математику. Т.к. последнюю заполненную мы определили, то первая пустая — следующая за ней. Т.е. к результату необходимо прибавить 1. Это хоть и очевидно, но на всякий случай все же лучше об этом напомнить.

Способ 2:
Определение последней заполненной строки через SpecialCells

Определение последнего столбца через SpecialCells

Данный метод не требует указания номера столбца и возвращает последнюю ячейку(Row — строку, Column — столбец).
Если хотите получить номер первой пустой строки или столбца на листе — к результату необходимо прибавить 1.
Нюансы:

    Используя данный способ следует помнить, что не всегда можно получить реальную последнюю заполненную ячейку, т.е. именно ячейку со значением. Метод SpecialCells определяет самую «дальнюю» ячейку на листе, используя при этом механизм «запоминания» тех ячеек, в которых мы работали в данном листе. Т.е. если мы занесем в ячейку AZ90345 значение и сразу удалим его — lLastRow, полученная через SpecialCells будет равна значению именно этой ячейки, из которой вы только что удалили значения(т.е. 90345). Другими словами требует обязательного обновления данных, а этого можно добиться только сохранив файла, а временами даже только закрыв файл и открыв его снова. Так же, если какая-либо ячейка содержит форматирование(например, заливку), но не содержит никаких значений, то метод SpecialCells посчитает её используемой и будет учитывать как заполненную.
    Этот недостаток можно попробовать обойти, вызвав перед определением последней ячейки вот такую строку кода:

With ActiveSheet.UsedRange: End With

Это должно переопределить границы рабочего диапазона и тогда определение последней строки/столбца сработает как ожидается, даже если до этого в ячейке содержались данные, которые впоследствии были удалены.
Выглядеть в единой процедуре это будет так:

Sub GetLastCell() Dim lLastRow As Long ‘переопределяем рабочий диапазон листа With ActiveSheet.UsedRange: End With ‘ищем последнюю заполненную ячейку на листе lLastRow = Cells.SpecialCells(xlLastCell).Row End Sub

Сам же я этот метод обычно использую для определения последней ячейки в только что созданном файле, в котором только добавляю строки кодом и в котором не может быть описанных выше нюансов.

Способ 3:
Определение последней строки через UsedRange

lLastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count — 1

Определение последнего столбца через UsedRange

lLastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count — 1

  • ActiveSheet.UsedRange.Row — этой строкой мы определяем первую ячейку, с которой начинаются данные на листе. Важно понимать для чего это — если у вас первые строк 5 не заполнены ничем(т.е. самые первые данные заносились начиная с 6-ой строки листа), то ActiveSheet.UsedRange.Row вернет именно 6(т.е. номер первой строки с данными). Если же все строки заполнены — то вернет 1.
  • ActiveSheet.UsedRange.Rows.Count — определяем кол-во строк, входящих в весь диапазон данных на листе. При этом неважно, есть ли данные в ячейках или нет — достаточно было поработать в этих ячейках и удалить значения или просто изменить цвет заливки.
    В итоге получается: первая строка данных + кол-во строк с данными — 1 . Зачем вычитать единицу? Попробуем посчитать вместе: первая строка: 6. Всего строк: 3. 6 + 3 = 9. Вроде все верно. А теперь выделим на листе три ячейки, начиная с 6-ой. Выделение завершилось на 8-ой строке. Потому что в 6-ой строке уже есть данные. Поэтому и надо вычесть 1, чтобы учесть этот момент. Думаю, не надо пояснять, что если надо получить первую пустую ячейку — можно 1 не вычитать 🙂
  • То же самое и с ActiveSheet.UsedRange.Column , только уже не для строк, а для столбцов.
  • Обладает некоторыми недостатками предыдущего метода. Определяет самую «дальнюю» ячейку на листе, используя при этом механизм «запоминания» тех ячеек, в которых мы работали в данном листе. Следовательно попробовать обойти этот момент можно точно так же: перед определением последней строки/столбца записать строку: With ActiveSheet.UsedRange: End With
    Это должно переопределить границы рабочего диапазона и тогда определение последней строки/столбца сработает как ожидается, даже если до этого в ячейке содержались данные, которые впоследствии были удалены.
  • даже если в ячейке нет видимого значения, но есть формула — UsedRange посчитает ячейку не пустой

Однако метод через UsedRange.Row работает прекрасно и при установленной на лист защите и внутри UDF, что делает его более предпочтительным, чем метод через SpecialCells при равных условиях.

Способ 4:
Определение последней строки и столбца, а так же адрес ячейки методом Find

Sub GetLastCell_Find() Dim rF As Range Dim lLastRow As Long, lLastCol As Long ‘ищем последнюю ячейку на листе, в которой хранится хоть какое-то значение Set rF = ActiveSheet.UsedRange.Find(What:=»*», LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=False, MatchByte:=False) If Not rF Is Nothing Then lLastRow = rF.Row ‘последняя заполненная строка lLastCol = rF.Column ‘последний заполненный столбец MsgBox rF.Address ‘показываем сообщение с адресом последней ячейки Else ‘если ничего не нашлось — значит лист пустой ‘и можно назначить в качестве последних первую строку и столбец lLastRow = 1 lLastCol = 1 MsgBox «A1» ‘показываем сообщение с адресом ячейки А1 End If End Sub

Этот метод, пожалуй, самый оптимальный в случае, если надо определить последнюю строку/столбец на листе без учета форматов и формул — только по отображаемому значению в ячейке. Например, если на листе большая таблица и последние строки заполнены формулами, возвращающими при определенных условиях пустую ячейку( =ЕСЛИ( A1 >0;1;»») ), предыдущие варианты вернут строку/столбец ячейки с последней ячейкой, в которой формула. В то время как данный метод вернет адрес ячейки только в случае, если в ячейке реально отображается какое-то значение. Такой подход часто используется для того, чтобы определить границы данных для последующего анализа заполненных данных, чтобы не захватывать пустые ячейки с формулами и не тратить время на их проверку.
Здесь следует обратить внимание на параметры метода Find. В данном случае мы специально указываем искать по значениям, а не по формулам:
Set rF = ActiveSheet.UsedRange.Find(What:=»*», LookIn:=xlValues , LookAt:=xlWhole, SearchDirection:=xlPrevious, MatchCase:=False, MatchByte:=False)
Нюансы:

  • Метод Find , вызванный с листа или другим кодом, имеет свойство запоминать все параметры последнего поиска, а если поиск еще не вызывался — то применяются параметры по умолчанию. А по умолчанию поиск идет всегда по формулам. Поэтому я настоятельно рекомендую указывать принудительно все необходимые параметры, как в примере.
  • Метод Find не будет учитывать в просмотре скрытые строки и столбцы. Это следует учитывать при его применении.

Пара небольших практических кодов
Коды ниже могут помочь понять, как использовать приведенные выше строки кода по поиску последней ячейки/строки:

Sub GetLastCell() Dim lLastRow As Long Dim lLastCol As Long ‘определили последнюю заполненную ячейку с учетом формул в столбце А lLastRow = Cells(Rows.Count, 1).End(xlUp).Row MsgBox «Заполненные ячейки в столбце А: » & Range(«A1:A» & lLastRow).Address ‘определили последний заполненный столбец на листе(с учетом формул и форматирования) lLastCol = Cells.SpecialCells(xlLastCell).Column MsgBox «Заполненные ячейки в первой строке: » & Range(Cells(1, 1), Cells(1, lLastCol)).Address ‘выводим сообщение с адресом последней ячейки на листе(с учетом формул и форматирования) MsgBox «Адрес последней ячейки диапазона на листе: » & Cells.SpecialCells(xlLastCell).Address End Sub

Выделяем диапазон ячеек в столбцах с А по С, определяя последнюю ячейку по столбцу A этого же листа:

Sub SelectToLastCell() Range(«A1:C» & Cells(Rows.Count, 1).End(xlUp).Row).Select End Sub

Копируем ячейку B1 в первую пустую ячейку столбца A этого же листа:

Sub CopyToFstEmptyCell() Dim lLastRow As Long lLastRow = Cells(Rows.Count, 1).End(xlUp).Row ‘определили последнюю заполненную ячейку Range(«B1»).Copy Cells(lLastRow+1, 1) ‘скопировали В1 и вставили в следующую после определенной ячейки End Sub

А код ниже делает тоже самое, но одной строкой — применяется Offset и используется тот факт, что изначально методом End мы получаем именно ячейку, а не номер строки(номер строки мы получаем позже через свойство .Row):

Sub CopyToFstEmptyCell() Range(«B1»).Copy Destination:=Cells(Rows.Count, 1).End(xlUp).Offset(1) End Sub

Range(«B1»).Copy — копирует ячейку В1 . Если для аргумента Destination указать другую ячейку, то в неё будет вставлена скопированная ячейка. Мы передаем в этот аргумент определенную методом End ячейку
Cells(Rows.Count, 1).End(xlUp) — возвращает последнюю заполненную ячейку в столбце А (не строку, а именно ячейку)
Offset(1) — смещает полученную ячейку на строку вниз
Используем инструмент автозаполнение(протягивание) столбца В , начиная с ячейки B2 и определяя последнюю ячейку для заполнения на основании столбца А

Sub AutoFill_B() Dim lLastRow As Long lLastRow = Cells(Rows.Count, 1).End(xlUp).Row Range(«B2»).AutoFill Destination:=Range(«B2:B» & lLastRow) End Sub

На самом деле практических кодов может быть куда больше, т.к. определение последней заполненной или первой пустой ячейки является чуть ли не самой распространенной задачей при написании кодов в Excel.

Статья помогла? Поделись ссылкой с друзьями!

Источник

275

14 июля 2008 года

pashulka

985 / / 19.09.2004

[quote=Андре]я нашел ячейку …[/quote]

Если исходить из Ваших слов, то поиск ячейки уже реализован, однако, второй пост содержит лишь набор ключевых слов, использование которых, в представленном виде, не имеет особого смысла … при этом сам поиск и находка изволят отсутствовать.

Что касается об’екта Selection, то если предположить, что в момент выполнения инструкций выделен действительно диапазон (хотя это может быть и не так), то удаление всех строк этого диапазона, по идее, должно выглядить следующим образом (определение необходимости наличия или отсутствия скобок ложится на Вас) :

Excel.Selection.EntireRow.Delete;

Определение активных составляющих книги

Мне кажется, многие загонялись таким вопросом, как определить активную ячейку (на которой находится курсор), строку или столбец. Или же хотелось получить адрес в формате А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

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Популярные разделы FAQ:    user posted image Общие вопросы    user posted image Особенности VBA-кода    user posted image Оптимизация VBA-кода    user posted image Полезные ссылки


    1. Старайтесь при создании темы указывать в заголовке или теле сообщения название офисного приложения и (желательно при работе с Office 95/97/2000) его версию. Это значительно сократит количество промежуточных вопросов.
    2. Формулируйте вопросы как можно конкретнее, вспоминая (хотя бы иногда) о правилах ВЕЛИКОГО И МОГУЧЕГО РУССКОГО ЯЗЫКА, и не забывая, что краткость — сестра таланта.
    3. Не забывайте использовать теги [сode=vba] …текст программы… [/code] для выделения текста программы подсветкой!
    4. Темы с просьбой выполнить какую-либо работу полностью за автора здесь не обсуждаются и переносятся в раздел ПОМОЩЬ СТУДЕНТАМ.

    >
    Найти номер строки с нужной информацией
    , Excel

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    07.10.14, 08:39

      Законченный оптимист

      *******

      Рейтинг (т): 117

      На:
      WorksheetFunction.Match
      Application.Match
      ругается: #1004 — невозможно получить свойство Match класса WorksheetFunction.

      Нужно найти именно НОМЕР строки. Либо всю строку запихнуть в переменную класса Range, чтобы я мог в ней другие столбцы менять.

      Monster

      Akina



      Сообщ.
      #2

      ,
      07.10.14, 09:15

        ExpandedWrap disabled

          RangeToSearch.Select

          Selection.Find(What:=ValueToSearch).Activate

          MsgBox ActiveCell.Row

        Guru

        Jin X



        Сообщ.
        #3

        ,
        07.10.14, 09:23

          Законченный оптимист

          *******

          Рейтинг (т): 117

          Select не канает.
          Надо просто получить эту строку, не меняя положения курсора. Если я сделаю Range(«НужныйДиапазон»).Find, то он мне найдёт непосредственно эту ячейку, верно? А как мне найти соседнюю справа, например?

          Сообщение отредактировано: Jin X — 07.10.14, 09:23

          Monster

          Akina



          Сообщ.
          #4

          ,
          07.10.14, 10:34

            Цитата Jin X @ 07.10.14, 09:23

            как мне найти соседнюю справа, например?

            Если ты знаешь строку и столбец найденной ячейки, то взять «соседнюю справа» — это, конечно, задача совершенно нерешаемая…

            Guru

            Jin X



            Сообщ.
            #5

            ,
            07.10.14, 17:30

              Законченный оптимист

              *******

              Рейтинг (т): 117

              А кроме как через Address можно как-то узнать номер строки и столбца найденной ячейки?

              Monster

              Akina



              Сообщ.
              #6

              ,
              08.10.14, 04:50

                Не понял… номер строки и номер столбца — недостаточно, что ли?

                Guru

                Jin X



                Сообщ.
                #7

                ,
                08.10.14, 13:06

                  Законченный оптимист

                  *******

                  Рейтинг (т): 117

                  Address содержит строку вида $A$10 — выуживать из неё номер строки (особенно) и столбца не очень удобно.
                  Может, есть другое свойство, которое содержит эти номера в цифровом виде?


                  pashulka



                  Сообщ.
                  #8

                  ,
                  08.10.14, 15:45

                    Full Member

                    ***

                    Рейтинг (т): 95

                    Jin X, Если по каким-то причинам — Вы не хотите использовать свойства Row и Column (которые Вам и предлагал использовать Akina, смотрите сообщ.#2, 4), то есть и другие способы добраться до соседней ячейки :)

                    ExpandedWrap disabled

                      Private Sub Test()

                          Dim RangeToSearch As Range, CellFind As Range, FindText As String

                          FindText = «Чё мы ищем»

                          Set RangeToSearch = Range(«A:A») ‘Columns(1)

                          Set CellFind = RangeToSearch.Find(FindText, , xlValues, xlWhole)

                          If Not CellFind Is Nothing Then

                             MsgBox Cells(CellFind.Row, CellFind.Column + 1).Address ‘Akina

                             MsgBox CellFind.Next.Address

                             MsgBox CellFind(1, 2).Address

                             ‘MsgBox CellFind.Item(1, 2).Address

                             MsgBox CellFind.Cells(1, 2).Address

                             MsgBox CellFind.Offset(, 1).Address ‘Учитывает об’един. ячейки

                          Else

                             MsgBox «Ничего не найдено»

                          End If

                      End Sub

                    Сообщение отредактировано: pashulka — 08.10.14, 15:46

                    Guru

                    Jin X



                    Сообщ.
                    #9

                    ,
                    08.10.14, 16:34

                      Законченный оптимист

                      *******

                      Рейтинг (т): 117

                      Так, я не знал, что Row и Column будут выдавать нужные позиции, я думал, что там будет 1, 1 :)

                      Добавлено 08.10.14, 16:34
                      Спасибо!


                      pashulka



                      Сообщ.
                      #10

                      ,
                      08.10.14, 18:31

                        Full Member

                        ***

                        Рейтинг (т): 95

                        Несмотря на то, что стандартная функция рабочего листа ПОИСКПОЗ()/MATCH() была отвергнута :( я всё-таки перечислю некоторые случаи, при которых применение WorksheetFunction.Match действительно приведёт к возникновению ошибки #1004 и может быть этот опус кому-нибудь да пригодится ;)

                        1) Т.к. эта функция универсальна, т.е. она может искать не только в столбце, но и в строке, то при поиске нужно указывать диапазон состоящий только из одного столбца(если ищем номер строки) или из одной строки(если ищем номер столбца)

                        Если изначально это сделать затруднительно, то можно воспользоваться, например, свойствами Columns/Rows об’екта Range, т.е.

                        ExpandedWrap disabled

                          Dim iSource As Range, iFindText As String ‘, iRow As Variant

                          Set iSource = Range(«A1:C100»)

                          iFindText = «Что ищем ?»

                          iRow = WorksheetFunction.Match(iFindText, iSource.Columns(1), 0)

                        2) Искомое значение банально отсутствует в столбце.

                        3) Искомое значение всё-таки наличествует, но функция его не находит, ибо чувствительна к типам, например, если мы ищем число 100, а в столбце наличествует текст «100» (или наоборот) Это кстати, очень распространённый вариант, из-за которого многие предпочитают мучить метод Find об’екта Range, который лишён этого недостатка(особенности)

                        4) Длина искомого текста больше 255 символов (касается и некоторых других функций, а также метода Find)

                        P.S. И напоследок прилагается пример поиска, где нет необходимости мучить On Error Resume Next ( и т.п.)

                        ExpandedWrap disabled

                          Dim iSource As Range, iFindText As Variant, iRow As Variant

                          Set iSource = Range(«A:A») ‘можно указать свой столбец

                          iFindText = 100 ‘»Что ищем ?»

                          iRow = Application.Match(iFindText, iSource, 0)

                          If Not IsError(iRow) Then ‘

                             MsgBox «Номер найденной строки #» & iRow

                          Else

                             MsgBox «Не срослось …»

                          End If

                        Guru

                        Jin X



                        Сообщ.
                        #11

                        ,
                        09.10.14, 12:33

                          Законченный оптимист

                          *******

                          Рейтинг (т): 117

                          Странно. Почему-то находит только при:
                          Set Res = .Range(«Коды»).Find(Int(Target), , xlValues, xlPart)
                          а при:
                          Set Res = .Range(«Коды»).Find(Int(Target), , xlValues, xlWhole)
                          не находит ничего :(

                          Target = «10»
                          Столбец «Коды» содержит числа, без формул даже (формат ячеек — числовой)

                          В чём дело?


                          pashulka



                          Сообщ.
                          #12

                          ,
                          09.10.14, 21:15

                            Full Member

                            ***

                            Рейтинг (т): 95

                            Если при вводе чисел не было допущено очепяток, то, по всей видимости, собака порылась именно в формате, например, указано число десятичных знаков больше 0, в результате чего 10 отображается как 10,00. Бороться с таким безобразием можно, например, так Range(«Коды»).Find(Target, , xlFormulas, xlWhole)

                            Guru

                            Jin X



                            Сообщ.
                            #13

                            ,
                            10.10.14, 18:25

                              Законченный оптимист

                              *******

                              Рейтинг (т): 117

                              Да, собака в этом. Но там стояли не десятичные знаки, а вот так:
                              # ##0_ ;[Красный]-# ##0
                              Разделение групп и… (пробел после?)
                              Благодарю!

                              Добавлено 10.10.14, 18:25
                              Сделал просто числовой формат 0

                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                              0 пользователей:

                              • Предыдущая тема
                              • VB for Application
                              • Следующая тема

                              Рейтинг@Mail.ru

                              [ Script execution time: 0,1518 ]   [ 16 queries used ]   [ Generated: 14.04.23, 00:18 GMT ]  

                              Понравилась статья? Поделить с друзьями:
                            • Excel vba определить активный лист
                            • Excel vba номер символа в строке
                            • Excel vba определение функции
                            • Excel vba номер последней строки в таблице
                            • Excel vba определение количества строк