Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 将excel中的日期从dd-mm-yyyy转换为dd/mm/yyyy格式,并检查日期是否有效_Vba_Excel - Fatal编程技术网

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

Vba 将excel中的日期从dd-mm-yyyy转换为dd/mm/yyyy格式,并检查日期是否有效,vba,excel,Vba,Excel,我很难将日期从dd-mm-yyyy格式转换为dd/mm/yyyy格式 比如说,, 当我在excel中输入日期为2012年2月25日(dd/mm/yyyy)时,在下一行输入日期后,它会将日期转换为2012年2月25日(dd-mm-yyyy)格式 我想做的是,当我在excel中以(dd/mm/yyyy)格式输入日期时,它应保持原样,并且在我转到下一个单元格时不应将其更改回(dd-mm-yyyy)格式 当我将日期输入为当前系统日期时,我的代码给我一个错误,我在验证日期时遇到问题,即输入的日期是否有效

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

比如说,, 当我在excel中输入日期为2012年2月25日(dd/mm/yyyy)时,在下一行输入日期后,它会将日期转换为2012年2月25日(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-yyy格式

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

比如说,, 当我将日期输入为2012年9月9日(假设这是您当前的系统日期)并使用IsDate方法检查此日期时,它会给我一个错误

我再次编辑了我的代码


有人能帮我吗?首先,我建议你检查一下电脑上的日期区域设置。如果您将其设置为使用“dd/mm/yyyy”格式,Excel也将使用该格式,并有望消除对任何RegEx VBA代码的需要

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

第三,我已经仔细阅读了您的代码,但它似乎永远不会工作: 一,。因为它从未被声明,
tempdate
是一个
变体

二,。根据
RegExp.Test(pdate)

三,。因此,当您选中
IsDate(tempdate)
时,它将始终是
false
,因为
布尔值决不能是
日期


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

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


而且,正如Olle指出的,如果要在VBA中操作日期,应该使用
Date
对象,而不是
Variant
。通过这种方式,您可以使用,而不是可能存在格式问题的字符串。

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

我已经稍微更新了我的代码,而不是使用
tempdate
,我现在在
IsDate
方法中使用
IsDate
作为
IsDate(pdate)
,这是否正确?是的,应该这样做。不过,我仍然建议您使用
选项Explicit
Date
。)