Excel VBA-将一周中的日期名称从任何语言更改为英语
我编写了一个VBA模块,该模块采用一周中几天的名称“dddd”(例如星期一),将其与一周中的其他几天进行比较,并相应地执行代码。我将该文件发送给一位朋友,操作系统默认语言不是英语,代码不再检测一周中几天的名称。我假设日期值不等于英文值 因此,我如何更改日期以始终使用英语:Excel VBA-将一周中的日期名称从任何语言更改为英语,excel,vba,Excel,Vba,我编写了一个VBA模块,该模块采用一周中几天的名称“dddd”(例如星期一),将其与一周中的其他几天进行比较,并相应地执行代码。我将该文件发送给一位朋友,操作系统默认语言不是英语,代码不再检测一周中几天的名称。我假设日期值不等于英文值 因此,我如何更改日期以始终使用英语: Dim TodayValue As String TodayValue = format(Date, "dddd") 我看到了其他函数,但我不能在VBA上运行它们!任何建议或帮助都将不胜感激。如果我理解得
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-USEvaluate(“文本(今天(),“dddddd”)”
或Evaluate(“文本(现在(),“[$-0409]dddddd”)”)
显示日期。谢谢大家。您可以尝试:EVALUATE(“TEXT(TODAY(),“dddd”)”)
为什么不改为使用工作日编号进行测试?这应该是通用的。5个国家/地区的用户也有类似的问题,所以我们的宏的第一部分检测到了用户的语言设置,即天和月,然后接下来的一切。@Rory我做了一个测试文件,并将它发送给我的朋友,让他尝试使用Evaluate TodayValue5=Evaluate(“TEXT(NOW(),“[$-041D]ddddd”“)”)可能有效,谢谢。[$-041D]代表英语美国(链接:)我在之前的评论中犯了错误,[$-041D]代表瑞典语,[$-0409]代表英语美国。这两种方法都能很好地工作,并以en-USEvaluate(“文本(今天(),“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值为参数,并返回英文工作日名称,而不是本地化名称,还需要一点时间。我怎样才能把日期格式改成英文?我在哪里可以读更多