2017-02-16 3 views
1

Мой код работает отлично, однако я обнаружил, что когда пользователь вводит dd/mm/yy, он принимается, когда он не должен, как я могу улавливать пользователя, если пользователь не вводит mm/dd/гггг.VBA Advanced Inputbox Date

Dim LastReportDate As String 
Dim StartDate As String 


reTry: 


LastReportDate = InputBox("Insert date in format mm/dd/yyyy", "Date Range Validated:", Format(Now(), "mm/dd/yyyy")) 

'User Presses "Cancel" 
If StrPtr(LastReportDate) = 0 Then MsgBox "Cancel button pressed, Data Range Validated - Range (B3) will be blank.", vbCritical, "User Cancelled Date Entry": Exit Sub 

'If user does not enter anthying restart at 0 
If LastReportDate = vbNullString And StrPtr(LastReportDate) > 0 Then MsgBox "You entered no string": GoTo reTry 

'If user did enter a date, then go validate it 
If LastReportDate <> vbNullString Then: GoTo ValidateDateFormat 


ValidateDateFormat: 
    'User Entered a Valid Date 
If IsDate(LastReportDate) Then 

    'Put start date - end date in B3 
    'Note start date = -6 days: Data Range Validation is one week 
ThisWorkbook.Worksheets(1).cells(3, 2).Value = DateAdd("d", -6, LastReportDate) & " - " & LastReportDate 
    'If user entered wrong date format then go to 0 
Else 
MsgBox "Wrong Date Format": GoTo reTry 
End If 
+1

сравнить форматы даты тоже 'Если Format (LastReportDate, "мм/дд/гггг") = LastReportDate затем' – cyboashu

+0

' Если LastReportDate <> vbNullString Тогда: GoTo ValidateDateFormat' - разделитель инструкций избыточным/запутанным, а ярлык 'ValidateDateFormat' выполняется независимо от того,« вы GoTo'-прыгаете или нет. Кроме того, рассмотрите возможность создания пользовательского UserForm вместо 'InputBox'; у вас будет намного лучший контроль над валидацией и всем. ... и рассмотрим лучшую стратегию цикла, чем цикл GoTo. –

+0

@cyboashu, который отлично работает, Format (LastReportDate, "mm/dd/yyyy") <> LastReportDate, ловушки пользователя, чтобы ввести только формат mm/dd/yyyy. –

ответ

0
Dim LastReportDate As String 
Dim StartDate As String 

reTry: 

LastReportDate = InputBox("Insert date in format mm/dd/yyyy", "Date Range Validated:", Format(Now(), "mm/dd/yyyy")) 

'User Presses "Cancel" 
If StrPtr(LastReportDate) = 0 Then MsgBox "Cancel button pressed, Data Range Validated - Range (B3) will be blank.", vbCritical, "User Cancelled Date Entry": Exit Sub 

'If user does not enter anthying restart at 0 
If LastReportDate = vbNullString And StrPtr(LastReportDate) > 0 Then MsgBox "You entered no string": GoTo reTry 

'If user did enter a date, then go validate it 
If LastReportDate <> vbNullString Then: GoTo ValidateDateFormat 


ValidateDateFormat: 

'Trap user if the user did not enter the required format 
'Thanks @cyboashu 
If Format(LastReportDate, "mm/dd/yyyy") <> LastReportDate Then 
MsgBox "Wrong Date Format": GoTo reTry 

'User Entered a Valid Date 
ElseIf IsDate(LastReportDate) Then 

    'Put start date - end date in B3 
    'Note start date = -6 days: Data Range Validation is one week 
ThisWorkbook.Worksheets(1).cells(3, 2).Value = DateAdd("d", -6, LastReportDate) & " - " & LastReportDate 
    'If user entered wrong date format then go to 0 
Else 
End If 

MsgBox "CFR Macro Completed.", vbInformation + vbOKOnly, "Macro Status: Successful" 
ThisWorkbook.Worksheets(1).Range("B4") = Format(Now, "mm/dd/yyyy") 
ThisWorkbook.Worksheets(1).Range("B2").Select