Excel日期格式和值不一致

时间:2018-11-21 17:08:30

标签: excel vba

我试图了解Excel如何使用日期格式和日期值。

问题的背景:

我的应用程序具有以下架构

  • Excel VBA客户端:2016法语和Windows 7法语
  • SQL Server数据库

在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 

为清楚起见:

  • VBA将日期字符串加载为“ 04/05/2018”
  • VBA采用的格式为“ dd mmm yyyy”,日期格式为“ 2018年4月5日”
  • 用户在空白区域中以相同格式输入“ 04/05/2018”,日期格式为“ 2018年5月4日”

问题与如何在法国系统上不使用盎格鲁撒克逊约定的日期设置验证无关:当输入日期为03/23/2018之类的日期时,无论值如何,验证都会令人惊讶地抛出错误被渲染。

问题是关于使用VBA应用日期格式时日期的内部表示方式以及如何向用户呈现日期方面的不一致。我希望手动应用格式会产生与通过VBA应用相同的结果。

在输入日期04/05/2018时,它会得到验证,但是在VBA中应用该格式的值将变为05/04/2018

在两种情况下,格式指令都完全相同。

我想了解为什么VBA代码和Excel用户界面具有不同的行为以及是否有可用的修复程序。

1 个答案:

答案 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