Поиск номера строки vba excel

 

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

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

Сообщений: 336
Регистрация: 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

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

Сообщений: 336
Регистрация: 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

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

Сообщений: 336
Регистрация: 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

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

Сообщений: 336
Регистрация: 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

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

Сообщений: 336
Регистрация: 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

First Cell in Column Function

It is assumed that you’re looking for a VBA function to use in Excel to calculate the first non-empty row of a column (specified by a range).

Features

  • The Volatile method marks a user-defined function as volatile. A
    volatile function must be recalculated whenever calculation occurs in
    any cells on the worksheet. A nonvolatile function is recalculated
    only when the input variables change (VBA Help).
  • At least for the sake of correctness, you have to use IsEmpty
    instead of «» for the reason e.g. if the cell in the resulting row
    contains a formula that evaluates to «», it will be ignored.
  • The Find Method Version uses the Find method to calculate the First Row, which is safer than
    the End Version e.g. if you input a value into the first cell of the
    column i.e. the result is 1 and you hide the first row, the result of
    the End Version will not be 1.
  • The formula can be inserted in the same column as SelectRange
    Column. In some cases the End Version would not show the correct
    result or create a circular reference. Therefore ThisCell is used
    in the End version and 0 is returned if no value was found in SelectRange column.

Find Method Version

Function FirstRowFind(SelectRange As Range) As Long

    Application.Volatile

    Dim FirstCell As Range

    With Columns(SelectRange.Column)
        Set FirstCell = .Find("*", .Cells(.Cells.Count), -4123, 1, 2, 1)
    End With

    If Not FirstCell Is Nothing Then
        FirstRowFind = FirstCell.Row
    End If

End Function

Find Method

Instead of

Set FirstCell = .Find("*", .Cells(.Cells.Count), -4123, 1, 2, 1)

you can use

Set FirstCell = .Find("*", .Cells(.Cells.Count), _
        xlFormulas, xlWhole, xlByColumns, xlNext)

or

Set FirstCell = .Find(What:="*", After:=.Cells(.Cells.Count), _
        LookIn:=xlFormulas, LookAt:=xlWhole, _
        SearchOrder:=xlByColumns, SearchDirection:=xlNext)

The parameters for the arguments LookAt(unimportant in this case) and SearchDirection(Default is Next) can be omitted, but since I couldn’t find any difference in efficiency, I didn’t.

Usage in Excel

For Column AB:

=FirstRowFind(AB1)
=FirstRowFind(AB20)
=FirstRowFind(AB17:AH234)

End Version (Not recommended)

Function FirstRowEnd(SelectRange As Range) As Long

    Application.Volatile

    Dim FirstCell As Range

    If Application.ThisCell.Column = SelectRange.Column Then Exit Function

    If Not IsEmpty(SelectRange.Cells(1)) Then
        FirstRowEnd = 1
      Else
        Set FirstCell = Cells(1, SelectRange.Column).End(xlDown)
        FirstRowEnd = FirstCell.Row
        If FirstRowEnd = Rows.Count And IsEmpty(FirstCell) Then
            FirstRowEnd = 0
        End If
    End If

End Function

Usage in Excel

For Column AB:

=FirstRowEnd(AB1)
=FirstRowEnd(AB20)
=FirstRowEnd(AB17:AH234)

I have the following column (column A) named project (rows column is just displaying the row number):

rows    project
1       14
2       15
3       16
4       17
5       18
6       19
7       ProjTemp
8       ProjTemp
9       ProjTemp

I have an input message box where the user writes the new project name which I want inserted right after the last one. Ex: project 20 will be inserted right after project 19 and before the first «ProjTemp».

My theory was to locate the row number of the first «ProjTemp» and then insert a new row where the project is 20.

I was trying to use the Find function but I’m getting an overflow error (I’m sure I’m getting it because it’s finding 3 «ProjTemp» strings and trying to set it to one parameter):

Dim FindRow as Range

with WB.Sheets("ECM Overview")
    Set FindRow = .Range("A:A").Find(What:="ProjTemp", _
                        After:=.Cells(.Cells.Count), _
                        LookIn:=xlValues, _
                        LookAt:=xlWhole, _
                        SearchOrder:=xlByRows, _
                        MatchCase:=False)
end with

How do I code this so I only find the row number of the fist «ProjTemp»?
Is there a better way to do this, maybe a loop?

Thanks, any help will be appreciated!

    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,0398 ]   [ 16 queries used ]   [ Generated: 16.04.23, 15:54 GMT ]  

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

                              Номер последней заполненной строки в таблице Excel обычно используется в коде VBA для определения следующей за ней первой пустой строки для добавления новой записи. А также для задания интервала для поиска и обработки информации с помощью цикла For… Next (указание границ обрабатываемого диапазона).

                              Переменную, которой присваивается номер последней строки, следует объявлять как Long или Variant, например: Dim PosStr As Long. В современных версиях Excel количество строк на рабочем листе превышает максимальное значение типа данных Integer.

                              Таблица в верхнем левом углу

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

                              Пример таблицы с набором данных в Excel

                              Пример таблицы с набором данных в Excel

                              Вариант 1
                              Основная формула для поиска последней строки в такой таблице, не требующая соблюдения каких-либо условий:
                              PosStr = Cells(1, 1).CurrentRegion.Rows.Count

                              Вариант 2
                              Ниже таблицы не должно быть никаких записей, в том числе ранее удаленных:
                              PosStr = ActiveSheet.UsedRange.Rows.Count

                              Вариант 3
                              В первом столбце таблицы не должно быть пропусков, а также в таблице должно быть не менее двух заполненных строк, включая строку заголовков:
                              PosStr = Cells(1, 1).End(xlDown).Row

                              Вариант 4
                              В первой колонке рабочего листа внутри таблицы не должно быть пропусков, а ниже таблицы в первой колонке не должно быть других заполненных ячеек:
                              PosStr = WorksheetFunction.CountA(Range("A:A"))

                              Вариант 5
                              Ниже таблицы не должно быть никаких записей:
                              PosStr = Cells.SpecialCells(xlLastCell).Row

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

                              Последнюю заполненную строку для любой таблицы будем искать, отталкиваясь от ее верхней левой ячейки: Cells(a, b).

                              Вариант 1
                              Основная формула для поиска последней строки в любой таблице, не требующая соблюдения каких-либо условий:
                              PosStr = Cells(a, b).CurrentRegion.Cells(Cells(a, b).CurrentRegion.Cells.Count).Row

                              Вариант 2
                              Дополнительная формула с условием, что в первом столбце таблицы нет пустых ячеек:
                              PosStr = Cells(a, b).End(xlDown).Row

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

                              Понравилась статья? Поделить с друзьями:
                            • Поиск номера столбца по значению excel
                            • Поиск новой строки в excel
                            • Поиск неуникальных значений в excel
                            • Поиск неточного совпадения текста в excel
                            • Поиск несохраненных документов word