将excel中的日期从dd-mm-yyyy转换为dd / mm / yyyy格式并检查日期是否有效

时间:2012-08-09 10:12:54

标签: excel vba excel-vba

我很难将日期从dd-mm-yyyy格式转换为dd / mm / yyyy格式。

例如, 当我在excel中输入日期为25/02/2012(年/月/日)时,输入日期后如果进入下一行则转换日期为25-02-2012(dd-mm-yyyy)格式

我想要做的是当我在excel中以(dd / mm / yyyy)格式输入日期时,它应该保持原样并且不应该将其改回(dd-我去下一个单元格时格式化了mm-yyyy格式。

当我输入我的日期作为当前系统日期时,我的代码给了我一个错误,我无法验证日期,即输入的日期是否是有效日期

    Sub valid_date()
    ' ---------------------------------------------------------------------
    ' Final Code - Trial
    ' ---------------------------------------------------------------------

    Dim d1 As Variant
    Dim IssueDate As Variant
    Dim str As Variant

        d1 = Worksheets("Sheet1").Cells(6, 1).value

            MsgBox " The Issue Date format is " & d1

        sysdate = Date

        MsgBox "System Date is " & sysdate


                If IsDateValid(d1) Then ' if date is in dd/mm/yyyy format then print this
            If (d1 > sysdate) Then
                MsgBox "Invalid date"
            End If
        End If
     End Sub

    Function IsDateValid(pdate) As Boolean

        IsDateValid = False

        Set RegExp = CreateObject("VBScript.RegExp")

        '   it only matches whether date is in dd/mm/yyyy format or not
        '
        '   [1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1]   ---> it allows the DATE  from 01 to 31
        '   [1-9]|0[1-9]|1[0-2]                 ---> it allows the MONTH from 01 to 12
        '   1[9][0-9][0-9]|2[0][0-9][0-9]       ---> it allows the YEAR  from 1900 to 2099
        '
        '   below is the regular expression for checking the date in dd/mm/yyyy format

        RegExp.Pattern = "^([1-9]|0[1-9]|1[0-9]|2[0-9]|3[0-1])[/]([1-9]|0[1-9]|1[0-2])[/](1[9][0-9][0-9]|2[0][0-9][0-9])$"

        ' check whether the date is in dd/mm/yyyy format or not....
        tempdate = RegExp.Test(pdate)

             If tempdate Then    ' if tempdate is in dd/mm/yyyy format than proceed further
                'If isdate(tempdate) Then  ' if date is a valid date then proceed further
                 If isdate(pdate) Then
                    IsDateValid = True
                Else
                    IsDateValid = False
                End If
            Else
                IsDateValid = False
            End If               
    End Function

我正在使用上面提到的代码,使用正则表达式检查日期是否为dd / mm / yyyy格式

但我遇到的问题是,只要我以dd / mm / yyyy格式输入日期,它就会将excel中的日期视为dd-mm-yyyy格式。

我已经更新了我的代码, 当我输入我的日期时,我还需要一个帮助作为当前系统日期它给我错误

例如,

当我输入我的日期为09/09/2012(假设这是您当前的系统日期),当我使用IsDate方法检查此日期时,它会给我一个错误

我再次编辑了我的代码,

任何人都可以帮助我

3 个答案:

答案 0 :(得分:1)

您不需要VBA / RegEx。选择您输入日期的单元格/列,并创建自定义数字格式:dd/mm/yyyy。现在,无论您如何输入有效日期(05-05-2000,3-1-2010,14 / 6-1990等),都应格式化为dd/mm/yyyy

而且,正如Olle指出的那样,如果要在VBA中操作日期,则应使用Date对象而不是Variant。这样您就可以使用serial number而不是具有潜在格式问题的字符串。

答案 1 :(得分:0)

首先,我建议您检查计算机上日期的区域设置。如果将其设置为使用“dd / mm / yyyy”格式,它也将被Excel使用,并希望不再需要任何RegEx VBA代码。

其次,如果您确实需要使用VBA重新格式化日期,我强烈建议您使用Date数据类型而不是Variants。我还建议您在代码顶部使用Option Explicit并明确声明任何变量,以便最大限度地减少拼写错误并生成质量更好的代码。

第三,我更多地查看了你的代码,它似乎永远不会起作用:

<击> 1。因为它从未声明,tempdateVariant
2。您从tempdate的结果中将boolean指定为RegExp.Test(pdate)
3。因此,当您检查IsDate(tempdate)时,它始终为false,因为boolean永远不会是Date

同样,如果您使用Date数据类型,则可以跳过RegEx ...:)

答案 2 :(得分:0)

我使用Adobe在线PDF到Excel并且日期正确显示为MM / DD / YYYY但在提取月份(= Month())时它返回DD部分。它被解释为DD / MM / YYYY。我将文件保存为.csv关闭并重新启动excel并打开.csv文件,日期是正确的MM / DD / YYYY。