我试图了解Excel如何使用日期格式和日期值。
问题的背景:
我的应用程序具有以下架构
在Excel工作簿中,一个工作表具有一个Change
事件处理程序,该事件处理程序用于捕获数据(为简化说明,假设所有日期都已保存)并将输入值保存到数据库中。值在工作表中被捕获并保存为字符串,然后加载为文本并格式化为日期。
在工作表中,Change
事件处理程序处理使用以下代码跟踪的输入(从数据库加载数据时禁用事件处理程序)。
With Target
Dim mydate As Date
mydate = CDate(.Value)
Debug.Print " day = " & Day(mydate) & ", month = " & Month(mydate)
End with
手动设置格式(右键单击单元格>格式单元格>日期>选择或定义所需的格式)后,月和日将按预期方式解释。
如果我尝试输入日期(例如10/23/2018),则对输入设置验证,Excel会引发错误(我有法语操作系统和法语Excel版本)。在此示例中,日期中的第一项是日(10),然后是月(23,在此示例中无效),最后是年份(2018)。
Sub SetValidation(ByVal dataRange as Range)
With dataRange
With .Validation
On Error GoTo ErrorHandler
.Delete
.Add Type:=xlValidateDate, AlertStyle:=xlValidAlertStop, _
Operator:=xlGreater, Formula1:="1/1/1900"
.InCellDropdown = True
.IgnoreBlank = True
.ErrorTitle = ""
.ErrorMessage = ""
.ShowInput = False
.ShowError = True
End With '.Validation
End With 'dataRange
ErrorExit:
Exit Sub
' process error
GoTo ErrorExit
End Sub
当我键入23/10/2018时,输入被接受并保存为键入内容(字符串)。
现在,例如,当输入为04/05/2018时,该日期可能会模棱两可,具体取决于阅读该文字的用户的环境是法语还是盎格鲁-撒克逊语。
所以我想弄清楚使用显式格式键入的内容,月份显示为字符串。
如果我将格式设置为“ dd mmm yyyy”,则该值将显示为04 mai 2018(day = 04,month = may),并且Change
事件处理程序中的跟踪将输出以下
天= 4,月= 5 ,与显示的内容一致。
现在,当使用VBA代码应用完全相同的格式时,它不提供相同的输出-交换日期和月份。
With dataRange
.NumberFormat = "dd mmm yyyy"
.Value = .Value 'force format to update
end With
为清楚起见:
问题与如何在法国系统上不使用盎格鲁撒克逊约定的日期设置验证无关:当输入日期为03/23/2018之类的日期时,无论值如何,验证都会令人惊讶地抛出错误被渲染。
问题是关于使用VBA应用日期格式时日期的内部表示方式以及如何向用户呈现日期方面的不一致。我希望手动应用格式会产生与通过VBA应用相同的结果。
在输入日期04/05/2018时,它会得到验证,但是在VBA中应用该格式的值将变为05/04/2018 。
在两种情况下,格式指令都完全相同。
我想了解为什么VBA代码和Excel用户界面具有不同的行为以及是否有可用的修复程序。
答案 0 :(得分:0)
VBA使用(总是)美国日期格式,DateValue(请参阅下文)的帮助对您有用吗?
Sub SetValidation(ByVal dataRange as Range)
With dataRange
With .Validation
On Error GoTo ErrorHandler
.Delete
.Add Type:=xlValidateDate, AlertStyle:=xlValidAlertStop, _
Operator:=xlGreater, Formula1:=DateValue("04/05/2018")
.InCellDropdown = True
.IgnoreBlank = True
.ErrorTitle = ""
.ErrorMessage = ""
.ShowInput = False
.ShowError = True
End With '.Validation
End With 'dataRange
ErrorExit:
Exit Sub
' process error
GoTo ErrorExit
End Sub