Excel макрос найти значение в столбце

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

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

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

Sheets("Данные").Select
For y = 1 To Cells.SpecialCells(xlLastCell).Row
    If Cells(y, 1) = "123" Then
        Exit For
    End If
Next y
MsgBox "Нашел в строке: " + CStr(y)

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

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

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

Sheets("Данные").Select
Set fcell = Columns("A:A").Find("123")
If Not fcell Is Nothing Then
    MsgBox "Нашел в строке: " + CStr(fcell.Row)
End If

Вкратце опишу что делают строчки данного кода:
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»

With Worksheets(1).Range("A1:A50")
  Set c = .Find("asd", LookIn:=xlValues)
  Do While Not c Is Nothing
    c.Value = "qwe"
    Set c = .FindNext(c)
  Loop
End With

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

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

With Worksheets(1).Range("A1:A50")
  Set c = .Find("asd", lookin:=xlValues)
  If Not c Is Nothing Then
    firstResult = c.Address
    Do
      c.Font.Bold = True
      Set c = .FindNext(c)
      If c Is Nothing Then Exit Do
    Loop While c.Address <> firstResult
  End If
End With

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

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

With Worksheets(1).Range("A1:A50")
  Set c = .Find("asd", lookin:=xlValues)
  If Not c Is Nothing Then
    firstResult = c.Address
    Do
      c.Font.Bold = True
      Set c = .Find("asd", After:=c, lookin:=xlValues)
      If c Is Nothing Then Exit Do
    Loop While c.Address <> firstResult
  End If
End With

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

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

lLastRow = Cells.SpecialCells(xlLastCell).Row
lLastCol = Cells.SpecialCells(xlLastCell).Column
Application.FindFormat.Font.Italic = True
With Worksheets(1).Range(Cells(1, 1), Cells(lLastRow, lLastCol))
  Set c = .Find("", SearchFormat:=True)
  Do While Not c Is Nothing
    c.Font.Italic = False
    Set c = .Find("", After:=c, SearchFormat:=True)
  Loop
End With

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

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

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

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

With Application.FindFormat.Font 
  .Name = "Arial" 
  .FontStyle = "Regular" 
  .Size = 10 
End With

Поиск последней заполненной ячейки с помощью Find

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

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

Set c = Worksheets(1).UsedRange.Find("*", SearchDirection:=xlPrevious)
If Not c Is Nothing Then
  lLastRow = c.Row: lLastCol = c.Column 
Else
  lLastRow = 1: lLastCol = 1
End If
MsgBox "lLastRow=" & lLastRow & " lLastCol=" & lLastCol

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

Поиск по шаблону (маске)

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

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

With Worksheets(1).Cells
  Set c = .Find("т??т*", LookIn:=xlValues, LookAt:=xlWhole)
  If Not c Is Nothing Then
    firstResult = c.Address
    Do
      c.Font.Color = RGB(255, 0, 0)
      Set c = .FindNext(c)
      If c Is Nothing Then Exit Do
    Loop While c.Address <> firstResult
  End If
End With

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

Поиск в скрытых строках и столбцах

Для поиска в скрытых ячейках нужно учитывать лишь один нюанс: поиск нужно осуществлять в формулах, а не в значениях, т.е. нужно использовать LookIn:=xlFormulas

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

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

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

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

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

d = Date
Set c = Cells.Find(d, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not c Is Nothing Then
  MsgBox "Нашел"
Else
  MsgBox "Не нашел"
End If

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

d = #3/1/2018#
Set c = Cells.Find(d, LookIn:=xlFormulas, LookAt:=xlWhole)
If Not c Is Nothing Then
  MsgBox "Нашел"
Else
  MsgBox "Не нашел"
End If

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

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

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

d = #3/1/1900#
Set c = Cells.Find(Format(d, "m/d/"), LookIn:=xlFormulas, LookAt:=xlPart)
If Not c Is Nothing Then
  MsgBox "Нашел"
Else
  MsgBox "Не нашел"
End If

Метод 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

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

ghebog

4 / 4 / 1

Регистрация: 12.08.2012

Сообщений: 67

1

Поиск по столбцу

02.04.2013, 13:33. Показов 38073. Ответов 10

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Всем привет!
Тема уже избитая, но все равно я не нашел ответа на вопрос.

На таблице есть два столбца. В первом данные, во втором вычисления(формулы).
Нужно найти значение в столбце при помощи Find(What…).
Поиск по первому столбцу работает, а по второму выдает ошибку.
Как организовать поиск по второму столбцу?

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Sub CommandButton1_Click()
'Поиск по первому столбцу
    Dim iRange As Range
    Dim iFind As String
    Dim iRow As Integer
    iFind = Worksheets("Лист1").Cells(3, 1).Value
    Set iRange = Worksheets("Лист1").Columns("A:A").Find(What:=iFind)
    iRow = iRange.Row
    
'Поиск по второму столбцу
    Dim iRange0 As Range
    Dim iFind0 As String
    Dim iRow0 As Integer
    iFind0 = Worksheets("Лист1").Cells(3, 2).Value
    Set iRange0 = Worksheets("Лист1").Columns("B:B").Find(What:=iFind0)
    iRow0 = iRange0.Row
    
'Проверка
    MsgBox ("iFind= " & iFind & Chr(13) & _
            "iRow= " & iRow & Chr(13) & Chr(13) & _
            "iFind0= " & iFind0 & Chr(13) & _
            "iRow0= " & iRow0)
    
End Sub

Вложения

Тип файла: xls Поиск.xls (40.5 Кб, 151 просмотров)



0



IvanOK

693 / 99 / 10

Регистрация: 25.06.2011

Сообщений: 718

02.04.2013, 14:00

2

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Sub CommandButton1_Click()
'1-й Блок
    Dim iRange As Range
    Dim iFind As String
    Dim iRow As Integer
    iFind = Worksheets("Лист1").Cells(3, 1).Value
    Set iRange = Worksheets("Лист1").Columns("A:A").Find(What:=iFind, LookIn:=xlValues)
    iRow = iRange.Row
    
'2-й Блок
    Dim iRange0 As Range
    Dim iFind0 As String
    Dim iRow0 As Integer
    iFind0 = Worksheets("Лист1").Cells(3, 2).Value
    Set iRange0 = Worksheets("Лист1").Columns("B:B").Find(What:=iFind0, LookIn:=xlValues)
    iRow0 = iRange0.Row
    
'Проверка
    MsgBox ("iFind= " & iFind & Chr(13) & _
            "iRow= " & iRow & Chr(13) & Chr(13) & _
            "iFind0= " & iFind0 & Chr(13) & _
            "iRow0= " & iRow0)
    
End Sub

ты ищещь по умолчанию , а ето значит по формулам, а нужно искать по значению



1



4 / 4 / 1

Регистрация: 12.08.2012

Сообщений: 67

02.04.2013, 14:09

 [ТС]

3

Цитата
Сообщение от IvanOK
Посмотреть сообщение

ты ищещь по умолчанию , а ето значит по формулам, а нужно искать по значению

Спасибо, помогло!

Не по теме:

Пинок в зад — отличный повод для шага вперед.



0



5468 / 1148 / 50

Регистрация: 15.09.2012

Сообщений: 3,514

02.04.2013, 14:20

4

VBA-Excel-команда «Find» связана с окном «Найти и заменить» в программе «Excel».
Поэтому в команде «Find» нужно указывать все парметры (я обычно не указываю параметр «After»), чтобы на работу кода не влияли настройки окна «Найти и заменить».



2



4 / 4 / 1

Регистрация: 12.08.2012

Сообщений: 67

02.04.2013, 14:46

 [ТС]

5

Цитата
Сообщение от Скрипт
Посмотреть сообщение

VBA-Excel-команда «Find» связана с окном «Найти и заменить» в программе «Excel».
Поэтому в команде «Find» нужно указывать все парметры (я обычно не указываю параметр «After»), чтобы на работу кода не влияли настройки окна «Найти и заменить».

В моем случае помогло только добавление LookIn:=xlValues.
По любому спасибо за дополнение.



0



5468 / 1148 / 50

Регистрация: 15.09.2012

Сообщений: 3,514

02.04.2013, 14:50

6

Цитата
Сообщение от ghebog
Посмотреть сообщение

В моем случае помогло только добавление LookIn:=xlValues.

ghebog, потому что в окне «Найти и заменить» было всё то, что вам нужно.



0



ghebog

4 / 4 / 1

Регистрация: 12.08.2012

Сообщений: 67

12.04.2013, 12:02

 [ТС]

7

Всем привет!
Задача такая:
В столбце «А» — имена, в столбце «В» — номера.
В ячейке «В1» вводится искомое значение и по нажатию кнопки ведется поиск на наличие в диапазоне
Range(«B3:B» & Cells(Rows.Count, «B»).End(xlUp).Row).

Если значение найдено — выводится сообщение со значением из первого столбца той же строки.

Это получается.

Если значение не найдено — оно (значение) добавляется в последнюю ячейку столбца «В».

Это не получается.

Подтолкните в нужное направление.
Заранее благодарен.

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Sub CommandButton1_Click()
    Dim whereImLooking As Range
    Set whereImLooking = Worksheets("Ëèñò1").Range("B3:B" & Cells(Rows.Count, "B").End(xlUp).Row)
    
    Dim iLookingFor As String
    iLookingFor = Worksheets("Ëèñò1").Cells(1, 2).Value
    
    Dim iRowErr As Integer
    
    If iLookingFor = whereImLooking.Find(What:=iLookingFor, LookIn:=xlValues, LookAt:=xlPart, _
                                        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, _
                                        MatchCase:=False, SearchFormat:=False) Then
        iRowErr = whereImLooking.Find(What:=iLookingFor, LookIn:=xlValues, LookAt:=xlPart, _
                                        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, _
                                        MatchCase:=False, SearchFormat:=False).Row
        MsgBox "Óæå åñòü !" & Chr(13) & Chr(13) & "Âîò æå îíî :)" & Chr(13) & _
            (Worksheets("Ëèñò1").Cells(iRowErr, 1).Value), vbCritical, "ÂÍÈÌÀÍÈÅ"
            Worksheets("Ëèñò1").Cells(iRowErr, 1).Select
        Exit Sub
    Else
        Worksheets("Ëèñò1").Cells(Cells(Rows.Count, 2).End(xlUp).Row + 1, 2).Value = iLookingFor
        MsgBox "Íå çàáóäü äîáÿâèòü èìÿ!", vbExclamation, "ÂÍÈÌÀÍÈÅ"
        Worksheets("Ëèñò1").Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 2).Select
    End If
End Sub

Вложения

Тип файла: rar Поиск.rar (17.5 Кб, 109 просмотров)



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

12.04.2013, 13:09

8

Пробуйте, разбирайтесь

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Sub CommandButton1_Click()
    Dim whereImLooking As Range
    Dim myCell As Range
    Set whereImLooking = Worksheets("Лист1").Range("B3:B" & Cells(Rows.Count, "B").End(xlUp).Row)
    
    Dim iLookingFor As String
    iLookingFor = Worksheets("Лист1").Cells(1, 2).Value
    
    Dim iRowErr As Integer
    
    Set myCell = whereImLooking.Find(What:=iLookingFor, LookIn:=xlValues, LookAt:=xlPart, _
                                        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, _
                                        MatchCase:=False, SearchFormat:=False)
    If Not myCell Is Nothing Then 'найдено
        myCell.Select
        MsgBox "Уже есть !" & vbLf & vbLf & "Вот же оно :)" & vbLf & _
            myCell, vbCritical, "ВНИМАНИЕ"
        Exit Sub
    Else
        Worksheets("Лист1").Cells(Cells(Rows.Count, 2).End(xlUp).Row + 1, 2).Select
        Selection.Value = iLookingFor
        MsgBox "Не забудь добявить имя!", vbExclamation, "ВНИМАНИЕ"
'        Worksheets("Лист1").Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 2).Select
    End If
End Sub



1



ghebog

4 / 4 / 1

Регистрация: 12.08.2012

Сообщений: 67

12.04.2013, 13:51

 [ТС]

9

Цитата
Сообщение от Казанский
Посмотреть сообщение

Пробуйте, разбирайтесь

ОК! Ща бум)))

Добавлено через 8 минут
Вроде ищем ячейку со значением, а не само значение…

Добавлено через 26 минут
Казанский, еще раз СПАСИБО!
Окончательный вариант:

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Sub CommandButton1_Click()
    Dim whereImLooking As Range
    Dim iRowErr As Integer
    Set whereImLooking = Worksheets("Ëèñò1").Range("B3:B" & Cells(Rows.Count, "B").End(xlUp).Row)
    Dim iLookingFor As String
    iLookingFor = Worksheets("Ëèñò1").Cells(1, 2).Value
    Dim myCell As Range
    Set myCell = whereImLooking.Find(What:=iLookingFor, LookIn:=xlValues, LookAt:=xlPart, _
                                        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, _
                                        MatchCase:=False, SearchFormat:=False)
    If Not myCell Is Nothing Then 'íàéäåíî
        myCell.Select
        iRowErr = myCell.Row
        MsgBox "Óæå åñòü !" & vbLf & vbLf & "Âîò æå îíî :)" & vbLf & _
            (Worksheets("Ëèñò1").Cells(iRowErr, 1).Value), vbCritical, "ÂÍÈÌÀÍÈÅ"
            Worksheets("Ëèñò1").Cells(iRowErr, 1).Select
        Exit Sub
    Else
        Worksheets("Ëèñò1").Cells(Cells(Rows.Count, 2).End(xlUp).Row + 1, 2).Select
        Selection.Value = iLookingFor
        MsgBox "Íå çàáóäü äîáÿâèòü èìÿ!", vbExclamation, "ÂÍÈÌÀÍÈÅ"
        Worksheets("Ëèñò1").Cells(Selection.Row, 1).Select
    End If
End Sub



0



Апострофф

12.04.2013, 13:58

Не по теме:

17-я строка лишняя:scratch:



0



4 / 4 / 1

Регистрация: 12.08.2012

Сообщений: 67

12.04.2013, 15:44

 [ТС]

11

Цитата
Сообщение от Апострофф
Посмотреть сообщение

17-я строка лишняя

Не по теме:

В данном контексте согласен на все 100.
А как поведет себя код, если на кнопку повешаны (кнопка на юзерФорм) и другие действия и расчеты?

Добавлено через 1 час 33 минуты
Поправка 4-й строки.
Если диапазон на другом листе, тогда везде надо явно указать лист.
Set whereImLooking = Worksheets(«Лист1»).Range(«B3:B» & Worksheets(«Лист1»).Cells(Rows.Count, «B»).End(xlUp).Row)



0



  1. Image titled Use "Find" in Excel VBA Macros Step 1

    1

    Learn the following key concepts of the FIND command:

    • The syntax of .Find is:
      • expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
      • Expression (Required): is any valid range Object. So if we take an example then the range would be Range(“A1:A” & lastRow) where lastRow has been DIMensioned as type long and there is a statement: lastRow = oSht.Range(«A» & Rows.Count).End(xlUp).Row (or something similar) preceding its use in the .Find required expression.
      • What (Optional Variant): is the “Search value”
      • After (Optional Variant): The cell after which you want the search to begin.
      • LookIn (Optional Variant): The type of information. (xlValues or xlFormulas)
      • LookAt (Optional Variant): Can be one of the following XlLookAt constants: xlWhole or xlPart.
      • SearchOrder (Optional Variant): Can be one of the following #** XlSearchOrder constants: xlByRows or xlByColumns.
      • SearchDirection: Can be one of these XlSearchDirection constants. xlNext default xlPrevious
      • MatchCase (Optional Variant): True to make the search case sensitive. The default value is False.
      • MatchByte (Optional Variant): Used only if you’ve selected or installed double-byte language support. True to have double-byte characters match only double-byte characters. False to have double-byte characters match their single-byte equivalents.
      • SearchFormat (Optional Variant): The search format.
  2. Image titled Use "Find" in Excel VBA Macros Step 2

    2

    You can adapt the following code to your own uses by copying it (down to where it says #** End Sub) in Advanced Editing and pasting it to a word processor and doing a REPLACE ALL for «#** » (w/o the quotes but with the trailing space please). Then in Excel Preferences, set the Ribbon Developer status to Checked or On so you can work with macros. On the Ribbon, click on Developer, and then the Record icon and just click in cell A1 and then do Stop Recording (of your dummy macro). Click on the Editor icon button and copy your REPLACE(d) ALL text from your word processor from here right over the macro, and save the workbook.

    Advertisement

  3. Image titled Use "Find" in Excel VBA Macros Step 3

    3

    Open a new Excel workbook. Save the workbook as «Overall Status» and Sheet1 as «Article Views and Other».

  4. Image titled Use "Find" in Excel VBA Macros Step 4

    4

    In your browser, go to https://www.wikihow.com/User:Chris-Garthwaite and do (View More) under Articles Started, and select just to the left of the first top one down to just to the right of the bottom one’s Views, and copy it. Make sure you don’t get any excess info, just the articles and number of views. Then paste that data into the «Article Views and Other» worksheet at cell C17. Then, in your browser, go to https://www.wikihow.com/User:Xhohx and copy all 100 expanded (View More) Articles and Views from there too please, and paste those in the cell right below the ones you did before.

  5. Image titled Use "Find" in Excel VBA Macros Step 5

    5

    Then. on your toolbar, choose Macros, Macros, and Run the following pasted-in REPLACE(d) ALL macro to test it.

      • Sub Macro2_FindArticle()
      • ‘ Finds an Article String, returns cell address and goes to Article cell
      • ‘ Macro2_FindArticle Macro
      • Dim oSht As Worksheet
      • Dim StrFinder As String
      • Dim lastRow As Range
      • Dim aCell As Range
      • Set oSht = Sheets(«Article Views and Other»)
      • Set lastRow = ActiveWorkbook.Sheets(«Article Views and Other»).Range(«C17:C217»)
      • Application.ScreenUpdating = True
      • Do Until StrFinder <> «»
      • StrFinder = Application.InputBox _
      • (Prompt:=»Article Name or string to search for: «, _
      • Title:=»Article Search», _
      • Type:=2)
      • Set aCell = lastRow.Find(What:=StrFinder, LookIn:=xlValues, _
      • LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
      • MatchCase:=False)
      • If Not aCell Is Nothing Then
      • MsgBox «Value Found in Cell » & aCell.Address
      • End If
      • aCell.Select
      • Application.ScreenUpdating = False
      • Exit Sub
      • Loop
      • End Sub
      • You should have a list of articles something like this redacted image, probably without the colored background.
  6. Image titled Use "Find" in Excel VBA Macros Step 6

    6

    Note that if you were to use Excel’s menu-driven Find command, it would return in the upper left corner (to the left of the formula bar) the cell reference it found, if any, for the string you searched on in the given range of cells, but you would have to hit the right arrow and left arrow (or some such combination) to select the actual cell as the sole ActiveCell I believe. At least, that’s how Excel functions in this author’s experience — not obviously high lighting the cell for me or obviously selecting it, as it used to do in older versions of Excel.

  7. Image titled Use "Find" in Excel VBA Macros Step 7

    7

    Note that the underline used at the right end of code lines is to extend the line to the next line down, so the next line is in fact part of the entire sub-procedure or expression.

  8. Image titled Use "Find" in Excel VBA Macros Step 8

    8

    You can easily adapt this code by changing the sheet name reference and the cell range reference, and if it’s not an Article you’re searching for, you can certainly change that everywhere as well.

  9. Image titled Use "Find" in Excel VBA Macros Step 9

    9

    Here are two more macros that work together to update Related wikiHows:

      • Sub Macro10()
      • ‘ Macro10 Macro
      • ‘ Keyboard Shortcut: Option+Cmd+n
      • Windows(«OVERALL STATUS.xlsm»).Activate
      • Sheets(«Relateds»).Select
      • Application.Goto Reference:=»TopRow»
      • Application.CutCopyMode = False
      • Selection.Delete Shift:=xlUp
      • ActiveWorkbook.Names.Add Name:=»TopRow», RefersToR1C1:=»=Relateds!R166″
      • Range(«B166»).Select
      • Selection.Copy
      • Application.Goto Reference:=»Searcher»
      • ‘ Searcher is a Defined Name Variable comprised of the Article Names
      • ‘ and Views pasted AS TRANSPOSED from rows TO COLUMNS in row 1.
      • Macro3_FindRelated
      • End Sub
      • Sub Macro3_FindRelated()
      • ‘ Finds a Related wikiHow String and goes to Article cell,
      • ‘ where User then Arrow keys down and inputs a 1,
      • ‘ indicating that that Columnar Article is a Related for the Row Article.
      • ‘ There are both row totals and columnar totals to keep track of Total Relateds/Article
      • ‘ and how many Articles the Columnar Article is a Related for.
      • ‘ Uses the Named Variable Range, «Searcher», on the worksheet «Relateds» as a Range Object
      • ‘ Macro3_FindRelated Macro
      • Dim oSht As Worksheet
      • Dim StrFinder As String
      • Dim aCell As Range
      • Dim rng As Range
      • Set oSht = Sheets(«Relateds»)
      • Windows(«OVERALL STATUS.xlsm»).Activate
      • Sheets(«Relateds»).Select
      • Set rng = Worksheets(«Relateds»).Range(«Searcher»)
      • Application.ScreenUpdating = True
      • Do Until StrFinder <> «»
      • StrFinder = Application.InputBox _
      • (Prompt:=»Article Name or string to search for: «, _
      • Title:=»Article Search», _
      • Type:=2)
      • Set aCell = rng.Find(What:=StrFinder, LookIn:=xlValues, _
      • LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
      • MatchCase:=False)
      • aCell.Select
      • Application.ScreenUpdating = False
      • Exit Sub
      • Loop
      • End Sub
      • In cell H1 is xxxxxxxxxxxxxxxxxx and I1 is blank. From J1 to ET1 are the Article Titles and in EU1 is Other — a reconciling account rarely used. From J4 to EW4 are the Article views and their Total. From J6 to ET6 are the Article#s from 141 down to 1 (most recent at far left, oldest at far right). All of that was pasted as Transposed from cell range B10:G153.
      • In cell A166 is [xxxxxxxxxxxxxxxxxxx| and that is copied far down below, as it gets deleted with continued usage.
      • In cell B166 is the formula =IF(ISERR(MID(A166,D166+2,(E166-D166)-2)),»»,MID(A166,D166+2,(E166-D166)-2)) which returns the value, xxxxxxxxxxxxxxxxxx.
      • In cell D166 is the formula =IF(ISERR(FIND(«[«,A166)),»»,FIND(«[«,A166)), which returns the value of 1.
      • In cell E166 is the formula =IF(ISERR(FIND(«|»,A166)),»»,FIND(«|»,A166)), which returns 21.
      • In cell A9 is the formula =»*[[«&B9&»|How to «&B9&»]]»
      • When the formula in A9 is copied to A10, and the Article Name Find the Diagonal of a Square Using Its Area is in B10, A10 returns the value, *[[Find the Diagonal of a Square Using Its Area|How to Find the Diagonal of a Square Using Its Area]]
      • Whether copied from the first sheet in the workbook, Article Views and Other, or from this sheet, Relateds, these ready-to-become-Related formatted entries in column A are then pasted, if they’re appropriate How-To’s for the article being updated, to cell B167 and below before the following macro is run and command v pasting is done into the InputBox to locate the Article in the top Searcher area to arrow key down and update the proper row (Article) with a 1 to.
  10. Advertisement

Ask a Question

200 characters left

Include your email address to get a message when this question is answered.

Submit

Advertisement

  • The Type:=2 code in the Application.InputBox section means that it is a string. Type 0 is a formula; type 1 is a number; type 4 is a logical value (True or False); type 8 is a cell reference, as a range object; type 16 is an error value, such as #N/A; and type 64 is an array of values.

Thanks for submitting a tip for review!

Advertisement

References

About This Article

Thanks to all authors for creating a page that has been read 51,615 times.

Is this article up to date?

На чтение 10 мин. Просмотров 47.5k.

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

Уровень мастерства: средний

3 способа найти последнюю заполненную ячейку VBA

Видео: 3 части серии как найти последнюю ячейку с VBA

Видео лучше всего просматривать в полноэкранном режиме HD

Загрузите файл, содержащий код:

Find Last Cell VBA Примеры.xlsm (79.6 KB)

Поиск последней ячейки — все о данных

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

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

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

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

#1 – The Range.End() Method

Range.End() очень похож на сочетание клавиш Ctrl+Arrow. В VBA можно использовать этот метод, чтобы найти последнюю не пустую ячейку в одной строке или столбце.

Диапазон.Пример кода End VBA

Sub Последняя_ячейка()
'Найти последнюю не пустую ячейку в одной строке или столбце

Dim lRow As Long
Dim lCol As Long
    
    'Найти последнюю не пустую ячейку в столбце А(1)
    lRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    'Найти последнюю непустую ячейку в строке 1
    lCol = Cells(1, Columns.Count).End(xlToLeft).Column
    
    MsgBox "Последняя строка: " & lRow & vbNewLine & _
            "Последний столбец: " & lCol
  
End Sub

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

Оператор Rows.Count возвращает количество всех строк на рабочем листе. Поэтому мы в основном указываем последнюю ячейку в столбце A листа (ячейка A1048567) и поднимаемся до тех пор, пока не найдем первую непустую ячейку.

Это работает так же с поиском последнего столбца. Он начинается с последнего столбца в строке, затем идет влево, пока в столбце не будет найдена последняя непустая ячейка. Columns.Count возвращает общее количество столбцов на листе. Итак, мы начинаем с последнего столбца и идем налево.

Аргумент для метода End указывает, в каком направлении идти.
Возможные варианты: xlDown, xlUp, xlToLeft, xlToRight.

Плюсы Range.End

  • Range.End прост в использовании и понимании, так как он работает так же, как сочетания клавиш Ctrl+Arrow.
  • Может использоваться для поиска первой пустой ячейки или последней непустой ячейки в одной строке или столбце.

Минусы Range.End

  • Range.End работает только с одной строкой или столбцом. При наличии диапазона данных, содержащего пробелы в последней строке или столбце, может быть трудно определить, в какой строке или столбце выполнять метод.
  • Если вы хотите найти последнюю используемую ячейку, то вы должны оценить по крайней мере два оператора. Один, чтобы найти последнюю строку и один, чтобы найти последний столбец. Затем их можно объединить для ссылки на последнюю ячейку.

Вот справочные статьи для Range.End

  • Страница справки MSDN для Range.End
  • Справка MSDN для перечислений xlDirection

#2 – The Range.Find() Method

Последнее значение в столбце Excel

Метод Range.Find — я предпочитаю этот способ, чтобы найти последнюю строку, столбец или ячейку. Он самый универсальный, но и самый страшный.

Последнее значение в столбце Excel

У Range.Find много аргументов, но пусть это вас не пугает. Когда вы знаете, что они делают, вы можете использовать Range.Find для многих вещей в VBA.

Range.Find — это в основном способ программирования меню «Find» в Excel. Он делает то же самое, и большинство аргументов Range.Find являются опциями в меню Find.

Последнее значение в столбце Excel

Пример кода Range.Find

Ниже
приведен код для поиска последней непустой строки.            

Sub Последняя_ячейка_Find()
'Находит последнюю непустую ячейку на листе / диапазоне.

Dim lRow As Long
Dim lCol As Long
    
    lRow = Cells.Find(What:="*", _
                    After:=Range("A1"), _
                    LookAt:=xlPart, _
                    LookIn:=xlFormulas, _
                    SearchOrder:=xlByRows, _
                    SearchDirection:=xlPrevious, _
                    MatchCase:=False).Row
    
    MsgBox "Последняя строка: " & lRow

End Sub

Метод Range.Find. Пояснения

Метод Find ищет первую непустую ячейку («*»). Звездочка представляет
собой символ подстановки, который ищет любой текст или числа в ячейке.

Начиная с ячейки A1, он перемещается назад (xlPrevious) и
фактически начинает поиск в самой последней ячейке на листе. Затем он
перемещается справа налево (xlByRows) и проходит по каждой строке, пока не
найдет непустую ячейку. При обнаружении непустого он останавливается и
возвращает номер строки.

Range.Find VBA Excel

Вот подробное объяснение каждого аргумента.

  • What:=”*” — звездочка — это символ подстановки, который находит любой текст или число в ячейке. Это в основном то же самое, что и поиск непустой ячейки.
  • After:=Range(“A1”)— начать поиск после ячейки А1, первой ячейки на листе. Это означает, что A1 не будет искать. Поиск начнется после A1, и следующая ячейка, которую он ищет, зависит от SearchOrder и SearchDirection. Этот аргумент можно изменить, чтобы он начинался в другой ячейке, просто помните, что поиск фактически начинается в ячейке после указанной.
  • LookAt: = xlPart — это будет смотреть на любую часть текста внутри ячейки. Другой вариант — xlWhole, который будет пытаться соответствовать всему содержимому ячейки.
  • LookIn: = xlFormulas — Это заставляет Find искать в формулах, и это важный аргумент. Другой вариант — xlValues, который будет искать только значения. Если у вас есть формулы, которые возвращают пробелы (= IF (A2> 5, «Ok», «»), то вы можете считать это непустой ячейкой. При указании LookIn в качестве xlFormulas эта формула будет считаться непустой, даже если возвращаемое значение пустое.
  • SearchOrder: = xlByRows — это говорит Find, чтобы искать через каждую целую строку прежде, чем перейти к следующей. Направление поиска слева направо или справа налево зависит от аргумента SearchDirection. Другой вариант здесь — xlByColumns, который используется при поиске последнего столбца.
  • SearchDirection: = xlPrevious — указывает направление поиска. xlPrevious означает, что он будет искать справа налево или снизу вверх. Другой вариант — xlNext, который перемещается в противоположном направлении.
  • MatchCase: = False — это говорит Find, чтобы не рассматривать заглавные или строчные буквы. Если установить значение True, это поможет. Этот аргумент не является необходимым для этого сценария.

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

Плюсы
Range.Find

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

Минусы Range.Find

  • Это ужасно. Метод содержит 9 аргументов. Хотя требуется только один из этих аргументов (Что), вы должны привыкнуть использовать хотя бы первые 7 аргументов. В противном случае метод Range.Find по умолчанию будет использовать ваши последние использованные настройки в окне поиска. Это важно. Если вы не укажете необязательные аргументы для LookAt, LookIn и SearchOrder, тогда метод Find будет использовать те параметры, которые вы использовали последними в окне поиска Excel.
  • Нахождение последней ячейки требует двух утверждений. Один, чтобы найти последний ряд и один, чтобы найти последний столбец. Затем вы должны объединить их, чтобы найти последнюю ячейку.

Macro Recorder выручит!

Range.Find — все еще мой любимый метод для нахождения последней ячейки из-за ее универсальности. Но нужно много напечатать и запомнить. К счастью, вам это не нужно.

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

  1. Запустить макро рекордер
  2. Нажмите Ctrl + F
  3. Затем нажмите кнопку «Найти далее»

Код для метода Find со всеми аргументами будет сгенерирован устройством записи макросов.

Используйте пользовательскую функцию для метода Find

Вы также можете использовать пользовательскую функцию (UDF) для метода поиска. Последняя функция Ron de Bruin — прекрасный пример. Вы можете скопировать эту функцию в любой проект или модуль кода VBA и использовать ее для возврата последней строки, столбца или ячейки.

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

Вот справочные статьи для Range.Find

  • MSDN Help Article for Range.Find Method

#3 – Range.SpecialCells (xlCellTypeLastCell)

Метод SpecialCells делает то же самое, что и нажатие сочетания клавиш Ctrl + End, и выбирает последнюю использованную ячейку на листе.

Пример кода SpecialCells (xlCellTypeLastCell)

Sub Range_SpecialCells_Method()

    MsgBox Range("A1").SpecialCells(xlCellTypeLastCell).Address
      
End Sub

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

Часто вы будете нажимать Ctrl + End на клавиатуре и попадете в какую-нибудь ячейку вниз в конце листа, который определенно не используется. Это может произойти по ряду причин. Одной из распространенных причин является то, что свойства форматирования для этой ячейки были изменены. Простое изменение размера шрифта или цвета заливки ячейки помечает ее как использованную ячейку.

Плюсы Range.SpecialCells

  • Вы можете использовать этот метод, чтобы найти «используемые» строки и столбцы в конце листа и удалить их. Сравнение результата Range.SpecialCells с результатом Range.Find для непробелов может позволить вам быстро определить, существуют ли какие-либо неиспользуемые строки или столбцы на листе.
  • Удаление неиспользуемых строк / столбцов может уменьшить размер файла и увеличить полосу прокрутки.

Минусы Range.SpecialCells

  • Excel только сбрасывает последнюю ячейку при сохранении книги. Поэтому, если пользователь или макрос удаляет содержимое некоторых ячеек, этот метод не найдет истинную последнюю ячейку, пока файл не будет сохранен.
  • Он находит последнюю использованную ячейку, а НЕ последнюю непустую ячейку.

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

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

У меня также есть статья о том, как найти ПЕРВУЮ ячейку в листе.

Пожалуйста, оставьте комментарий ниже, если у вас есть какие-либо вопросы, или вы все еще не можете найти последнюю ячейку. Я буду рад помочь!

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