我有一个带日期选择器的电子表格。在单独的单元格中选择日,月和年,如下所示:
然后我有一些代码可以选择所选日期,然后检查它是否是真实日期(例如,不是2月31日),然后检查它是否超过"大于或等于&#34 ;单元格A1中的预设日期。 A1中预设日期的格式无关紧要,只要它采用日期格式。
该功能绝对正常,直到我将我的操作系统区域更改为例如西班牙。因为非常简单,CDate(blah)可以解析" 2016年1月1日"当它在英国/美国地区,但在西班牙地区模式,它期待看到Enero,febrero,marzo,abril等,而不是1月,2月等。这是(Windows)设置我&#39 ; m用于模仿其他地区:
这是我的代码片段:
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区域不会对它产生影响。
答案 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