Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 19.12.2008, 10:41   #1
Leanna
Пользователь
 
Регистрация: 31.10.2007
Сообщений: 24
Вопрос Макрос. Найти текущую дату в колонке через Find

Мне необходимо найти ряд, в котором находится текущая дата через Find. Данные находятся в первой колонке.
Подскажите как правильно написать код, а то следующее не работает?

Код:
Sub CurrDate()
rData = Columns(1).Find(Date, LookIn:=xlValues).Row
Rows(rData).Activate
End Sub
Leanna вне форума
Старый 19.12.2008, 11:28   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Метод Find в данном случае может работать некорректно...

Попробуйте такой код:
Код:
Sub FindCurrentDate()
' производится поиск последней ячейки, содержащей текущую дату
    dn = DateValue(Now): Row = 0
    Dim cell As Range
    For Each cell In ActiveSheet.UsedRange.Columns(1).Cells
        cv = cell.Value: If IsDate(cv) Then If cv = dn Then cell.EntireRow.Activate: Row = cell.Row
    Next
    If Row > 0 Then MsgBox "Текущая дата найдена в строке  " & Row, vbInformation
End Sub
Ваш макрос можно использовать в таком виде:
Код:
Sub CurrDate()
    On Error Resume Next
    rData = Columns(1).Find(Date, LookIn:=xlValues).Row
    Rows(rData).Activate
End Sub
Проблема в том, что если подходящая ячейка не найдена, метод Find ничего не возвратит,
и попытка получить свойство Row отсутствующего объекта и вызывает ошибку.

Кроме того, Ваш макрос найдет дату только в том случае, если она записана в ячейку в том же виде,
в каком её возвращает функция Date (в моём случае это формат dd.mm.yyyy)

То есть если в ячейке содержится дата в виде 19 декабря 2008, то макрос ничего не найдет. (он найдёт только дату 19.12.2008)
Мой же вариант макроса осуществит поиск корректно.

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

Последний раз редактировалось EducatedFool; 19.12.2008 в 11:42.
EducatedFool вне форума
Старый 19.12.2008, 12:25   #3
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

EducatedFool абсолютно прав. Дело в том, что метод Find ищет ячейки "как есть", т.е. если сегодняшнюю дату написать в разных форматах, то отыщется лишь та ячейка, в которой совпадают формат ячейки и формат функции Date.
Избавиться от этой "заморочки" поможет цикл по строкам нужного столбца. При этом можно, например, сравнивать значение ячейки с CStr(Date). Предварительно, лучше вставить проверку IsDate(текущая ячейка).
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 19.12.2008, 16:51   #4
Leanna
Пользователь
 
Регистрация: 31.10.2007
Сообщений: 24
По умолчанию

Спасибо большое! Это очень познавательно.
Вы мне очень помогли, буду использовать тогда ваш вариант.
Leanna вне форума
Старый 19.12.2008, 17:02   #5
Leanna
Пользователь
 
Регистрация: 31.10.2007
Сообщений: 24
По умолчанию

Очень любопытно что такое двоеточие ( значит?
dn = DateValue(Now): Row = 0
cv = cell.Value: If IsDate(cv) Then If cv = dn Then cell.EntireRow.Activate: Row = cell.Row

Это вместо переноса строки можно вставлять?
Leanna вне форума
Старый 19.12.2008, 17:06   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Это вместо переноса строки можно вставлять?
Да. Но не всегда.

Например, Ваш макрос можно записать одной строкой:
Код:
Sub CurrDate():    On Error Resume Next:    rData = Columns(1).Find(Date, LookIn:=xlValues).Row:    Rows(rData).Activate: End Sub

Но, к примеру, в случае с таким кодом:
Код:
For Each cell In ActiveSheet.UsedRange.Columns(1).Cells
        cv = cell.Value: If IsDate(cv) Then If cv = dn Then cell.EntireRow.Activate: Row = cell.Row
Next
после Row = cell.Row нельзя ставить двоеточие и оператор Next, так как нарушится логика работы макроса.


То есть запихнуть этот код в 2 строки ещё можно:
Код:
For Each cell In ActiveSheet.UsedRange.Columns(1).Cells: cv = cell.Value: If IsDate(cv) Then If cv = dn Then cell.EntireRow.Activate: Row = cell.Row
Next
а в одну строку уже нельзя (разве что только избавившись предварительно от условного оператора If ... Then ... ).

Последний раз редактировалось EducatedFool; 19.12.2008 в 17:15.
EducatedFool вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос, расширяющий функцию Find neugadal Microsoft Office Word 5 29.09.2008 08:32
Как получить текущую дату из SQL запроса? _ozzy_ SQL, базы данных 2 09.09.2008 21:15
Макрос: удаление строк если в колонке А число 5 Dorvir Microsoft Office Excel 22 15.02.2008 06:25
Проверить через макрос - открыта ли книга? Nikson_iii Microsoft Office Excel 1 26.09.2007 08:35