Excel VBA:从任何OS区域/区域解析英语日期

时间:2016-03-02 10:29:49

标签: excel vba date locale region

我有一个带日期选择器的电子表格。在单独的单元格中选择日,月和年,如下所示:

enter image description here

然后我有一些代码可以选择所选日期,然后检查它是否是真实日期(例如,不是2月31日),然后检查它是否超过"大于或等于&#34 ;单元格A1中的预设日期。 A1中预设日期的格式无关紧要,只要它采用日期格式。

该功能绝对正常,直到我将我的操作系统区域更改为例如西班牙。因为非常简单,CDate(blah)可以解析" 2016年1月1日"当它在英国/美国地区,但在西班牙地区模式,它期待看到Enero,febrero,marzo,abril等,而不是1月,2月等。这是(Windows)设置我&#39 ; m用于模仿其他地区:

enter image description here

这是我的代码片段:

let addPublicProperties (cls: ClassDeclarationSyntax) (props: Map<string, string>)=
   Map.fold (fun (state:ClassDeclarationSyntax) key (value:string) -> 
      (state.AddMembers(SyntaxFactory.PropertyDeclaration(SyntaxFactory.ParseTypeName(key), value)
        .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword))))) cls props

突出了糟糕的日期&#39;步骤是代码在非英语区域/语言环境设置中出现故障...它将突出显示日期单元格。我认为这是一个很好的方法来发现2月30日的糟糕日期,同时考虑到所有三个单元都是用列表验证的数据。

选择日期而不是键入日期非常重要,我希望保持DD-Month-YYYY的视觉格式,以超越文化(阅读:强制用户遵守单一格式)。

我一直试图弄清楚如何告诉它假装程序区域设置是英国,代码......或者告诉它它所采用的日期是在英国语言环境中。 ..我无法理解,任何建议都表示赞赏。谢谢。

EDIT1:我找到了解决此问题的方法。这可以通过将月份名称转换为数字然后使用DateSerial函数将其转换为...序列日期来实现。这个问题是,如果你给它一个4月31日的日期(4月有30天),那么5月1日的连续转换日期将会产生。因此,我必须制定一个例程,手动检查它是否是合法的日期(包括闰年)...这里是新代码,再次简化,虽然我这次只包括错误处理让它更完整):

Sub getDate()
    'pick up date:
    theDay = Cells(13, 9).Value
    theMonth = Cells(13, 10).Value
    theYear = Cells(13, 11).Value

    theCurrentDate = theDay & " " & theMonth & " " & theYear

    'highlight bad date:
    If Not IsDate(theCurrentDate) Then
        Cells(13, 9).Interior.ColorIndex = 38
        Exit Sub
    End If

    If CDate(theCurrentDate) >= CDate(Cells(1, 1)) Then
        'do some stuff
    End If
End Sub

它有点冗长......但它确实有效,现在OS区域不会对它产生影响。

1 个答案:

答案 0 :(得分:0)

您可以关闭错误处理并将创建的字符串日期分配给日期变量。

然后,您可以检查是否会导致错误;如果确实如此,我们知道使用的日期不是真实日期。

这应该适用于所有地区,因为它不依赖于操作系统语言设置。

Sub getDate()

    Dim checkDate As Date

    'pick up date:
    theDay = Cells(13, 9).Value
    theMonth = Cells(13, 10).Value
    theYear = Cells(13, 11).Value

    theCurrentDate = theDay & " " & theMonth & " " & theYear

    On Error Resume Next
    checkDate = theCurrentDate

    'highlight bad date:
    If Err.Number > 0 Then
        Cells(13, 9).Interior.ColorIndex = 38
        Exit Sub
    End If

    On Error GoTo 0

    If CDate(theCurrentDate) >= CDate(Cells(1, 1)) Then
        'do some stuff
    End If
End Sub