Remkomplekty.ru

IT Новости из мира ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Работа с датами в vba excel

Урок 15 по VBA — функции работы с датой и временем

И так, в этой по своей природе унылой публикации я кратко рассмотрю vba функции даты и времени, которые позволяют получить или установить параметры даты и времени, задать таймер выполнения заданного блока кода или сценария в целом. Также в конце статьи будет затронута функция vba языка format. Которая отвечает за форматирование данных.

Функции VBA даты и времени

Date () – позволяет получить значение текущей даты, установленной в системе.

Time () – вернет установленное в системе время

Now () – комбинированная функция, так как она позволяет получить значение системной даты и времени.

DateAdd (интервал, число, дата) – позволяет прибавить к заданной дате (параметр “дата”) указанное количество лет, кварталов, месяцев или секунд. На выходе мы получим следующее значение: дата + (число * интервал).

DateDiff (интервал, дата, дата2) – позволяет получить разницу между заданными датами, например. В годах, месяцах и так далее, разница определяется параметром “интервал”.

DatePart (интервал, дата) – позволяет получить заданную часть даты, например, только значение года, месяца или дня недели. Результат возврата регулируется параметром “интервал”.

DateSerial (год, месяц, день) – данная функция vba принимает три числовые значения, по которым возвращается дата.

DateValue (строка) – аналог предыдущей функции, но тут в качестве параметра мы передаем не числа. А строковое значение, на основе которого будет возвращаться дата, vba работа с датами.

Day (дата) – позволяет получить значение текущего дня (если отсутствует параметр “дата”) или для заданной даты.

Year (дата) – позволяет получить значение текущего года (если отсутствует параметр “дата”) или для заданной даты.

Month (дата) – позволяет получить значение текущего месяца (если отсутствует параметр “дата”) или для заданной даты.

Weekday (дата) – позволяет получить значение текущей недели (если отсутствует параметр “дата”) или для заданной даты.

Hour (время) – позволяет получить текущее значение часов (если отсутствует параметр “время”) или для заданного времени, vba дата и время.

Minute (время) – позволяет получить текущее значение минут (если отсутствует параметр “время”) или для заданного времени.

Second (время) – позволяет получить текущее значение секунд (если отсутствует параметр “время”) или для заданного времени.

Timer () – удобная функция для определения промежутка времени, ушедшего на выполнение заданного блока кода. Сама функция возвращает целое количество секунд, которые прошли начиная с полуночи.

TimeSerial (часы, минуты, секунды) – позволяет получить время, заданное тремя параметрами

TimeValue (строка) – работает аналогично предыдущей функции, но для получения времени, передается не целое значение, а строковое.

MonthName (числовое значение) – VBA функция позволяет получить название месяца, в качестве параметра указываем номер месяца.

WeekDay (дата) — задает возвращает имя месяца словами по его номеру. Возвращаемое значение зависит от региональных настроек. Если они русские, то вернется русское название месяца.

Помимо указанных выше vba функций даты и времени, можно использовать и такие вариации:

Date (дата) – позволяет задать системную дату

Time (время) – позволяет задать системное время.

В приведенных выше функциях даты и времени vba языка используется параметр “интервал”, который может принимать следующие значения:

VBA функции форматирование данных

Для форматирования данных в языке VBA используется функция Format , которая позволяет сформировать данные любого встроенного типа, используя заданный образец. Общий синтаксис функции format:

Format (Выражение, [“формат”, [первый день недели, [первая неделя года]]]) – тут параметр “выражение” является любым допустимым значением. Формат – необязательный параметр, который задает формат данных, должен заключаться в кавычки. Остальные два параметра также являются необязательными, и задают день недели, который нужно считать первым, и первую неделю года.

Параметр формат может принимать следующие значения:

  • General Number – числовое значение без выделения разрядов тысяч, например, 12150,2003
  • Currency – денежный формат, выделяются тысячные разряды и два знака после запятой, например, 255,33р.
  • Fixed – числовое значение без выделения разрядов тысяч и двумя знаками после запятой, например, 22439,12.
  • Standart – числовое значение, которое умножается на 100, при этом, остаются два знака после запятой и символ процента, например, 55,63%.
  • Scientific – числовой формат для научных вычисление, например, 5,23Е+03
  • Yes/No – данный параметр определяет, что функция вернет “Да” если форматированное выражение содержит строку Нет, или ненулевое значение и “Нет” в противном случае.
  • True/False – аналог предыдущего параметра, но для строк “Истина” и “Ложь”.
  • On/Off – для строк вида “Вкл” и “Выкл”.
  • General Date – форматирование выражения в соответствии с установленными в системе стандартами даты и времени, например, 10.11.02 12:25:50
  • Long Date – вывод полного формата даты, в зависимости от установок в системе, например, 10 октября 2013 г, vba функции даты.
  • Medium Date – средний формат дат, например, 10-Окт-13.
  • Short Date – короткий вывод формата даты, например, 10.10.13.
  • Long Time – вывод в формате времени (часы, минуты, секунды), например, 12:20:40.
  • Medium Time – 12 часовой формат времени (часы, минуты), например, 05:30.
  • Short Time — 24 часовой формат времени (часы, минуты), например, 17:30.

Спасибо за внимание. Автор блога Владимир Баталий

Работа с датой

Привет Эт снова я.. по сути программа написанна, но в ней один косяк.

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

Вот текст программы

Работа с датой на VBA
Здравствуйте! Есть книга, состоящая из 12 листов (названия месяцев). Содержание каждого листа.

VBA в Excel: работа с датой
Вот несколько вопросов начинающего: — есть ли в VBA (используется в Excel от MSOffice 2000).

Работа с датой. Как записать только квартал и год?
Вопрос такой: В таблице сохраняю дату Формат поля — Краткий формат даты Маска ввода -.

Операции с датой
программа спрашевает имя и дату раждения. после того как мы это вывели программа показывает сколько.

Понимаю, что коряво, но красоту лень наводить

тож самое.. сам попробуй.. введи в дату рождения 1.125 или подобное.

Добавлено через 3 минуты

Понимаю, что коряво, но красоту лень наводить

Да согласен. Я так подумал и решил, что нафига делать так, если можно создать форму, а в ней три комбобокса, в которых можно загрузить только то что нужно и не надо будет заморачиваться на счёт всяких там условий по поводу ввода некоректных данных. Пользователь сможет выбрать только то, что есть на самом деле!

Добавлено через 15 минут
Да, как на счёт такого кода?

Добавлено через 15 минут
Да, как на счёт такого кода?

не вариант..))) не работает.

Добавлено через 2 минуты
Пользователю конечно можно написать, но кто сказал, что он будет соблюдать это «условие»?

И потом, как сказал Toxa33rus, сверяйте попадает ли она в диапазон ((сейчас — 100 лет) < userDay < (сейчас - 3 года). Всего три вложенных условия!

Читать еще:  Как сложить строки в excel

P.S. ИМХО, можно цифру 100 увеличить, чтоб не выглядеть совсем пессимистом.

не вариант..))) не работает.

Добавлено через 2 минуты
Пользователю конечно можно написать, но кто сказал, что он будет соблюдать это «условие»?

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

Счетчик с датой
Добрый день! Веду таблицу в Excel и решил автоматизировать процесс внесения данных в таблицу. Но.

Формула с датой
Дорогие форумяне! помогите с формулой нужно высчитывать разницу между текущим днем и прошлым .

Колонтитул с динамической датой
Задача: колонтитул в правом верхнем углу рабочего листа имеет заголовок "Неделя от: ". после.

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

Visual Basic и «Проблема 2000»: особенности работы с датами в VB

В какой степени Visual Basic

В какой степени Visual Basic соответствует требованиям 2000 года? Ответ Microsoft такой:

  1. 32-разрядные версии (4.0 — 6.0) — соответствуют с незначительными проблемами;
  2. 16-разрядные версии (1.0 — 4.0) — не соответствуют;
  3. версии для DOS (QB 4.5, PDS 7.1) — не будут тестироваться.

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

Преобразование из двухзначного в четырехзначное представление

Главное проблемой (по мнению Microsoft) является различия правилах преобразования года из двухзначного в четырехзначное представление. Впрочем, эти правила она сама же и меняет — четыре раза за последние пять лет.

Все версии Visual Basic for Windows до версии 3.0 включительно (а также более ранние DOS-овские варианты: VB 1.0 for DOS, QB 4.5 и PDS 7.1) двузначное представление года всегда преобразовывали в четырехзначное простым добавлением 1900. Программы такого преобразования встроены в состав внутренних библиотек продуктов и поэтому не зависят от версии операционной системы и значения текущей даты.

Отмечу от себя, что в версиях QB и PDS проблема преобразования года вообще никогда не была актуальной. Ведь единственным оператором языка, где использовалось это правило, в то время был только DATE$ — программная запись системной даты в MS-DOS. Такая функция в обычных приложениях практически не применялась. Для обычной работы с датами нужно было писать собственные процедуры, и их качество уже зависело от программиста (об этом будет разговор дальше).

В период создания VB 4.0 появился первый вариант VBA (в составе Excel 4.0) и механизм OLE Automation. В этой связи основные функции преобразования дат были переданы библиотекам OLE Automation (а не внутренним библиотекам пакетов), которым пользовались VB 4.0 и VBA. Исключением была только функция DateSerial, которая осталась внутри самого VB 4.0. (для ее реализации возможностей библиотек OLE Automation в те времена не хватало). Тогда же было изменено правило преобразования года: для двухзначного формата использовалось значение текущей системной даты. То есть сегодня при работе в VB 4.0 (16 бит) 99 сегодня будет означать 1999, а через год — 2099.

Первоначальный 32-разрядный вариант VB 4.0 использовал тот же алгоритм, что и 16-разрядный. В нем использовалась 32-разрядная Automation библиотека OleAut32.dll версии 2.10, которая входила в состав пакета. Однако позднее Microsoft решила изменить правило, введя окно в диапазоне 1930-2029 гг.: года 0-29 стали относиться к 21 веку, 30-99 — к 20-му. Однако такое изменения было выполнено только для 32-разрядного варианта OleAut32.dll (начиная с версии 2.20.4049). Таким образом VB 4.0 с новой библиотекой стал обрабатывать двухзначное представление года по новым правилам, кроме (ВНИМАНИЕ!) встроенной функции DateSerial, которая по-прежнему ориентировалась на текущее значение системной даты.

В VB и VBA (Office 97) 5.0 функция DateSerial работает уже по новым правилам (1930-2029), так как здесь используется не внутренняя библиотека пакета, а единая OleAut32.dll. Эта версия библиотеки входит в состав многих продуктов (не только Microsoft), выпущенных в 1996 году и позднее.

В сентябре прошлого года Microsoft выпустила VB 6.0, в котором был реализован тот же механизм преобразования года, что и в VB 5.0. Но не расслабляйтесь: это относится только к первым рабочим вариантам (в частности, как сообщает Microsoft, с датой до 1 августа 1998 года). В состав уже осенних релизов VB 6.0 будет включена новая версия библиотек OLE Automation, где алгоритм вычисления года опять изменен.

Но эта информация, приведенная на Web-узле Microsoft по состоянию на 6 марта 1999 года, не очень точна. Лично у меня установлен коробочный VB 6.0, приобретенный в октябре 1998 года с номером версии 6.00.8176 и датой 25.06.98. В его состав входит OleAut32.dll версии 2.30.4261 с той же датой и она уже работает по новым правилам: диапазон 100-летнего промежутка определяется установками в диалоговом окне «Control Panel|Regional Settings|Date» в Windows 98 (рис. 1 — установлен диапазон 1937-2036). Так же работает стандартная библиотека, входящая в состав Windows 98. Новая библиотека OleAut32.dll входит в состав многих новых продуктов, но для Windows 95 она может использовать диапазон, установленный по умолчанию — 1930-2029.

Обновление OleAut32.dll соответственно изменяет работу с датами в VB 4.0 и VB/VBA 5.0.

Очевидное и простое решение

Вы еще успеваете следить за изменениями алгоритма преобразования даты? Короче говоря, чтобы определить, каким образом VB-приложение делает из двухзначного года его четырехзначное представление нужно знать версию VB (для 4.0 еще и разрядность — 16 или 32), версию библиотеки OleAut32.dll и версию Windows (нужно знать еще и региональные установки, но об этом поговорим позднее). Убедиться, как же работает это преобразование на вашем компьютере, можно с помощью одной строчки кода:

Решение проблемы очевидно — нужно сделать собственную простую подпрограмму преобразования формата даты и не зависеть ни прихотей Microsoft. Для примера создайте форму, на которой разместите окно ввода Text1, метку Label1 и командную кнопку Command1 (рис. 2). Напишите программный код для процедур Command1_Click и ConvertYear (листинг 1). Запустите приложение. Далее вводите исходную дату в текстовом окне и после щелчка кнопки вы увидите в поле метки преобразованный вариант (в данном случае в диапазоне 1951-2050 гг.)

Процедуру ConverYear можно разместить в BAS-модуле или даже в классе (поместив потом в OLE-сервер) и использовать в любом месте вашего приложения. Переменную YearWindow% можно объявить глобальной или передавать в качестве параметра и менять ее значение динамически в процессе работы приложения.

Срок работоспособности программ

В материалах Microsoft указано, что срок работоспособности VB (включая последнюю версию 6.0) — до 2030 года, а не до 2035 года, как это записано в требованиях 2000 корпорации (см. «Проблема Y2K и продукты Microsoft»). Именно поэтому VB 5.0 и 6.0 причислены к категории «соответствуют с незначительными проблемами». В чем причина таких временных границ, мне выяснить не удалось (даже после обращения с этим вопросом в Microsoft). Однако работа в тестовом режиме с QB 4.5 и VB 3.0-6.0 в течение недели с датой «март 2079 года» не выявила никаких проблем.

Читать еще:  Операторы vba excel

Работа с датами

Начиная с первой версии, в VB была введен понятие типа данных для хранения даты и тогда же появились специальные операции для работы с ними. Однако до версии 3.0 для этого просто использовался тип Variant (подтип 7) и только, начиная с 4.0, был введен специальный тип Date.

Переменная типа Date физически представляет собой вещественное число двойной точности (восемь байтов) формата IEEE, в котором хранится дата для диапазона от 1 января 100 года до 31 декабря 9999 года и время от 0:00:00 до 23:59:59. Сама дата равна целой части этого числа и соответствует порядковому номеру суток, начиная от 30 декабря 1899 года. (0 — это 30.12.1899, значения до и после этой даты имеют соответственно отрицательное и положительное значение.) Времени соответствует дробная часть числа: полночь — 0,0, а полдень — 0,5.

Если вы запустите на выполнение код (для российских региональных установок):

то получите такой результат:

ПРИМЕЧАНИЕ. Возможность использования алгоритма, применяемого Microsoft для расчета дат и дней недели, до 15 октября 1582 года вызывает серьезные возражения. Подробнее — см. статью «Y2K: как вести календарь?»

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

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

Для работы с датами в VB имеется целый ряд специальный функций. Версия 5.0 включает такой набор: Now, CDate, CVDate, DateValue, Date, Date$, Format, DateAdd, DateDiff, DatePart, IsDate, Day, Month, Weekday, Year. В VB6 добавлены еще несколько дополнительных функций, которые позволяют преобразовывать дату и отдельные ее элементы в строковое выражение: MonthName, WeekdayName, FormatDateTime. (Следует иметь в виду, что по умолчанию отсчет дней недели в VB ведется, начиная с воскресенья.)

Национальные особенности

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

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

Вывод даты всегда выполняется в формате, определенным в региональных установках (для России — ДД.ММ.ГГ), но с их вводом есть проблемы. Для примера введите:

В первых трех случаях будет напечатано одно и тоже — 02.04.99. А в четвертом будет ошибка программы — английское строковое выражение является недействительным. В варианте США первые два выражения будут ошибочными, а двух последних будут выдано — 02/04/99 (2 февраля!) и 04/02/99 (2 апреля).

Еще больше неожиданностей ждет тех, кто предпочитает иметь дело с литералами. Дело в том, что VB при работе с ними использует только встроенный американский вариант, игнорируя региональные установки. Попытка ввести D = #2 апреля 1999# или D = #2.04.99# сразу же вызовет сообщение об ошибке. В то же время при работе с российскими (!) установками строки

cразу будут преобразованы в

что будет соответствовать 2 апреля (а не 4 февраля). Для примера выполните такой код:

В русском варианте будет напечатано:

В американском варианте будет напечатано:

Еще один вопрос: использование значения текущей даты, которое определяется с помощью функций Date и Date$. Первая возвращает значение даты в числовом виде, вторая — в символьном, который имеет формат «MM-DD-YYYY» независимо от региональных установок. Выполните такой код (для текущей даты 2 апреля):

В русском варианте будет напечатано:

В американском варианте будет напечатано:

Возможные проблемы

Ключевая проблема заключается в том, что работы с датами часто приходится использовать, кроме специального типа данных Date, еще и символьный формат строковых переменные. Тип String обычно используется для ввода данных, и часто применяется в пользовательских процедурах для какой-то специальной обработки. Строковый формат наверняка понадобится, если вы захотите работать с датами юлианского календаря (см. «Y2K: как вести календарь?»). Типичной проблемы является аварийное завершение программы в момент преобразования даты (неверного формата) из символьного представления в тип Date.

С учетом всего сказанного сформулируем следующие СОВЕТЫ:

  • Пишите свои приложения с учетом возможного изменения региональных установок даты (Regional Settings | Date) в Windows. Определить тип текущих установок, можно с помощью функции Win32 API EnumCalendarInfo.
  • Перед преобразованием даты из символьного вида в тип Date (особенно после ввода даты из внешнего источника, например, пользователем в диалоге) проверьте выражение на допустимое значение:
  • Помните, что текущая системная дата задается оператором Date$ в соответствии с региональными установками. Однако чтение системной даты функцией Date$ всегда выполняется в формате «MM-DD-YYYY» независимо от региональных установок.
  • Для преобразования года из двухзначного значения в четырехзначное напишите свою процедуру и забудьте о колебаниях Microsoft в этом вопросе, в том числе по поводу соответствия разных версий VB требованиям 2000 года.

Работа с датами в Visual Basic / Excel

Очень новичок в работе с Visual Basic / Excel. Я пытаюсь написать быстрый скрипт, который вводит текущее время в один столбец и позволяет пользователю ввести, сколько days/hours/minutes пройдет до Нового времени, и вывести это в другом столбце.

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

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

Edit: я бы, конечно, хотел, чтобы сценарий также обрабатывал дни.

3 Ответа

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

Например, вот что вы увидите.

Читать еще:  Перестал открываться файл excel

и это то, что находится в каждой ячейке (предполагая, что верхняя левая ячейка-A1).

Описание каждой функции:

  • NOW() возвращает текущую дату и время, отформатированные как дата и время.
  • DATE(year,month,day) возвращает число, представляющее дату в коде даты-времени MS Excel.
  • TIME(hours,minutes,seconds) преобразует часы, минуты и секунды, заданные в виде чисел, в серийный номер Excel, отформатированный в формате времени.

Рассечение уравнения в последней ячейке:

  • A2 -это ячейка, содержащая текущую дату / время (по состоянию на последний расчет рабочего листа).
  • B2 -это введенное пользователем значение для дней.
  • TIME(C2,D2,0) — это функция TIME(), принимающая введенные пользователем значения для часов и минут из ячеек C2 и D2 соответственно.

Это что-то вроде вашей предполагаемой функциональности.

Если вы хотите использовать VBA, единственная проблема с вашим кодом-это функция «Time». Вместо этого вы можете использовать CDate :

Когда вы ‘Dim’ таким образом, вы должны записать тип данных для каждой переменной. То, как у вас есть это MinutesLeft, является двойным, и все (по умолчанию)является вариантом.

Функция времени, которую вы ищете, — это TimeSerial.

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

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

Есть ли какой-либо инструмент или код, который позволил бы мне отображать Excel 2003 Sheet or part of it в форме Visual Basic 6.0, чтобы он мог редактироваться в среде выполнения vb 6.0?

я хочу получить значение столбца A excel sheet1 в некоторую переменную visual basic, а затем после изменения этого значения отправить обратно в следующий лист2

У меня есть Button1_click, чтобы открыть файл Excel, но файл excel скрывается за visual basic. Как просмотреть файл excel и сделать его режимом редактирования, хотя программа visual basic запущена?

Работа на хосте Windows 7 Enterprise x64 с установленной 64-разрядной версией Microsoft Office Professional Plus 2016. Я хотел бы создать Visual Basic script vbscript (файл на моем рабочем столе.

Я пытаюсь использовать Visual Basic в пределах Excel, чтобы использовать макрос, связанный с кнопкой, для фильтрации таблицы, отображающей все строки с датами сегодня или раньше, чем сегодня. Когда.

Я хочу вызвать макрос Excel [т. е. решатель Excel] с помощью visual basic 6.

Я никогда не использовал Visual Basic раньше, но мог бы сделать с указателем на то, с чего начать. У меня есть 750 excel электронных таблиц, которые содержат различные объемы данных разных типов.

Я недавно начал программировать с .NET visual basic, используя visual basic studio. Я также использую excel VBA, чтобы сделать некоторые macros. Я был бы очень признателен, если бы кто-то мог.

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

В Excel 2016 есть опция под (щелкните правой кнопкой мыши линия на диаграмме) > форматировать ряд данных > сглаженная линия, которая делает линию на линейном графике 2D гладкой. При создании.

Как сделать match() работу с датой в excel vba?

У меня проблема с тем, что match() работает в excel VBA. Код:

Значение в ячейке F1 равно 9/1/2008.

Даже если я изменил сентябрь 2008 г. на 9/1/2008, он все равно не возвращает никакого значения.

Есть идея, как это исправить?

Лучше всего использовать .Find() . Это будет вернуть range , если найдено, или nothing , если нет.

Если вы хотите номер столбца:

С захватом не найденного

Причина, по которой Even if I changed Sep 2008 to 9/1/2008, it still doesn’t return any value.

Это потому, что когда есть дата в excel, Excel автоматически преобразует эту дату в числовое значение. То, что вы действительно хотите найти, — это:

Это число — это количество дней между 9/1/2008 и excel по умолчанию 1/1/1900

каждая дата в excel хранится со значением, подобным этому. Таким образом, самый простой способ справиться с этим состоит в том, чтобы преобразовать то, что вы видите как дату, к тому, что Excel видит как дату, используя CDate() .

Это само по себе даст вам неиспользуемую ошибку, что vba не может получить свойство.

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

Дайте этот снимок, он также будет намного быстрее, чем при использовании альтернативы Find:

Это должно дать ожидаемый результат

Чтобы обработать, когда совпадение не найдено, попробуйте этот Sub:

Таким образом он работает с помощью этого метода:

Nbr,L, C как целое

Datedeb как дата

использовать WorksheetFunction.Match(CDbl(date), range, 0)

В качестве альтернативы используйте Date cell Value2 свойство (которое также будет Double ) вместо Value для ключа поиска.

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

Такая же проблема существует для типа данных Currency , но вы не можете использовать CDbl для него (см. ниже для параметров).

Свойство Range.Value2 (Excel) предполагает, что типы Date и Currency являются «специальными», поскольку они имеют «внутреннее представление», которое резко контрастирует с отображаемым значением. Действительно:

  • Date внутренне представлен как 64-битные (8-байтовые) IEEE числа с плавающей запятой, где целая часть — это дата и дробная часть — это время
  • Currency также является 8-байтным, но обрабатывается как число с фиксированной запятой с 4 дробными цифрами (целое число, масштабируемое на 10 «000)

По-видимому, Match сравнивает эти внутренние значения по соображениям производительности. Поэтому мы должны убедиться, что они, а не читаемые представления, точно соответствуют.

Так как Date уже является внутренним числом с плавающей запятой, CDbl(date) фактически не изменяет данные.

Для типа Currency CDbl изменяет данные, поэтому это не может быть и речи. Поэтому либо

  • используйте точное представление ключа (до 4 дробных цифр) так или иначе, если вам требуется точное совпадение, или
  • сделать ячейки в диапазоне фактически формулами с Round ), если значение для сравнения происходит из другого места и/или вас требуется только равенство 2 дробным цифрам

Я думаю, что могу смело предположить, что значение в F1 является датой. В вашем коде «Sep 2008» есть строка. Вы никогда не сможете получить успешный матч до тех пор, пока ваши типы данных будут непоследовательными.
Если вы ищете дату, убедитесь, что первым параметром является дата.

Вот еще один возможный подход.

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

Чтобы заставить его работать, сначала нужно сделать VBA таким же форматированием данных, как и в вашей таблице Excel:

Ссылка на основную публикацию
Adblock
detector