Excel VBA-将一周中的日期名称从任何语言更改为英语

Excel VBA-将一周中的日期名称从任何语言更改为英语,excel,vba,Excel,Vba,我编写了一个VBA模块,该模块采用一周中几天的名称“dddd”(例如星期一),将其与一周中的其他几天进行比较,并相应地执行代码。我将该文件发送给一位朋友,操作系统默认语言不是英语,代码不再检测一周中几天的名称。我假设日期值不等于英文值 因此,我如何更改日期以始终使用英语: Dim TodayValue As String TodayValue = format(Date, "dddd") 我看到了其他函数,但我不能在VBA上运行它们!任何建议或帮助都将不胜感激。如果我理解得

我编写了一个VBA模块,该模块采用一周中几天的名称“dddd”(例如星期一),将其与一周中的其他几天进行比较,并相应地执行代码。我将该文件发送给一位朋友,操作系统默认语言不是英语,代码不再检测一周中几天的名称。我假设日期值不等于英文值

因此,我如何更改日期以始终使用英语:

Dim TodayValue As String
TodayValue = format(Date, "dddd")

我看到了其他函数,但我不能在VBA上运行它们!任何建议或帮助都将不胜感激。

如果我理解得很好,您需要始终以英语获取所提供日期的周末吗

所以你可以用这个:

Dim today值作为字符串
TodayValue=选择(工作日(日期),“星期日”、“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”)

WeekDay(Date)
检索从星期日开始的日期,并使用
Choose
过程返回有关日期的名称。

如果我理解得很好,您需要始终以英语获取所提供日期的工作日吗

所以你可以用这个:

Dim today值作为字符串
TodayValue=选择(工作日(日期),“星期日”、“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”)

WeekDay(Date)
检索从星期日开始的日期,并使用
Choose
过程返回与日期相关的名称。

您不应依赖代码中的本地化值

要指定工作日,请始终使用DayOfWeek值,然后在需要显示时对其进行格式化:

Dim DayToday作为VbDayOfWeek
DayToday=工作日(日期,vbUseSystemDayOfWeek)
调试.打印工作日名称(DayToday,vbUseSystemDayOfWeek)
对于不变的(英文)工作日名称,我们使用此函数,它完全模仿本机函数
WeekdayName

' Returns the English weekday name for the passed weekday number.
' Accepted numbers are 1 to 7. Other values will raise an error, as
' will an invalid value for FirstDayOfWeek.
' If Abbreviate is True, the returned name is abbreviated.
'
' 2020-11-13. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function WeekdayNameInvariant( _
    ByVal Weekday As Long, _
    Optional ByVal Abbreviate As Boolean, _
    Optional ByVal FirstDayOfWeek As VbDayOfWeek = VbDayOfWeek.vbUseSystemDayOfWeek) _
    As String
    
    Const AbbreviatedLength As Integer = 2
    
    Dim WeekdayNames( _
        FirstWeekday To _
        LastWeekday)        As String
    Dim Name                As String
    
    If Not (IsWeekday(Weekday) And IsWeekday(FirstDayOfWeek)) Then
        Err.Raise DtError.dtInvalidProcedureCallOrArgument
        Exit Function
    End If
    
    ' Non-localized (invariant) weekday names.
    WeekdayNames(VBA.Weekday(1, FirstDayOfWeek)) = "Sunday"
    WeekdayNames(VBA.Weekday(2, FirstDayOfWeek)) = "Monday"
    WeekdayNames(VBA.Weekday(3, FirstDayOfWeek)) = "Tuesday"
    WeekdayNames(VBA.Weekday(4, FirstDayOfWeek)) = "Wednesday"
    WeekdayNames(VBA.Weekday(5, FirstDayOfWeek)) = "Thursday"
    WeekdayNames(VBA.Weekday(6, FirstDayOfWeek)) = "Friday"
    WeekdayNames(VBA.Weekday(7, FirstDayOfWeek)) = "Saturday"
    
    If Abbreviate = True Then
        Name = Left(WeekdayNames(Weekday), AbbreviatedLength)
    Else
        Name = WeekdayNames(Weekday)
    End If
    
    WeekdayNameInvariant = Name

End Function


' Returns True if Expression can be a value of VbDayOfWeek.
' Returns False if Expression is Null or an invalid value.
'
' 2017-01-09. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function IsWeekday( _
    ByVal Expression As Variant) _
    As Boolean
    
    Dim Result  As Boolean

    Select Case Expression
        Case _
            VbDayOfWeek.vbMonday, _
            VbDayOfWeek.vbTuesday, _
            VbDayOfWeek.vbWednesday, _
            VbDayOfWeek.vbThursday, _
            VbDayOfWeek.vbFriday, _
            VbDayOfWeek.vbSaturday, _
            VbDayOfWeek.vbSunday, _
            VbDayOfWeek.vbUseSystemDayOfWeek
            Result = True
    End Select

    IsWeekday = Result

End Function

您永远不应该依赖代码中的本地化值

要指定工作日,请始终使用DayOfWeek值,然后在需要显示时对其进行格式化:

Dim DayToday作为VbDayOfWeek
DayToday=工作日(日期,vbUseSystemDayOfWeek)
调试.打印工作日名称(DayToday,vbUseSystemDayOfWeek)
对于不变的(英文)工作日名称,我们使用此函数,它完全模仿本机函数
WeekdayName

' Returns the English weekday name for the passed weekday number.
' Accepted numbers are 1 to 7. Other values will raise an error, as
' will an invalid value for FirstDayOfWeek.
' If Abbreviate is True, the returned name is abbreviated.
'
' 2020-11-13. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function WeekdayNameInvariant( _
    ByVal Weekday As Long, _
    Optional ByVal Abbreviate As Boolean, _
    Optional ByVal FirstDayOfWeek As VbDayOfWeek = VbDayOfWeek.vbUseSystemDayOfWeek) _
    As String
    
    Const AbbreviatedLength As Integer = 2
    
    Dim WeekdayNames( _
        FirstWeekday To _
        LastWeekday)        As String
    Dim Name                As String
    
    If Not (IsWeekday(Weekday) And IsWeekday(FirstDayOfWeek)) Then
        Err.Raise DtError.dtInvalidProcedureCallOrArgument
        Exit Function
    End If
    
    ' Non-localized (invariant) weekday names.
    WeekdayNames(VBA.Weekday(1, FirstDayOfWeek)) = "Sunday"
    WeekdayNames(VBA.Weekday(2, FirstDayOfWeek)) = "Monday"
    WeekdayNames(VBA.Weekday(3, FirstDayOfWeek)) = "Tuesday"
    WeekdayNames(VBA.Weekday(4, FirstDayOfWeek)) = "Wednesday"
    WeekdayNames(VBA.Weekday(5, FirstDayOfWeek)) = "Thursday"
    WeekdayNames(VBA.Weekday(6, FirstDayOfWeek)) = "Friday"
    WeekdayNames(VBA.Weekday(7, FirstDayOfWeek)) = "Saturday"
    
    If Abbreviate = True Then
        Name = Left(WeekdayNames(Weekday), AbbreviatedLength)
    Else
        Name = WeekdayNames(Weekday)
    End If
    
    WeekdayNameInvariant = Name

End Function


' Returns True if Expression can be a value of VbDayOfWeek.
' Returns False if Expression is Null or an invalid value.
'
' 2017-01-09. Gustav Brock, Cactus Data ApS, CPH.
'
Public Function IsWeekday( _
    ByVal Expression As Variant) _
    As Boolean
    
    Dim Result  As Boolean

    Select Case Expression
        Case _
            VbDayOfWeek.vbMonday, _
            VbDayOfWeek.vbTuesday, _
            VbDayOfWeek.vbWednesday, _
            VbDayOfWeek.vbThursday, _
            VbDayOfWeek.vbFriday, _
            VbDayOfWeek.vbSaturday, _
            VbDayOfWeek.vbSunday, _
            VbDayOfWeek.vbUseSystemDayOfWeek
            Result = True
    End Select

    IsWeekday = Result

End Function


您可以尝试:
EVALUATE(“TEXT(TODAY(),“ddddd”)”
为什么不改为使用工作日编号进行测试?这应该是通用的。5个国家/地区的用户也有类似的问题,所以我们的宏的第一部分检测到了用户的语言设置,即天和月,然后接下来的一切。@Rory我做了一个测试文件,并将它发送给我的朋友,让他尝试使用Evaluate TodayValue5=Evaluate(“TEXT(NOW(),“[$-041D]ddddd”“)”)可能有效,谢谢。[$-041D]代表英语美国(链接:)我在之前的评论中犯了错误,[$-041D]代表瑞典语,[$-0409]代表英语美国。这两种方法都能很好地工作,并以en-US
Evaluate(“文本(今天(),“dddddd”)”
Evaluate(“文本(现在(),“[$-0409]dddddd”)”)
显示日期。谢谢大家。您可以尝试:
EVALUATE(“TEXT(TODAY(),“dddd”)”)
为什么不改为使用工作日编号进行测试?这应该是通用的。5个国家/地区的用户也有类似的问题,所以我们的宏的第一部分检测到了用户的语言设置,即天和月,然后接下来的一切。@Rory我做了一个测试文件,并将它发送给我的朋友,让他尝试使用Evaluate TodayValue5=Evaluate(“TEXT(NOW(),“[$-041D]ddddd”“)”)可能有效,谢谢。[$-041D]代表英语美国(链接:)我在之前的评论中犯了错误,[$-041D]代表瑞典语,[$-0409]代表英语美国。这两种方法都能很好地工作,并以en-US
Evaluate(“文本(今天(),“dddddd”)”
Evaluate(“文本(现在(),“[$-0409]dddddd”)”)
显示日期。谢谢大家。就我所知,如果工作日从周一开始,这是行不通的,因为
WeekDay
独立于系统设置运行。因为它有第二个参数,默认为
vbSunday
。它工作正常。输出显示的是星期二而不是tisdag(瑞典语为星期二)。虽然您的表达式回答了这个问题,@StureS有一点,因为
Weekday
不返回工作日名称的数字,而是一周中第一天为1的日期位置的数字。因此,如果一周的第一天是星期一,则本机函数
WeekdayName(Weekday(#2021-02-24#))将返回星期四。正确的表达式将是
WeekdayName(Weekday(#2021-02-24#,vbUseSystemDayOfWeek))
,它返回星期三。@StureS:添加到上面的注释中:一个模拟
WeekdayName
的函数,该函数以一个Weekday值为参数,并返回英文工作日名称,而不是本地化名称,需要多一点时间。如果工作日从周一开始,就我所知,这是行不通的,因为
WeekDay
独立于系统设置运行。因为它有第二个参数,默认为
vbSunday
。它工作正常。输出显示的是星期二而不是tisdag(瑞典语为星期二)。虽然您的表达式回答了这个问题,@StureS有一点,因为
Weekday
不返回工作日名称的数字,而是一周中第一天为1的日期位置的数字。因此,如果一周的第一天是星期一,则本机函数
WeekdayName(Weekday(#2021-02-24#))将返回星期四。正确的表达式将是
WeekdayName(Weekday(#2021-02-24#,vbUseSystemDayOfWeek))
,它返回星期三。@StureS:添加到上面的注释中:一个模拟
WeekdayName
的函数,该函数以一个Weekday值为参数,并返回英文工作日名称,而不是本地化名称,还需要一点时间。我怎样才能把日期格式改成英文?我在哪里可以读更多