Excel vba найти номер строки по значению

 

tod2020

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

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

#1

17.07.2017 13:03:28

Как правильно выглядит код для такой конструкции?

Код
Worksheets(1).Range("Table1").[ХХХ].Find("свекла").Row

то есть Row определяется не для Worksheets(1) а для Range(«Table1»)

Прикрепленные файлы

  • 2017.07.17-Получение Row из Range через FIND.xlsm (20.48 КБ)

Изменено: tod202017.07.2017 13:14:02

 

Garni

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

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

#2

17.07.2017 13:14:13

Код
MsgBox Worksheets(1).Range("D5:G9").Find("свекла").Row
 

tod2020

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

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

Garni, Не то. Нужно по имени диапазона

 

Garni

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

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

#4

17.07.2017 13:46:03

Тогда попробуйте так

Код
MsgBox Range("table1").Find(What:="свекла").Row

Если надо найти порядковый номер строки таблицы из Столбца3, тогда

Код
MsgBox Range("table1").Find(What:="свекла").Offset(, -1)

Изменено: Garni17.07.2017 13:57:50

 

Илья Демид

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

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

#5

17.07.2017 13:46:16

У меня работает, если вы имеете ввиду чтобы указывалась строка из таблицы то отнимите количество строк с шапкой (в примере это 4)
т.е. вместо кода

Код
MsgBox (Worksheets(1).Range("table1").Find("Свекла").Row) 

Будет код

Код
MsgBox (Worksheets(1).Range("table1").Find("Свекла").Row-4)
 

ZVI

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

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

#6

17.07.2017 13:52:40

Вариант:

Код
Sub Test()
  
  Const FieldName = "Имя"   ' Имя поля таблицы для поиска
  Const What = "свекла"     ' Что искать
  
  Dim x As Range
  
  With Лист1.ListObjects(1).ListColumns(FieldName).DataBodyRange
    Set x = .Find(What, LookIn:=xlValues, LookAt:=xlWhole)
    If Not x Is Nothing Then MsgBox x.Row - .Row + 1
  End With
 
End Sub

Изменено: ZVI17.07.2017 13:55:33

 

tod2020

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

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

Всё что выше это всё многострочное сложное.
Нужно чтобы было просто в одну лакончиную строчку, без вычетаний лишних
Для этого нужно понимать классификацию, структуру объектов в строчке-конструкцию которую я изначально предложил

Изменено: tod202017.07.2017 13:57:45

 

tod2020

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

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

#8

17.07.2017 14:01:28

Цитата
Garni написал:
MsgBox Range(«table1″).Find(What:=»свекла»).Offset(, -1)

это тоже не пойдет поскольку собьется нумерация со временем, только Row нужно заполучить

 

Garni

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

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

У Вас таблица из 4 строчек и вопрос о номере строки, в которой находится свекла. Вам предложили как минимум 4 варианта. Какую еще классификацию нам надо понять? Куда пойти записаться чтоб изучить структуру объекта из 4 строчек?

 

tod2020

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

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

#10

17.07.2017 14:03:58

Цитата
Garni написал:
У Вас таблица из 4 строчек

это не рабочий файл. в рабочих файлах десятки-сотни таблиц с сотнями-тысячами строк

Изменено: tod202017.07.2017 14:04:35

 

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

 

Garni

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

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

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

 

tod2020

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

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

Как правильно выглядит код для такой конструкции?

Worksheets(1).Range(«Table1»).[ХХХХХХХХХХХХ].Find(«свекла»).Row

то есть Row определяется не для Worksheets(1) а для Range(«Table1»)

PS Был бы listObject вместо XXX стояло бы DataBodyRange

Изменено: tod202017.07.2017 14:15:36

 

ZVI

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

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

#14

17.07.2017 14:18:38

Цитата
tod2020 написал: Нужно чтобы было просто в одну лакончиную строчку, без вычетаний лишних

С точки зрения правил программирования Ваше «нужно» некорректное.
Код пишется один раз так, чтобы он был понятен, работал в штатных и аварийных ситуациях.
И совершено не важно сколько в нем строчек. Это же не формула ячеек.
Хотя рекомендуется не более одной экранной странички для функции и процедуры для удобства визуального охвата и неперегрузки интеллекта и памяти программиста.
Если очень уж хочется в одну строчку, но с вычитанием, то можно, например. так:

Код
MsgBox Лист1.ListObjects("table1").ListColumns("Имя").DataBodyRange.Find("свекла").Row - Лист1.[table1].Row + 1

Изменено: ZVI17.07.2017 14:43:32

 

Garni

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

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

Вам ответ дал Илья Демид, в сообщении #6. Значение Row будет для являться для листа, если Вы хотите вычислить номер строки для таблицы по средствам VBA, то в лаконичную одну строку это не уберется

 

tod2020

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

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

#16

17.07.2017 14:22:13

Есть и такой вариант

Код
Range("Table1").Find("свекла").Row - Range("Table1").Row – 1

Но по задаче поставленной в теме говориться о такой конструкции:
Worksheets(1).Range(«Table1»).[ХХХХХХХХХХХХ].Find(«свекла»).Row

Как правильно выглядит код для такой конструкции?
то есть Row определяется не для Worksheets(1) а для Range(«Table1»)
PS Был бы listObject вместо XXX стояло бы DataBodyRange

Подмена Range на ListObject не нужна

Изменено: tod202017.07.2017 14:29:59

 

Слово задача убило наповал… Уважаемый tod2020 для задач есть платный раздел

 

tod2020

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

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

#18

17.07.2017 14:33:49

Цитата
Илья Демид написал:
Слово задача убило наповал

Я не требую. У Вас такая реакция(набор мыслеформ и картинка и интонация) на слово «задача» наверно с работы, но не всё так однобоко

Каждый кто отвечает на этих формах в этих темах решает задачи поставленные в теме. Я не требую большего чем тут принято. Как вещи называются так и называю
И каждый кто отвечает для когото другого  — какуюто свою задачу выполняет для себя таким образом. и я не спрашиваю зачем ктото мне отвечает.

И наверно потому заставляю себя говорить спасибо потому что человек отвечающий решает свои задачи для себя, он уже получает себе чтото там

Как детскому саду всё разжевываю

Изменено: tod202017.07.2017 14:44:29

 

ZVI

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

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

В примере была таблица, поэтому в ответе и ListObject.
А что у Вас подразумевается под [XXX] ? Так как пояснений никаких не было, я посчитал, что Вы хотели указать конкретное поле в таблице для поиска, значение же может оказаться и в других полях. Уточните про XXX.

Изменено: ZVI17.07.2017 14:41:46

 

Илья Демид

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

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

#20

17.07.2017 14:40:39

Вы ошибаетесь, но да ладно. Если я правильно понял то необходим вариант который бы сам вычислял в какой строке находится шапка и отнимал ее сам, Как насчет такого, но не 1 строкой:

Код
Dim a As Integer
a = Worksheets(1).Range("table1").Find("свекла").End(xlUp).Row
b = Worksheets(1).Range("table1").Find("свекла").Row
MsgBox b - a

Изменено: Илья Демид17.07.2017 14:41:38

 

AndreTM

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

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

тод2020, я уже упоминал вроде, что вы — не читатель?

В

том сообщении

вам был дан тот ответ, что вы требуете здесь (в одну строчку тот код переписывается просто на раз-два).
Неспособность заменить имя переменной её значением — на вашей совести…

 

tod2020

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

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

#22

17.07.2017 14:45:54

Цитата
AndreTM написал:
тод2020 , я уже упоминал вроде, что вы — не читатель?

Что это значит?

 

tod2020

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

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

Чтож за такое то происходит?
перевожу что твориться
-мне надо красное яблоко
-ну на целый ящик груш зеленых! тоже круглые же
-да не надо мне!, мне надо и ОДНО и КРАСНОЕ и ЯБЛОКО!
-ну на возьми ну хочешь три желтых груши?
-да не надо мне ни желтую ни зеленую грушу ни целы ящик их, мне надо одно красное яблоко
-да не бывает красных яблок я не видел и вот двое тоже не видели никогда в жизни твое красное яблоко

дают груши лишь потомуто не знают что существует красное яблоко или потомучто просто напросто нету его в наличии

Изменено: tod202017.07.2017 14:53:08

 

tod2020

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

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

#25

17.07.2017 14:54:55

Цитата
vikttur написал:
Дубль темы:

Что Вы хотели этим сказать?
Я же написал последней фразой что лучше создать новую тему
Зачем лишние движения происходят то?

Изменено: tod202017.07.2017 14:55:47

 

vikttur

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

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

Пусть определят участники тем — дубль или нет. Я вижу, что разница в названии — «диапазон» и «умная таблица». Вы считаете, что диапазон умной таблицы — не диапазон?

 

tod2020

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

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

#27

17.07.2017 14:56:53

Цитата
AndreTM написал:
В  том сообщении  вам был дан тот ответ, что вы требуете здесь

Меня ваще не слышат — не понимают что я уже 3 раза продублировал самого начала запроса темы
Я понял люди знают как мне лучше. точно
Надоело объясняться. Буду ждать когда появится человек который понимает и меня и VBA

Изменено: tod202017.07.2017 15:00:24

 

AndreTM

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

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

Короче, народ — нас явно троллят  :)

Предлагаю закончить все разборы и уточнения, ибо то, что ТС — китаец из индии, было понятно ещё в старой теме примерно с третьего его поста  :D  :D

 

vikttur

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

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

#29

17.07.2017 15:02:46

Цитата
Буду ждать когда появится человек который понимает и меня и VBA

В VBA здесь разбираются многие. А вот Вас не понимают.

Цитата
tod2020 написал: Меня ваще не слышат

Не стоит ли задуматься? Если Вас не слышат многие — проблема в Вас, В том, как Вы доносите информацию. Или неправы все, кроме одного?

 

tod2020

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

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

#30

17.07.2017 15:06:39

Цитата
vikttur написал:
Если Вас не слышат многие — проблема в Вас

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

Изменено: tod202017.07.2017 15:07:06

Метод Find объекта Range для поиска ячейки по ее данным в VBA Excel. Синтаксис и компоненты. Знаки подстановки для поисковой фразы. Простые примеры.

Метод Find объекта Range предназначен для поиска ячейки и сведений о ней в заданном диапазоне по ее значению, формуле и примечанию. Чаще всего этот метод используется для поиска в таблице ячейки по слову, части слова или фразе, входящей в ее значение.

Синтаксис метода Range.Find

Expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

Expression – это переменная или выражение, возвращающее объект Range, в котором будет осуществляться поиск.

В скобках перечислены параметры метода, среди них только What является обязательным.

Метод Range.Find возвращает объект Range, представляющий из себя первую ячейку, в которой найдена поисковая фраза (параметр What). Если совпадение не найдено, возвращается значение Nothing.

Если необходимо найти следующие ячейки, содержащие поисковую фразу, используется метод Range.FindNext.

Параметры метода Range.Find

Наименование Описание
Обязательный параметр
What Данные для поиска, которые могут быть представлены строкой или другим типом данных Excel. Тип данных параметра — Variant.
Необязательные параметры
After Ячейка, после которой следует начать поиск.
LookIn Уточняет область поиска. Список констант xlFindLookIn:

  • xlValues (-4163) – значения;
  • xlComments (-4144) – примечания*;
  • xlNotes (-4144) – примечания*;
  • xlFormulas (-4123) – формулы.
LookAt Поиск частичного или полного совпадения. Список констант xlLookAt:

  • xlWhole (1) – полное совпадение;
  • xlPart (2) – частичное совпадение.
SearchOrder Определяет способ поиска. Список констант xlSearchOrder:

  • xlByRows (1) – поиск по строкам;
  • xlByColumns (2) – поиск по столбцам.
SearchDirection Определяет направление поиска. Список констант xlSearchDirection:

  • xlNext (1) – поиск вперед;
  • xlPrevious (2) – поиск назад.
MatchCase Определяет учет регистра:

  • False (0) – поиск без учета регистра (по умолчанию);
  • True (1) – поиск с учетом регистра.
MatchByte Условия поиска при использовании двухбайтовых кодировок:

  • False (0) – двухбайтовый символ может соответствовать однобайтовому символу;
  • True (1) – двухбайтовый символ должен соответствовать только двухбайтовому символу.
SearchFormat Формат поиска – используется вместе со свойством Application.FindFormat.

* Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments и MsgBox xlNotes.

В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.

Знаки подстановки для поисковой фразы

Условные знаки в шаблоне поисковой фразы:

  • ? – знак вопроса обозначает любой отдельный символ;
  • * – звездочка обозначает любое количество любых символов, в том числе ноль символов;
  • ~ – тильда ставится перед ?, * и ~, чтобы они обозначали сами себя (например, чтобы тильда в шаблоне обозначала сама себя, записать ее нужно дважды: ~~).

Простые примеры

При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:

  1. Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
  2. Если поисковая фраза в заданном диапазоне найдена не будет, метод Range.Find возвратит значение Nothing. Обращение к свойствам несуществующей ячейки будет генерировать ошибки. Поэтому, перед использованием результатов поиска, необходимо проверить объектную переменную на содержание в ней значения Nothing.

В примерах используются переменные:

  • myPhrase – переменная для записи поисковой фразы;
  • myCell – переменная, которой присваивается первая найденная ячейка, содержащая поисковую фразу, или значение Nothing, если поисковая фраза не найдена.

Пример 1

Sub primer1()

Dim myPhrase As Variant, myCell As Range

myPhrase = «стакан»

Set myCell = Range(«A1:L30»).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Значение найденной ячейки: « & myCell

MsgBox «Строка найденной ячейки: « & myCell.Row

MsgBox «Столбец найденной ячейки: « & myCell.Column

MsgBox «Адрес найденной ячейки: « & myCell.Address

Else

MsgBox «Искомая фраза не найдена»

End If

End Sub

В этом примере мы присваиваем переменной myPhrase значение для поиска – "стакан". Затем проводим поиск этой фразы в диапазоне "A1:L30" с присвоением результата поиска переменной myCell. Далее проверяем переменную myCell, не содержит ли она значение Nothing, и выводим соответствующие сообщения.

Ознакомьтесь с работой кода VBA в случаях, когда в диапазоне "A1:L30" есть ячейка со строкой, содержащей подстроку "стакан", и когда такой ячейки нет.

Пример 2

Теперь посмотрим, как метод Range.Find отреагирует на поиск числа. В качестве диапазона поиска будем использовать первую строку активного листа Excel.

Sub primer2()

Dim myPhrase As Variant, myCell As Range

myPhrase = 526.15

Set myCell = Rows(1).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Значение найденной ячейки: « & myCell

Else: MsgBox «Искомая фраза не найдена»

End If

End Sub

Несмотря на то, что мы присвоили переменной числовое значение, метод Range.Find найдет ячейку со значением и 526,15, и 129526,15, и 526,15254. То есть, как и в предыдущем примере, поиск идет по подстроке.

Чтобы найти ячейку с точным соответствием значения поисковой фразе, используйте константу xlWhole параметра LookAt:

Set myCell = Rows(1).Find(myPhrase, , , xlWhole)

Аналогично используются и другие необязательные параметры. Количество «лишних» запятых перед необязательным параметром должно соответствовать количеству пропущенных компонентов, предусмотренных синтаксисом метода Range.Find, кроме случаев указания необязательного параметра по имени, например: LookIn:=xlValues. Тогда используется одна запятая, независимо от того, сколько компонентов пропущено.

Пример 3

Допустим, у нас есть многострочная база данных в Excel. В первой колонке находятся даты. Нам необходимо создать отчет за какой-то период. Найти номер начальной строки для обработки можно с помощью следующего кода:

Sub primer3()

Dim myPhrase As Variant, myCell As Range

myPhrase = «01.02.2019»

myPhrase = CDate(myPhrase)

Set myCell = Range(«A:A»).Find(myPhrase)

If Not myCell Is Nothing Then

MsgBox «Номер начальной строки: « & myCell.Row

Else: MsgBox «Даты « & myPhrase & » в таблице нет»

End If

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,1708 ]   [ 16 queries used ]   [ Generated: 14.04.23, 00:18 GMT ]  

                              Содержание

                              1. Определение номера строки по адресу ячейки
                              2. 6 ответов
                              3. VBA Excel. Метод Find объекта Range
                              4. Предназначение и синтаксис метода Range.Find
                              5. Синтаксис метода Range.Find
                              6. Параметры метода Range.Find
                              7. Знаки подстановки для поисковой фразы
                              8. Простые примеры
                              9. Vba excel номер строки по значению ячейки
                              10. Узнать номер строки excel vba
                              11. Как определить последнюю ячейку на листе через VBA?
                              12. Поиск на листе Excel
                              13. Поиск перебором значений
                              14. Поиск функцией Find
                              15. Примеры поиска функцией Find
                              16. Поиск даты с помощью Find
                              17. VBA Excel: how to get row and column number of named range?
                              18. Как определить последнюю ячейку на листе через VBA?
                              19. Open Notes
                              20. Полезные команды 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. Метод Find объекта Range

                              Метод Find объекта Range для поиска ячейки по ее данным в VBA Excel. Синтаксис и компоненты. Знаки подстановки для поисковой фразы. Простые примеры.

                              Предназначение и синтаксис метода Range.Find

                              Метод Find объекта Range предназначен для поиска ячейки и сведений о ней в заданном диапазоне по ее значению, формуле и примечанию. Чаще всего этот метод используется для поиска в таблице ячейки по слову, части слова или фразе, входящей в ее значение.

                              Синтаксис метода Range.Find

                              Expression – это переменная или выражение, возвращающее объект Range, в котором будет осуществляться поиск.

                              В скобках перечислены параметры метода, среди них только What является обязательным.

                              Метод Range.Find возвращает объект Range, представляющий из себя первую ячейку, в которой найдена поисковая фраза (параметр What). Если совпадение не найдено, возвращается значение Nothing.

                              Если необходимо найти следующие ячейки, содержащие поисковую фразу, используется метод Range.FindNext.

                              Параметры метода Range.Find

                              Наименование Описание
                              Обязательный параметр
                              What Данные для поиска, которые могут быть представлены строкой или другим типом данных Excel. Тип данных параметра — Variant.
                              Необязательные параметры
                              After Ячейка, после которой следует начать поиск.
                              LookIn Уточняет область поиска. Список констант xlFindLookIn:

                              • xlValues (-4163) – значения;
                              • xlComments (-4144) – примечания*;
                              • xlNotes (-4144) – примечания*;
                              • xlFormulas (-4123) – формулы.
                              LookAt Поиск частичного или полного совпадения. Список констант xlLookAt:

                              • xlWhole (1) – полное совпадение;
                              • xlPart (2) – частичное совпадение.
                              SearchOrder Определяет способ поиска. Список констант xlSearchOrder:

                              • xlByRows (1) – поиск по строкам;
                              • xlByColumns (2) – поиск по столбцам.
                              SearchDirection Определяет направление поиска. Список констант xlSearchDirection:

                              • xlNext (1) – поиск вперед;
                              • xlPrevious (2) – поиск назад.
                              MatchCase Определяет учет регистра:

                              • False (0) – поиск без учета регистра (по умолчанию);
                              • True (1) – поиск с учетом регистра.
                              MatchByte Условия поиска при использовании двухбайтовых кодировок:

                              • False (0) – двухбайтовый символ может соответствовать однобайтовому символу;
                              • True (1) – двухбайтовый символ должен соответствовать только двухбайтовому символу.
                              SearchFormat Формат поиска – используется вместе со свойством Application.FindFormat.

                              * Примечания имеют две константы с одним значением. Проверяется очень просто: MsgBox xlComments и MsgBox xlNotes .

                              В справке Microsoft тип данных всех параметров, кроме SearchDirection, указан как Variant.

                              Знаки подстановки для поисковой фразы

                              Условные знаки в шаблоне поисковой фразы:

                              • ? – знак вопроса обозначает любой отдельный символ;
                              • * – звездочка обозначает любое количество любых символов, в том числе ноль символов;

                              Простые примеры

                              При использовании метода Range.Find в VBA Excel необходимо учитывать следующие нюансы:

                              1. Так как этот метод возвращает объект Range (в виде одной ячейки), присвоить его можно только объектной переменной, объявленной как Variant, Object или Range, при помощи оператора Set.
                              2. Если поисковая фраза в заданном диапазоне найдена не будет, метод Range.Find возвратит значение Nothing. Обращение к свойствам несуществующей ячейки будет генерировать ошибки. Поэтому, перед использованием результатов поиска, необходимо проверить объектную переменную на содержание в ней значения Nothing.

                              В примерах используются переменные:

                              • myPhrase – переменная для записи поисковой фразы;
                              • myCell – переменная, которой присваивается первая найденная ячейка, содержащая поисковую фразу, или значение Nothing, если поисковая фраза не найдена.

                              Источник

                              Vba excel номер строки по значению ячейки

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

                              Например, есть столбец неких чисел A (числа вразнобой, но не повторяются), есть ячейка D1, в которую вводится значение для поиска и есть ячейка D3, в которую нужно вывести результат.
                              Как сделать так, чтобы при вводе в ячейку D1 некоторого числа производился поиск аналогичного числа в столбце А и в ячейку D3 выводился номер строки, в которой находится найденное число?

                              Пример (смотрите прилагаемый файл):
                              В ячейку D1 вручную вводится число 515, некой формуле нужно найти такое же число в столбце А — так как оно находится в ячейке A7, то в ячейку D3 нужно записать число 7.
                              Если в ячейку D1 ввести число 443 — то так как оно находится в ячейке A2, то в ячейку D3 нужно записать число 2 и так далее.

                              Заранее огромное спасибо за помощь!

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

                              Например, есть столбец неких чисел A (числа вразнобой, но не повторяются), есть ячейка D1, в которую вводится значение для поиска и есть ячейка D3, в которую нужно вывести результат.
                              Как сделать так, чтобы при вводе в ячейку D1 некоторого числа производился поиск аналогичного числа в столбце А и в ячейку D3 выводился номер строки, в которой находится найденное число?

                              Пример (смотрите прилагаемый файл):
                              В ячейку D1 вручную вводится число 515, некой формуле нужно найти такое же число в столбце А — так как оно находится в ячейке A7, то в ячейку D3 нужно записать число 7.
                              Если в ячейку D1 ввести число 443 — то так как оно находится в ячейке A2, то в ячейку D3 нужно записать число 2 и так далее.

                              Заранее огромное спасибо за помощь! DM11

                              Сообщение Подскажите пожалуйста, как сделать так, чтобы поиск выдавал номер строки найденного значения.

                              Например, есть столбец неких чисел A (числа вразнобой, но не повторяются), есть ячейка D1, в которую вводится значение для поиска и есть ячейка D3, в которую нужно вывести результат.
                              Как сделать так, чтобы при вводе в ячейку D1 некоторого числа производился поиск аналогичного числа в столбце А и в ячейку D3 выводился номер строки, в которой находится найденное число?

                              Пример (смотрите прилагаемый файл):
                              В ячейку D1 вручную вводится число 515, некой формуле нужно найти такое же число в столбце А — так как оно находится в ячейке A7, то в ячейку D3 нужно записать число 7.
                              Если в ячейку D1 ввести число 443 — то так как оно находится в ячейке A2, то в ячейку D3 нужно записать число 2 и так далее.

                              Заранее огромное спасибо за помощь! Автор — DM11
                              Дата добавления — 01.11.2019 в 01:06

                              Источник

                              Узнать номер строки excel vba

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

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

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

                              Одинаковые переменные для всех примеров

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

                              определяя таким способом нам надо знать что:
                              1 — это номер столбца, последнюю заполненную ячейку в котором мы определяем. В данном случае это столбце №1 или А.
                              Это самый распространенный метод определения последней строки. Используя его мы можем определить последнюю ячейку только в одном конкретном столбце. Но в большинстве случаев этого достаточно.

                              Правда, следует знать одну вещь: если у вас заполнены все строки в просматриваемом столбце(или будет заполнена самая последняя ячейка столбца) — то результат будет неверный(ну или не совсем такой, какой ожидали увидеть вы)
                              Определение последнего столбца через свойство End

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

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

                              Данный метод лишен недостатков, присущих второму и третьему способам. Однако есть другой, в определенных ситуациях даже полезный: при таком методе определения игнорируются строки, скрытые фильтром, группировкой или командой Скрыть (Hide) . Т.е. если последняя строка таблицы будет скрыта, то данный метод вернет номер последней видимой заполненной строки, а не последней реально заполненной.

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

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

                              Данный метод не требует указания номера столбца и возвращает максимальную последнюю ячейку(строку — Row либо столбец — Column). Но используя данный метод следует помнить, что не всегда можно получить реальную последнюю заполненную ячейку, т.е. именно ячейку со значением. Если вы где-то ниже занесете данные и сразу удалите их из таблицы, а затем примените такой метод, то lLastRow будет равна значению строки, из которой вы только что удалили значения. Другими словами требует обязательного обновления данных, а этого можно добиться только сохранив и закрыв документ и открыв его снова. Так же, если какая-либо ячейка содержит форматирование(например, заливку), но не содержит никаких значений, то она тоже будет считаться заполненной.
                              Плюс данный метод определения последней ячейки не будет работать на защищенном листе(Рецензирование -Защитить лист).

                              Я этот метод использую только для определения в только что созданном документе, в котором только добавляю строки.

                              Способ 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(т.е. номер первой строки с данными). Если же все строки заполнены — то вернет 1.
                              • ActiveSheet.UsedRange.Rows.Count — определяем кол-во строк, входящих в весь диапазон данных на листе.
                                Т.е. получается: первая строка данных + кол-во строк с данными — 1. Зачем вычитать единицу? Попробуем посчитать вместе: первая строка: 3. Всего строк: 3. 3 + 3 = 6. Вроде все верно, чего тут непонятного? А теперь выделите на листе три ячейки, начиная с 3-ей. Все верно. Ведь у нас в 3-ей строке уже есть данные. Думаю, остальное уже понятно и без моих пояснений.
                              • То же самое и с ActiveSheet.UsedRange.Column, только уже не для строк, а для столбцов.

                              Обладает всеми недостатками предыдущего метода. . Однако, можно перед определением последней строки/столбца записать строку: With ActiveSheet.UsedRange: End With
                              Это должно переопределить границы рабочего диапазона и тогда определение последней строки/столбца сработает как ожидается, даже если до этого в ячейке содержались данные, которые впоследствии были удалены.

                              Если хотите получить первую пустую ячейку на листе придется вспомнить математику. Т.к. последнюю заполненную мы определили, то первая пустая — следующая за ней. Т.е. к результату необходимо прибавить 1.

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

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

                              Этот метод, пожалуй, самый оптимальный в случае, если надо определить последнюю строку/столбец на листе без учета форматов и формул — только по отображаемому значению в ячейке. Например, если на листе большая таблица и последние строки заполнены формулами, возвращающими пустую ячейку(=»»), предыдущие варианты вернут строку/столбец ячейки с последней формулой, в то время как данный метод вернет адрес ячейки только в случае, если в ячейке реально отображается какое-то значение. Такой подход часто используется для того, чтобы определить границы данных для последующего анализа заполненных данных, чтобы не захватывать пустые ячейки и не тратить время на их проверку.

                              Однако данный метод не будет учитывать в просмотре скрытые строки и столбцы. Это следует учитывать при его применении.

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

                              Sub Get_Last_Cell() 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 Copy_To_Last_Cell() Range(«A1:C» & Cells(Rows.Count, 1).End(xlUp).Row).Select End Sub

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

                              Sub Copy_To_Last_Cell() Range(«B1»).Copy Cells(Rows.Count, 1).End(xlUp).Offset(1) End Sub

                              Важно знать: необходимо помнить, что если ячейка содержит формулу, пусть и возвращающую значение «», Excel не считает её пустой(к слову совершенно справедливо) и включает в просмотр при поиске последней ячейки.

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

                              Поиск на листе Excel

                              Поиск какого-либо значения в ячейках Excel довольно часто встречающаяся задача при программировании какого-либо макроса. Решить ее можно разными способами. Однако, в разных ситуациях использование того или иного способа может быть не оправданным. В данной статье я рассмотрю 2 наиболее распространенных способа.

                              Поиск перебором значений

                              Довольно простой в реализации способ. Например, найти в колонке «A» ячейку, содержащую «123» можно примерно так:

                              Минусами этого так сказать «классического» способа являются: медленная работа и громоздкость. А плюсом является его гибкость, т.к. таким способом можно реализовать сколь угодно сложные варианты поиска с различными вычислениями и т.п.

                              Поиск функцией Find

                              Гораздо быстрее обычного перебора и при этом довольно гибкий. В простейшем случае, чтобы найти в колонке A ячейку, содержащую «123» достаточно такого кода:

                              Вкратце опишу что делают строчки данного кода:
                              1-я строка: Выбираем в книге лист «Данные»;
                              2-я строка: Осуществляем поиск значения «123» в колонке «A», результат поиска будет в fcell;
                              3-я строка: Если удалось найти значение, то fcell будет содержать Range-объект, в противном случае — будет пустой, т.е. Nothing.

                              Полностью синтаксис оператора поиска выглядит так:

                              Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)

                              What — Строка с текстом, который ищем или любой другой тип данных Excel

                              After — Ячейка, после которой начать поиск. Обратите внимание, что это должна быть именно единичная ячейка, а не диапазон. Поиск начинается после этой ячейки, а не с нее. Поиск в этой ячейке произойдет только когда весь диапазон будет просмотрен и поиск начнется с начала диапазона и до этой ячейки включительно.

                              LookIn — Тип искомых данных. Может принимать одно из значений: xlFormulas (формулы), xlValues (значения), или xlNotes (примечания).

                              LookAt — Одно из значений: xlWhole (полное совпадение) или xlPart (частичное совпадение).

                              SearchOrder — Одно из значений: xlByRows (просматривать по строкам) или xlByColumns (просматривать по столбцам)

                              SearchDirection — Одно из значений: xlNext (поиск вперед) или xlPrevious (поиск назад)

                              MatchCase — Одно из значений: True (поиск чувствительный к регистру) или False (поиск без учета регистра)

                              MatchByte — Применяется при использовании мультибайтных кодировок: True (найденный мультибайтный символ должен соответствовать только мультибайтному символу) или False (найденный мультибайтный символ может соответствовать однобайтному символу)

                              SearchFormat — Используется вместе с FindFormat. Сначала задается значение FindFormat (например, для поиска ячеек с курсивным шрифтом так: Application.FindFormat.Font.Italic = True), а потом при использовании метода Find указываем параметр SearchFormat = True. Если при поиске не нужно учитывать формат ячеек, то нужно указать SearchFormat = False.

                              Чтобы продолжить поиск, можно использовать FindNext (искать «далее») или FindPrevious (искать «назад»).

                              Примеры поиска функцией Find

                              Пример 1: Найти в диапазоне «A1:A50» все ячейки с текстом «asd» и поменять их все на «qwe»

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

                              Пример 2: Правильный поиск значения с использованием FindNext, не приводящий к зацикливанию.

                              В ниже следующем примере используется другой вариант продолжения поиска — с помощью той же функции Find с параметром After. Когда найдена очередная ячейка, следующий поиск будет осуществляться уже после нее. Однако, как и с FindNext, когда будет достигнут конец диапазона, Find продолжит поиск с его начала, поэтому, чтобы не произошло зацикливания, необходимо проверять совпадение с первым результатом поиска.

                              Пример 3: Продолжение поиска с использованием Find с параметром After.

                              Следующий пример демонстрирует применение SearchFormat для поиска по формату ячейки. Для указания формата необходимо задать свойство FindFormat.

                              Пример 4: Найти все ячейки с шрифтом «курсив» и поменять их формат на обычный (не «курсив»)

                              Примечание: В данном примере намеренно не используется FindNext для поиска следующей ячейки, т.к. он не учитывает формат (статья об этом: https://support.microsoft.com/ru-ru/kb/282151)

                              Коротко опишу алгоритм поиска Примера 4. Первые две строки определяют последнюю строку (lLastRow) на листе и последний столбец (lLastCol). 3-я строка задает формат поиска, в данном случае, будем искать ячейки с шрифтом Italic. 4-я строка определяет область ячеек с которой будет работать программа (с ячейки A1 и до последней строки и последнего столбца). 5-я строка осуществляет поиск с использованием SearchFormat. 6-я строка — цикл пока результат поиска не будет пустым. 7-я строка — меняем шрифт на обычный (не курсив), 8-я строка продолжаем поиск после найденной ячейки.

                              Хочу обратить внимание на то, что в этом примере я не стал использовать «защиту от зацикливания», как в Примерах 2 и 3, т.к. шрифт меняется и после «прохождения» по всем ячейкам, больше не останется ни одной ячейки с курсивом.

                              Свойство FindFormat можно задавать разными способами, например, так:

                              Следующий пример — применение функции Find для поиска последней ячейки с заполненными данными. Использованные в Примере 4 SpecialCells находит последнюю ячейку даже если она не содержит ничего, но отформатирована или в ней раньше были данные, но были удалены.

                              Пример 5: Найти последнюю колонку и столбец, заполненные данными

                              В этом примере используется UsedRange, который так же как и SpecialCells возвращает все используемые ячейки, в т.ч. и те, что были использованы ранее, а сейчас пустые. Функция Find ищет ячейку с любым значением с конца диапазона.

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

                              Пример 6: Выделить красным шрифтом ячейки, в которых текст начинается со слова из 4-х букв, первая и последняя буквы «т», при этом после этого слова может следовать любой текст.

                              Для поиска функцией Find по маске (шаблону) можно применять символы:
                              * — для обозначения любого количества любых символов;
                              ? — для обозначения одного любого символа;

                              — для обозначения символов *, ? и

                              . (т.е. чтобы искать в тексте вопросительный знак, нужно написать

                              ?, чтобы искать именно звездочку (*), нужно написать

                              * и наконец, чтобы найти в тексте тильду, необходимо написать

                              Поиск даты с помощью Find

                              Если необходимо найти текущую дату или какую-то другую дату на листе Excel или в диапазоне с помощью Find, необходимо учитывать несколько нюансов:

                              • Тип данных Date в VBA представляется в виде #[месяц]/[день]/[год]#, соответственно, если необходимо найти фиксированную дату, например, 01 марта 2018 года, необходимо искать #3/1/2018#, а не «01.03.2018»
                              • В зависимости от формата ячеек, дата может выглядеть по-разному, поэтому, чтобы искать дату независимо от формата, поиск нужно делать не в значениях, а в формулах, т.е. использовать LookIn:=xlFormulas

                              Приведу несколько примеров поиска даты.

                              Пример 7: Найти текущую дату на листе независимо от формата отображения даты.

                              Пример 8: Найти 1 марта 2018 г.

                              Искать часть даты — сложнее. Например, чтобы найти все ячейки, где месяц «март», недостаточно искать «03» или «3». Не работает с датами так же и поиск по шаблону. Единственный вариант, который я нашел — это выбрать формат в котором месяц прописью для ячеек с датами и искать слово «март» в xlValues.

                              Тем не менее, можно найти, например, 1 марта независимо от года.

                              Пример 9: Найти 1 марта любого года.

                              VBA Excel: how to get row and column number of named range?

                              I have the following problem and it’s driving me NUTS! I work on a large database program in Excel, and I’m trying to retrieve the row and column numbers of specific named ranges. The following code used to work (temp_entryvalue is the name of the range):

                              I get the ole’ Error 1004. Troubleshooting a bit, the problem here seems to be that the range associated with temp_entryvalue is hidden in the excel sheet, however the name is defined and there is a row and column number assigned to.

                              This however, all used to work. Until I changed one thing: instead of writing directly to the database excel worksheet, I first put everything in an array, so that only at the very end I open the database worksheet and copy all the data. Before I did this, everything used to work fine.

                              So how do I fix this? How do I retrieve the row and column number of a Named Range that is hidden, but DOES have a row and column number associated to it?

                              1 ответ

                              That’s a strange question you are having there. However, in general getting the column and row of a hidden worksheet should be trivial, thus I suppose you are making some small mistake somewhere.

                              Open a new Excel file and try this code:

                              Or if you really mean NamedRange (your code looks like if the range is declared as a variable), then this is probably the easiest solution:

                              Создан 20 дек. 17 2017-12-20 11:24:40 Vityata

                              Thank you for the quick answer. However, I opened a clean new worksheet, pasted your first bit of code into the worksheet code section, and it’s still giving me the 1004 error. Any ideas what this could mean? – The Brainlet Exterminator 20 дек. 17 2017-12-20 11:32:07

                              Which first bit? @TheBrainletExterminator – Vityata 20 дек. 17 2017-12-20 11:32:36

                              Under «Open a new Excel file and try this code:» and above «Or if you really mean . » – The Brainlet Exterminator 20 дек. 17 2017-12-20 11:36:20

                              @TheBrainletExterminator — that is strange. Where do you put the code? Do you put it in a module? Are you sure that you open a New Excel workbook? Can you restart your PC and try again? (I am not joking about the resetart, it can be that you have more than 1 workbook opened and you are somehow calling the wrong code). – Vityata 20 дек. 17 2017-12-20 11:41:37

                              Yep, new workbook, pasted the code behind the sheet. Just restarted my computer — same issue. – The Brainlet Exterminator 20 дек. 17 2017-12-20 11:47:40

                              @TheBrainletExterminator — put it behind a module, not behind a sheet. – Vityata 20 дек. 17 2017-12-20 11:48:54

                              Did that, still Error 1004. This time with the message that property Visible of class «Worksheet» can not be set up (Excel at my job is in my native language, so I’m not sure what it says literally). – The Brainlet Exterminator 20 дек. 17 2017-12-20 11:56:00

                              If you have only one sheet in the workbook, you cannot hide it and you might be getting error on the line ‘Worksheets(1).Visible = xlVeryHidden’ Right? – sktneer 20 дек. 17 2017-12-20 12:01:26

                              @sktneer Oh I did not notice that! You’re absolutely right, now I don’t get the error. – The Brainlet Exterminator 20 дек. 17 2017-12-20 12:03:22

                              @TheBrainletExterminator — so I suppose you were using Excel-2016? – Vityata 20 дек. 17 2017-12-20 13:15:52

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

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

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

                              Одинаковые переменные для всех примеров

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

                              определяя таким способом нам надо знать что:
                              1 — это номер столбца, последнюю заполненную ячейку в котором мы определяем. В данном случае это столбце №1 или А.
                              Это самый распространенный метод определения последней строки. Используя его мы можем определить последнюю ячейку только в одном конкретном столбце. Но в большинстве случаев этого достаточно.

                              Правда, следует знать одну вещь: если у вас заполнены все строки в просматриваемом столбце(или будет заполнена самая последняя ячейка столбца) — то результат будет неверный(ну или не совсем такой, какой ожидали увидеть вы)
                              Определение последнего столбца через свойство End

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

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

                              Данный метод лишен недостатков, присущих второму и третьему способам. Однако есть другой, в определенных ситуациях даже полезный: при таком методе определения игнорируются строки, скрытые фильтром, группировкой или командой Скрыть (Hide) . Т.е. если последняя строка таблицы будет скрыта, то данный метод вернет номер последней видимой заполненной строки, а не последней реально заполненной.

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

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

                              Данный метод не требует указания номера столбца и возвращает максимальную последнюю ячейку(строку — Row либо столбец — Column). Но используя данный метод следует помнить, что не всегда можно получить реальную последнюю заполненную ячейку, т.е. именно ячейку со значением. Если вы где-то ниже занесете данные и сразу удалите их из таблицы, а затем примените такой метод, то lLastRow будет равна значению строки, из которой вы только что удалили значения. Другими словами требует обязательного обновления данных, а этого можно добиться только сохранив и закрыв документ и открыв его снова. Так же, если какая-либо ячейка содержит форматирование(например, заливку), но не содержит никаких значений, то она тоже будет считаться заполненной.
                              Плюс данный метод определения последней ячейки не будет работать на защищенном листе(Рецензирование -Защитить лист).

                              Я этот метод использую только для определения в только что созданном документе, в котором только добавляю строки.

                              Способ 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(т.е. номер первой строки с данными). Если же все строки заполнены — то вернет 1.
                              • ActiveSheet.UsedRange.Rows.Count — определяем кол-во строк, входящих в весь диапазон данных на листе.
                                Т.е. получается: первая строка данных + кол-во строк с данными — 1. Зачем вычитать единицу? Попробуем посчитать вместе: первая строка: 3. Всего строк: 3. 3 + 3 = 6. Вроде все верно, чего тут непонятного? А теперь выделите на листе три ячейки, начиная с 3-ей. Все верно. Ведь у нас в 3-ей строке уже есть данные. Думаю, остальное уже понятно и без моих пояснений.
                              • То же самое и с ActiveSheet.UsedRange.Column, только уже не для строк, а для столбцов.

                              Обладает всеми недостатками предыдущего метода. . Однако, можно перед определением последней строки/столбца записать строку: With ActiveSheet.UsedRange: End With
                              Это должно переопределить границы рабочего диапазона и тогда определение последней строки/столбца сработает как ожидается, даже если до этого в ячейке содержались данные, которые впоследствии были удалены.

                              Если хотите получить первую пустую ячейку на листе придется вспомнить математику. Т.к. последнюю заполненную мы определили, то первая пустая — следующая за ней. Т.е. к результату необходимо прибавить 1.

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

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

                              Этот метод, пожалуй, самый оптимальный в случае, если надо определить последнюю строку/столбец на листе без учета форматов и формул — только по отображаемому значению в ячейке. Например, если на листе большая таблица и последние строки заполнены формулами, возвращающими пустую ячейку(=»»), предыдущие варианты вернут строку/столбец ячейки с последней формулой, в то время как данный метод вернет адрес ячейки только в случае, если в ячейке реально отображается какое-то значение. Такой подход часто используется для того, чтобы определить границы данных для последующего анализа заполненных данных, чтобы не захватывать пустые ячейки и не тратить время на их проверку.

                              Однако данный метод не будет учитывать в просмотре скрытые строки и столбцы. Это следует учитывать при его применении.

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

                              Sub Get_Last_Cell() 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 Copy_To_Last_Cell() Range(«A1:C» & Cells(Rows.Count, 1).End(xlUp).Row).Select End Sub

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

                              Sub Copy_To_Last_Cell() Range(«B1»).Copy Cells(Rows.Count, 1).End(xlUp).Offset(1) End Sub

                              Важно знать: необходимо помнить, что если ячейка содержит формулу, пусть и возвращающую значение «», Excel не считает её пустой(к слову совершенно справедливо) и включает в просмотр при поиске последней ячейки.

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

                              Open Notes

                              Обо всём, что мне интересно

                              Полезные команды VBA

                              Пополняемый список полезных отрывков кода VBA для выполнения часто востребованных действий в MS Excel.

                              Служебные команды для ускорения скорости выполнения макроса:

                              ‘Отключение отображения выполняемых действий Application.ScreenUpdating = False ‘Предотвращение появления предупреждающих сообщений Application.DisplayAlerts = False ‘Предотвращение появления предупреждения об обновлении связей данных Application.AskToUpdateLinks = False ‘Очистка буфера обмена Application.CutCopyMode = False

                              Проверка имени пользователя, запустившего макрос:

                              Чтобы проверить, какой пользователь открыл книгу Excel можно использовать один из следующих вариантов:

                              If Application.UserName = «Имя_автора_документа» Then .

                              If Environ(«username») = «user» Then .

                              Поиск последней строки таблицы:

                              Set myWSheet = ThisWorkbook.Sheets(«Имя_листа») With myWSheet ‘Определение индекса последней строки таблицы lastRow = .Cells(Rows.Count, 1).End(xlUp).Row ‘Определение значения в ячейки последней строке столбца A lastARow = .Range(«A» & lastRow).Value End With

                              Замена формулы на значение:

                              Добавление нового листа с именем после всех существующих:

                              Worksheets.Add (After:=Worksheets(Worksheets.Count)).Name = «Имя_листа»

                              Как узнать последний день предыдущего месяца:

                              LastMonthDay = DateAdd(«d», -1, DateSerial(Year(dtDate), Month(dtDate), 1))

                              Определение оставшихся дней месяца:

                              dToEndOfMonth = DateDiff(«d», dFrom, DateAdd(«d», -1, _ DateSerial(Year(dFrom), Month(dFrom) + 1, 1)))

                              Номер текущего дня в неделе (воскресенье — первый день):

                              DayOfWeek = DatePart(«w», dToday)

                              Создание нового файла из текущего:

                              pathNewBook = «C:Temp» nameNewBook = «Имя_нового_файла.xls» Workbooks.Add ActiveWorkbook.SaveAs Filename:=pathNewBook & nameNewBook ActiveWorkbook.Close True

                              Сохранить текущий файл в формате CSV

                              Чтобы при сохранении файла в формате CSV, вместо запятых в качестве разделителя использовалась точка с запятой, следует использовать подобный код:

                              ActiveWorkbook.SaveAs FileName:=»Name.csv», FileFormat:=xlCSV, _ CreateBackup:=False, Local:=True ActiveWorkbook.Saved = True ActiveWorkbook.Close True

                              Копирование данных из одного файла в другой:

                              wbPath = «C:Temp» wbName = «Имя_файла_откуда_копируем.xls» Workbooks.Open (wbPath & wbName) Set WB = Workbooks(wbName) WB.Sheets(«Лист 1»).Range(«A1:С10»).Copy Sheet(«Лист_в_текущем_файле»).Range(«A2»).PasteSpecial xlPasteValues

                              Чтобы открыть файл только для чтения, следует использовать:

                              Workbooks.Open (Filename:=wbPath & wbName, ReadOnly:=True)

                              Предотвращение ошибки при неудачном поиске значения в таблице:

                              Set DateRowObj = WB.Sheets(«Имя_листа»).Range(«A:A»)._ Find(What:=dtToAsDate, LookIn:=xlFormulas) If (DateRowObj Is Nothing) Then WB.Close False MsgBox «Данные не найдены.» Else DateRow = DateRowObj.Row ‘Номер строки с искомым значением End If

                              Как получить имя активной книги Excel без его расширения (без .xls либо без .xlsx):

                              wbName = Left(ActiveWorkbook.Name, InStrRev(ActiveWorkbook.Name, «.») — 1)

                              Проверка существования файла:

                              fPath = «C:Temp» fName = «Файл.txt» If Dir(fPath & fName) = «» Then MsgBox «Файл не найден:» & Chr(13) & fPath & fName Exit Sub End If

                              Кнопка, скрывающая/разворачивающая часть таблицы:

                              Private Sub tbVid_Click() Application.ScreenUpdating = False If tbVid Then tbVid.Caption = «Скрыть» ActiveSheet.Rows(«2:29»).Hidden = False Else tbVid.Caption = «Развернуть» ActiveSheet.Rows(«2:29»).Hidden = True End If End Sub

                              Обновление сводной таблицы:

                              currPath = ThisWorkbook.Path currWBName = ThisWorkbook.Name ListName.PivotTables(«СводнаяТаблица1»).ChangePivotCache ActiveWorkbook. _ PivotCaches.Create(SourceType:=xlDatabase, SourceData:=currPath & «[» & _ currWBName & «]Лист1!R1C1:R10C5»)

                              Обращение к элементам Frame:

                              Замена #ДЕЛ/0! в диапазоне:

                              Selection.Replace What:=»#DIV/0!», Replacement:=»», LookAt:=xlPart,_ SearchOrder:=xlByRows, MatchCase:=False,_ SearchFormat:=False, ReplaceFormat:=False

                              Количество строк в отфильтрованной таблице:

                              Быстро убрать лишние пробелы в диапазоне:

                              Программно снять защиту с листа:

                              Работа с диапазоном

                              Умножить диапазон на число:

                              ThisWorkbook.Sheets(1).Range(«A1:A10») = _ ThisWorkbook.Sheets(1).Evaluate(«A1:A10» & «*80»)

                              Добавить ко всем значениям диапазона строку:

                              ThisWorkbook.Range(«A1:A10»).Value = _ Evaluate(«=»»» & addTxt & «»» & » & ThisWorkbook.Range(«A1:A10»).Address)

                              Сортировка выбранного столбца в сводной таблице

                              Источник

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