Vba excel поиск даты

Обновлено: 07.07.2024

Я борюсь с одним простым кодом, который не сотрудничает со мной ;) У меня есть в столбце L некоторые даты, начинающиеся со строки 5 . Даты находятся в формате yyyy.mm , но в строке формул видна вся дата в формате dd.mm.yyyy .

В столбце F находятся те же даты, отформатированные таким же образом. Разница лишь в том, что здесь некоторые ячейки объединены. Каждая дата находится в ячейке, которая объединяется со следующими 2 ячейками.
Это значит, что в ячейке F5 стоит дата.
Эта ячейка объединяется с F6 и F7 .
В ячейке F8 - следующая дата. Эта ячейка объединяется…

Я хотел бы взять первую дату из столбца L и найти их в столбце F , а если найду, то сделать некоторые действия.

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

С уважением Неке

2 ответа

У меня есть небольшая таблица Excel, которая ежедневно обновляется пользователями. Он содержит столбец даты. Я поместил небольшой фрагмент VBA, который отправляет предупреждение по электронной почте, когда столбец даты содержит дату, равную текущей дате, и затем закрывает файл. Этот Excel.

Я успешно вытягиваю данные в excel через SQL запрос, отформатированный так же в VBA: .Open exec sp_MyProcedure @Node_Id = 05,@Subsidiary_Cd = '1',@WeekEndDate = '2016-05-28', @JobType = '12',@ReportLevel = 4 Я хотел бы либо попросить пользователя ввести самую последнюю дату окончания недели.

Я просмотрел ваш код. Вы ищете диапазон x. Я предполагаю, что простое смещение не сработает, потому что даты в столбце F и L не в том же порядке? ваш код:

Если простое смещение сработает, вы можете попробовать:

если вы ищете дату, попробуйте добавить .value в конце.

Или вместо поиска диапазона найдите дату. Я никогда не искал диапазон в Excel vba. Я всегда "read" значение ячейки в переменной, а затем ищу его. Но это вызывает проблемы, если есть дубликаты.

Пожалуйста, дайте мне знать, если это поможет.

Поскольку никто не решил мою проблему, я сделал это сам.

Еще раз, чтобы внести ясность. В обеих колонках я написал дату dd.mm.yyyy. Формат всех ячеек является пользовательским (yyyy.mm), так что в ячейках отображается 2017.07, но в строке формул все равно что-то вроде 01.07.2017.

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

LookIn:xlFormulas ' вместо того, чтобы искать значение ячейки, я просто беру информацию из строки формул. Понятия не имею, почему xlValues не работает. Значения те же самые.

SearchOrder: xlColumns ' это изменение позволяет мне найти то, что я ищу, в объединенных ячейках.

Может быть, это кому-то поможет.

Похожие вопросы:

у меня есть мой баланс в excel, есть две колонки, над которыми я хочу работать, одна-рассрочка, другая - дата. таким образом, если значение рассрочки уменьшается на единицу, то дата месяца должна.

Я понимаю, что заставить excel импортировать данные и распознавать их как дату-это обычная проблема. Я просмотрел много предыдущих постов с ответами, но пока не нашел решения: Вот как выглядят.

(Excel 2010 VBA) У меня есть ячейка (A1), содержащая дату в формате mmm-yy (категория Custom). Например, если я ввожу 1/6/13, то ячейка показывает июнь-13. - Все в порядке. В моем макросе VB мне.

У меня есть небольшая таблица Excel, которая ежедневно обновляется пользователями. Он содержит столбец даты. Я поместил небольшой фрагмент VBA, который отправляет предупреждение по электронной.

Я успешно вытягиваю данные в excel через SQL запрос, отформатированный так же в VBA: .Open exec sp_MyProcedure @Node_Id = 05,@Subsidiary_Cd = '1',@WeekEndDate = '2016-05-28', @JobType =.

Я хотел бы знать, есть ли способ удаленно деактивировать файл excel через vba. Проблема: Моя компания использует файл excel для продажи, чтобы предоставить клиенту котировки. Теперь, когда есть.

Я использую Excel VBA, как я могу ? Введите месяц и год и верните все номера недель за этот месяц. Введите дату и получите номер недели для этой даты.

У меня есть приложение Excel/ VBA, которое запускает запрос на основе предоставленных дат начала и окончания. Даты начала и окончания указаны на самом листе Excel (не на бланках). Требование состоит.

Итак, у меня возникли некоторые проблемы с датами, которые меняются местами в VBA при назначении переменной даты. Это проще, чем кажется, но это действительно беспокоит меня. Код: Dim InsertedDate.

ВНИМАТЕЛЬНО ПРОЧТИТЕ ВОПРОС, ПОЖАЛУЙСТА, В НЕМ УПОМИНАЕТСЯ EXCEL VBA. Не EXCEL Мне было поручено установить дату input на бланке VBA. A textbox должен заставить пользователя ввести дату как.

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

Проблема в том, что находит эту же самую ячейку, которая грубо говоря задается условием. Пробовал разные варианты поиска, нужного результата не получил( В "заданной" ячейке дата в формате ДД.ММ.ГГГГ , в искомой МММ ДД ГГ . Заранее всем спасибо)


Ну так искать надо не на всём листе, а только в нужном диапазоне. Замените Cells.Find на какой-нить Range("F10:X20").Find(. ) . Или, если блок With там не просто так, и нужно искать именно в указанной строке, то просто .Find(. ) . Блок With насколько я понимаю как раз и указывает на диапазон, пробовал его менять на аналогичный, указанный вами. Да, искать нужно именно в указанной строке. Просто во остальном коде данный метод работает, но там не даты. А как правильно, если без этого оформить синтаксис .Find? Вы бы сделали модель - импортируемый текст со значениями, указания по форматам, код для модуля,- чтобы можно было легко воспроизвести файл. а так на пальцах как-то сложновато.

Оператор With указывает на родителя, а между With-End With указываются подчиненные объекты. Но не все, что внутри, относится к родителю.

Запишем данные диапазона в массив. Ссылку на диапазон листа пишем обычно так - родитель(точка)подчиненный:

Объявим объект с помощью With :

Здесь диапазон A1:C5 относится к листу "Лист", а диапазон D1:E5 - к активному листу.

Теперь, надеюсть, ошибка понятна.

Еще один момент, который иногда ставит подножки (вернее, авторы кода сами себе посечку делают).

Это может быть и диапазон, и значение. Хорошо, что объявленная переменная d которой передается объект, имеет тип Date , но все же рекомендую не экономить на символах и, когда нужно получить значение ячейки, явно это прописывать:

Таблицу аргументов (значений) параметра interval смотрите в параграфе «Приложение 1».

Примечание к таблице аргументов: три символа – y, d, w – указывают функции DateAdd на один день, который необходимо прибавить к исходной дате number раз.

Пример

MsgBox "31.01.2021 + 1 месяц crayon-h"> & DateAdd ( "m" , 1 , "31.01.2021" ) 'Результат: 28.02.2021 MsgBox "Сегодня + 3 года crayon-h"> & DateAdd ( "yyyy" , 3 , Date ) MsgBox "Сегодня - 2 недели crayon-h"> & DateAdd ( "ww" , - 2 , Date ) MsgBox "10:22:14 + 10 минут crayon-h"> & DateAdd ( "n" , 10 , "10:22:14" ) 'Результат: 10:32:14

Функция DateDiff

DateDiff – это функция, которая возвращает количество указанных интервалов времени между двумя датами. Тип возвращаемого значения – Variant/Long.

Синтаксис

DateDiff ( interval , date1 , date2 , [ firstdayofweek ] , [ firstweekofyear ] )

Параметры

Параметр Описание
interval Обязательный параметр. Строковое выражение из спецсимволов, представляющее интервал времени, количество которых (интервалов) требуется вычислить между двумя датами.
date1, date2 Обязательные параметры. Значения типа Variant/Date , представляющие две даты, между которыми вычисляется количество указанных интервалов.
firstdayofweek Необязательный параметр. Константа, задающая первый день недели. По умолчанию – воскресенье.
firstweekofyear Необязательный параметр. Константа, задающая первую неделю года. По умолчанию – неделя, в которую входит 1 января.

Таблицу аргументов (значений) параметра interval смотрите в параграфе «Приложение 1».

Примечание к таблице аргументов: в отличие от функции DateAdd , в функции DateDiff спецсимвол "w" , как и "ww" , обозначает неделю. Но расчет осуществляется по разному. Подробнее об этом на сайте разработчиков.

Параметры firstdayofweek и firstweekofyear определяют правила расчета количества недель между датами.

Таблицы констант из коллекций firstdayofweek и firstweekofyear смотрите в параграфах «Приложение 2» и «Приложение 3».


Поиск какого-либо значения в ячейках 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: Найти все ячейки с шрифтом "курсив" и поменять их формат на обычный (не "курсив")

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Книги по теме:






Посмотреть все книги по программированию

Комментарии к статье:

10.09.17 Дмитрий Очень толковая и полезная статья. Помогла мне существенно ускорить мой код. Спасибо!
23.11.17 Гость Спасибо, хорошая статья.
03.12.17 Владимир Спасибо! Использую в своих проектах.
07.12.17 Эд Спасибо, очень пригодилась Ваша статья!
19.01.18 Николай .find не ищет значение в ячейке, если ячейка в скрытой строке.
.match позволяет не беспокоится о том, что на листах с источниками данных строка с искомым значением будет скрыта из-за установленного фильтра.
05.02.18 Владимир Большое спасибо! Очень толково и понятно.
11.03.18 Гость Здравствуйте,
А если мне требуется найти ячейку в определенном столбце с определенным значением, например "строка 1" и если я нахожу такую, то через несколько строк(неизвестно сколько) мне нужно раскрасить следующую ячейку в другом столбце(самую ближайшую) и остановить цикл, и опять по новой искать дальше "строка 1". Можете посоветовать?
26.03.18 Гость Спасибо! Все бы так описывали! Все доступно и понятно))
23.05.18 Аркадий В VBA я новичок. Активно использую интернет для своих вопросов, однако таких информативных, лаконичных и простых в понимании сайтов не много. Огромное спасибо автору! Адрес уже в закладках.
21.07.18 Гость Спасибо! Уже несколько недель искала подобное!
25.07.18 Joann Метод .find (в случае далнейших множественных обращений к этому механизму) разумно вынести в отдельную функцию, как из управляющей процедуры передать в эту функцию ее параметры (обязательный текстовый параметр 'what:=' - передается без проблем, а вот значения ('xlValues', 'xlWhole', . ) для 'LookIn:=', 'LookAt:=', . - приводят к ошибке)?
15.08.18 Марат Спасибо за статью, пополнил свои знания в части метода Find. Простые переборы хороши на небольших диапазонах. А когда нужно обработать сотни тысяч ячеек, Find - хороший инструмент!
28.08.18 Гость Познавательно и подробно. Спасибо за статью.
16.10.18 Гость Хорошая статья. Спасибо
29.10.18 Sega Полезная статейка. Спасибо.
14.11.18 Гость Статья для начинающих, а тонкости поиска по дате нет ни одного примера
02.02.19 Ибрагим Чушь полная, плагиат!
01.03.19 inexsu.wordpress.com Loop While Not c Is Nothing And c.Address <> firstResult
Когда c станет Nothing, c.Address даст ошибку
Решение https://inexsu.wordpress.com/2018/03/05/range-findnext-method/
01.03.19 Администратор Вы правы, такое действительно может произойти, например, если менять значения найденных ячеек. Т.е., например, ищем значения "asd" и меняем их на "qwe". При замене последнего значения, FindNext ничего уже не найдет, вернет Nothing и произойдет ошибка в условии.
Внес изменения в статье. Спасибо вам за подсказку.
07.04.19 Гость Добрый день. есть 2 таблица на разных листах. макрос нашел нужные ячейки с ИНН по 1 условию, затем мне надо чтобы макрос нашел в таблице 2 на листе 2 все названия клиентов с инн по условию 1 из таблицы 1 с листа 1. как тогда использовать find.
07.04.19 Гость Лучше использовать функцию ВПР
21.05.19 Гость Очень подробная статья. Отдельное спасибо за множество примеров.
17.10.19 Михаил Спасибо большое все понятно доступно и очень полезно
31.10.19 Гость Спасибо.
01.11.19 Гость ку
01.11.19 Гость 2 раза
19.11.19 Kamol Отлично.
Поиск с двумя значениями Пример в колонке А="123" и В="456"
25.12.19 Гость Спасибо!
05.03.20 Гость Добрый день!
Спасибо за код автору
Вопрос

Как сделать поиск слова по, но с любым регистром и любым набором символов
Пример: Я ввожу слово через Textbox
В таблице есть слово компьютер, колодец, ком
Нужно, чтобы программа находила по запросу "омпьюте", "пьюте" слово компьютер а по запросу "ком" слова компьютер и ком"

Читайте также: