VBA - удалить секунды из функции NOW

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

Проблема в том, что скрипт запускается каждые 20 секунд, поэтому я не могу учитывать секунды для функции NOW.

Есть ли способ удалить их? Иметь только лайки (ДЕНЬ,МЕСЯЦ,ГОД,ЧАС,МИНУТА)?

Что-то в этом духе:

 MyLimit = NOW(DAY,MONTH,YEAR,HOUR,MINUTE)

 For Each FormulaCell In FormulaRange.Cells
 With FormulaCell
            If .Value = MyLimit Then
            Call Notify

Вот сценарий, в котором я пытаюсь определить дату и время.

Option Explicit

Public Function AutoRun()
Application.OnTime Now + TimeValue("00:00:20"), "TaskTracker2"
End Function

Public Sub TaskTracker2()
Dim FormulaCell          As Range
Dim FormulaRange    As Range
Dim NotSentMsg      As String
Dim MyMsg           As String
Dim SentMsg         As String
Dim SendTo          As String
Dim CCTo            As String
Dim BCCTo           As String
Dim MyLimit         As Date


NotSentMsg = "Not Sent"
SentMsg = "Sent"
SendTo = Range("D2")
CCTo = Range("E2")
BCCTo = Range("F2")

MyLimit = Format((Now), "DD/MM/YYYY HH:MM")

Set FormulaRange = Range("E5:E35")
On Error GoTo EndMacro:
For Each FormulaCell In FormulaRange.Cells
    With FormulaCell
            If .Value = MyLimit Then
                MyMsg = SentMsg
                If .Offset(0, 1).Value = NotSentMsg Then
                    strTO = SendTo
                    strCC = CCTo
                    strBCC = BCCTo
                    strSub = "[Task Manager] Reminder that you need to: " & Cells(FormulaCell.Row, "A").Value
                    strBody = "Hello Sir, " & vbNewLine & vbNewLine & _
                        "This email is to notify that you that your task : " & Cells(FormulaCell.Row, "A").Value & " with the following note: " & Cells(FormulaCell.Row, "B").Value & " is nearing its Due Date." & vbNewLine & "It would be wise to complete this task before it expires!" & _
                        vbNewLine & vbNewLine & "Truly yours," & vbNewLine & "Task Manager"
                    If sendMail(strTO, strSub, strBody, strCC) = True Then MyMsg = SentMsg

                End If
            Else
                MyMsg = NotSentMsg
            End If
        Application.EnableEvents = False
        .Offset(0, 1).Value = MyMsg
        Application.EnableEvents = True

    End With

Next FormulaCell
AutoRun

ExitMacro:
Exit Sub

EndMacro:
Application.EnableEvents = True

MsgBox "Some Error occurred." _
     & vbLf & Err.Number _
     & vbLf & Err.Description

End Sub

person Francis Maltais    schedule 04.02.2016    source источник


Ответы (7)


Вы можете просто округлить MyLimit до ближайшей минуты:

MyLimit = Round(Now * 1440, 0) / 1440

Учтите, что при сравнении его с содержимым ячейки вам может понадобиться использовать сравнение <= или >=, чтобы избежать проблем, если время изменится в «неправильное» время для равенства.

person Ron Rosenfeld    schedule 04.02.2016
comment
Это сработало Магия! Спасибо, я перебрал столько возможностей! - person Francis Maltais; 05.02.2016
comment
Если бы я хотел получить уведомление за 30 минут до СЕЙЧАС, как бы я это сделал? Я не очень хорошо умею писать несколько модификаций функции: P - person Francis Maltais; 05.02.2016
comment
@FrancisMaltais Просто добавьте 30 минут к MyLimit, прежде чем проводить сравнение. 30 минут = 30/1440 или Timeserial(0,30,0) - person Ron Rosenfeld; 05.02.2016
comment
Что-то вроде: MyLimit = (Round(Now * 1440, 0)/1440) - 30/1440? - person Francis Maltais; 05.02.2016
comment
@FrancisMaltais Вы могли бы, хотя для ясности я бы использовал две строки; первый для Round MyLimit, а второй для прибавления или вычитания 30 минут. - person Ron Rosenfeld; 05.02.2016
comment
Или более красивый вариант: ((Округление(Теперь * 1440, 0) - 30)/1440) Что-то вроде MyLimit = Round(Now * 1440, 0)/1440 & MyLimit = MyLimit - 30/1440 ?? - person Francis Maltais; 05.02.2016

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

CDate(format(Now, "dd-mmm-yyyy hh:mm"))
'... or,
CLng(Now * 1440)/1440

Оба они возвращают истинное числовое значение даты и времени с удаленными секундами. Они не усредняют секунды до ближайшей минуты; просто удалите их.

person Community    schedule 04.02.2016
comment
Я считаю, что CLng округляет (и округляет до ближайшего четного числа) - person Ron Rosenfeld; 05.02.2016
comment
Вы действительно правы; Должно быть, я перепутал результаты нескольких испробованных методов. - person ; 05.02.2016
comment
Большое спасибо, Jeeped, похоже, это тоже работает :) Я соглашусь с решением Рона, так как он опубликовал немного быстрее, и его работы тоже великолепны! Это действительно ценится! - person Francis Maltais; 05.02.2016
comment
@FrancisMaltais - Не беспокойтесь; здесь есть несколько хороших идей. Однако я бы поставил под сомнение ваше определение «быстрее», поскольку мой пост был на семь минут раньше поста Рона. - person ; 05.02.2016
comment
О, это правда, я неправильно прочитал время. Мой плохой D: Могу ли я выбрать 2 лучших ответа? - person Francis Maltais; 05.02.2016
comment
@FrancisMaltais - Не беспокойся об этом. Часто одинаковые результаты получаются совершенно разными методами. Выберите тот, который имеет смысл для вас. - person ; 05.02.2016

Другой метод будет таким:

MyLimit = now-second(now)/60/60/24

second(now) возвращает секунды, а /60/60/24 преобразует их в дни, в которых хранится каждая дата и время. Используйте этот или ответ Jeeped, любой из них должен работать.

Изменить:

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

MyLimit = now
MyLimit =MyLimit -second(MyLimit)/60/60/24
person vacip    schedule 04.02.2016
comment
Спасибо :) Похоже, это тоже сработает! Действительно ценится. - person Francis Maltais; 05.02.2016

Попробуйте limit = Format((Now), "ДД/ММ/ГГГГ ЧЧ:ММ")

person Slubee    schedule 04.02.2016
comment
Я получаю ошибку времени выполнения '13' - Несоответствие типов при попытке MyLimit = Format((Now), DD/MM/YYYY HH:MM) - person Francis Maltais; 05.02.2016

Используйте функцию Date вместо функции NOW https://msdn.microsoft.com/en-us/library/aa227520(v=VS.60).aspx

ОБНОВИТЬ

person ske57    schedule 04.02.2016
comment
Когда я это делаю, он не может проверить время суток :/ - person Francis Maltais; 05.02.2016
comment
Поэтому, если я использую дату, а моя эталонная ячейка, скажем, 04.02.2016 - 16:02, я ничего не получаю. Но это работает только при использовании даты 04.02.2016. - person Francis Maltais; 05.02.2016
comment
Как насчет формата (СЕЙЧАС(), дд/мм/гггг - чч:мм AM/PM) - person ske57; 05.02.2016
comment
Я получаю ошибку времени выполнения '13' - Несоответствие типов при попытке MyLimit = Format((Now), DD/MM/YYYY HH:MM) - person Francis Maltais; 05.02.2016
comment
Кроме того, сценарий не срабатывает, если я удаляю MyLimit и делаю: If .Value = Format((Now), DD/MM/YYYY HH:MM) /ММ/ГГГГ ЧЧ:ММ - person Francis Maltais; 05.02.2016
comment
Dim MyLimit As Date MyLimit = Формат (сейчас, дд.мм.гг чч:мм AM/PM) - person ske57; 05.02.2016
comment
Большое спасибо за помощь. Эта модификация исправляет ошибку компиляции, но скрипт по-прежнему не отправляет мне уведомление, когда должен... Ниже я добавлю скрипт, может он натолкнет вас на мысль. Обновлено в основной теме. - person Francis Maltais; 05.02.2016

Обычно я использую функцию =TIME(HOUR(NOW()),MINUTE(NOW()),0)

person kitarika    schedule 19.09.2016

Альтернативный подход для VBA Office 2010 и более поздних версий:

 Dim DateWithoutSeconds : DateWithoutSeconds = DateAdd("s",-Second(Now),Now)

Обратите внимание, что минус (-) удаляет секунды.

Дополнительные сведения см. по адресу https://msdn.microsoft.com/en-us/library/office/gg251759.aspx

person Remko Delsman    schedule 30.05.2017