Преобразование "= Сейчас" в VBA в EST - PullRequest
0 голосов
/ 26 июня 2018

Здравствуйте. В настоящее время я использую макрос, который используется как в Лондоне, так и в Нью-Йорке. В макросе есть раздел, в котором отметка времени действия выполняется с помощью =now. Это создает уникальную ситуацию, в которой действия, которые мы выполняем в Нью-Йорке, выглядят так, будто они произошли до действий, выполненных в Лондоне.

Мой вопрос: можете ли вы преобразовать =now в EST, чтобы создать единую временную метку на протяжении всего проекта?

для справки строка фактического кода выглядит следующим образом

mws.Range(Cells(Lastmwsr + 1, 2), Cells(Lastmwsr + 1, 2)).Value = Now

РЕДАКТИРОВАТЬ: Решения, которые включают добавление +5 к часу, все еще должны определить, как распознать часовой пояс для вызова аргумента, поскольку он должен использоваться в нескольких регионах.

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Я прочитал страницу Чипа Пирсона, правда, немного выше моего уровень квалификации, внедряющий это в мой код.

http://www.cpearson.com/excel/TimeZoneAndDaylightTime.aspx

Я думаю, что в позднем коде Чипса есть ошибка - его ConvertLocalToGMT и GetLocalTimeFromGMT используют переменную с именем StartTime - я думаю, что в обоих случаях это должна быть переменная, которая передается в функцию.

Чтобы использовать его код, вы должны написать что-то вроде:

Range("A1") = GetLocalTimeFromGMT(Now())  

или

Range("A1") = ConvertLocalToGMT(Now())

Я включил код с его сайта ниже. Просто скопируйте и вставьте в новый модуль.

Option Explicit

    Private Type SYSTEMTIME
        wYear As Integer
        wMonth As Integer
        wDayOfWeek As Integer
        wDay As Integer
        wHour As Integer
        wMinute As Integer
        wSecond As Integer
        wMilliseconds As Integer
    End Type

    Private Type TIME_ZONE_INFORMATION
        Bias As Long
        StandardName(0 To 31) As Integer
        StandardDate As SYSTEMTIME
        StandardBias As Long
        DaylightName(0 To 31) As Integer
        DaylightDate As SYSTEMTIME
        DaylightBias As Long
    End Type

    Private Enum TIME_ZONE
        TIME_ZONE_ID_INVALID = 0        ' Cannot determine DST
        TIME_ZONE_STANDARD = 1          ' Standard Time, not Daylight
        TIME_ZONE_DAYLIGHT = 2          ' Daylight Time, not Standard
    End Enum

    Private Declare Function GetTimeZoneInformation Lib "kernel32" _
        (lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long

    Private Declare Sub GetSystemTime Lib "kernel32" _
        (lpSystemTime As SYSTEMTIME)


    Function ConvertLocalToGMT(Optional LocalTime As Date) As Date
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' ConvertLocalToGMT
    ' This function returns the GMT based on LocalTime, if provided.
    ' If LocalTime is not equal to 0, the GMT corresponding to LocalTime
    ' is returned. If LocalTime is 0, the GMT corresponding to the local
    ' time is returned. Since GMT isn't affected by DST, we need to
    ' subtract 1 hour if we are presently in GMT.
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim T As Date
        Dim TZI As TIME_ZONE_INFORMATION
        Dim DST As TIME_ZONE
        Dim GMT As Date

        If LocalTime <= 0 Then
            T = Now
        Else
            T = LocalTime
        End If
        DST = GetTimeZoneInformation(TZI)
        GMT = T + TimeSerial(0, TZI.Bias, 0) - IIf(DST = TIME_ZONE_DAYLIGHT, TimeSerial(1, 0, 0), 0)
        ConvertLocalToGMT = GMT

    End Function

    Function GetLocalTimeFromGMT(Optional GMTTime As Date) As Date
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' GetLocalTimeFromGMT
    ' This returns the Local Time from a GMT time. If GMTTime is present and
    ' greater than 0, it is assumed to be the GMT from which we will calculate
    ' Local Time. If GMTTime is 0 or omitted, it is assumed to be the GMT
    ' time.
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim GMT As Date
        Dim TZI As TIME_ZONE_INFORMATION
        Dim DST As TIME_ZONE
        Dim LocalTime As Date

        If GMTTime <= 0 Then
            GMT = Now
        Else
            GMT = GMTTime
        End If
        DST = GetTimeZoneInformation(TZI)
        LocalTime = GMT - TimeSerial(0, TZI.Bias, 0) + IIf(DST = TIME_ZONE_DAYLIGHT, TimeSerial(1, 0, 0), 0)
        GetLocalTimeFromGMT = LocalTime

    End Function
0 голосов
/ 26 июня 2018

Это способ отобразить значение Сейчас, добавив к нему 5 часов. Вы также можете рассмотреть функцию.

Public Sub TestMe()

    Dim fixTime As Long
    fixTime = 5
    Range("a1") = TimeSerial(Hour(Now) + fixTime, Minute(Now), Second(Now))

End Sub
...