Контроль данных из текстового поля и инвертированных значений дня / месяца - PullRequest
1 голос
/ 04 февраля 2012

Мне нужно проверить, действительна ли введенная в текстовое поле дата.Это должно быть одно текстовое поле, так что обходного пути нет.Теперь у меня есть этот код:

Private Sub cmdOK_Click()
Dim dataAnalisi As Date
If IsDate(txtDataAnalisi.Value) Then
dataAnalisi = txtDataAnalisi.Value
    Dim giornoAnalisi, meseAnalisi As Integer
    giornoAnalisi = Format(dataAnalisi, "dd")
    meseAnalisi = Format(dataAnalisi, "mm")
    If giornoAnalisi <= 31 And meseAnalisi <= 12 Then
        Call arrayList(dataAnalisi)
        Unload Me
    Else
        GoTo DateError
    End If
Else
DateError:
    MsgBox "Inserire una data formattata correttamente!", vbCritical, "Errore nell'inserimento!"
    txtDataAnalisi.SetFocus
End If
End Sub

Извините, если текст на итальянском.Функция работает прилично, единственная проблема в том, что, если я введу, например, 14.11.12 (где дата - дд / мм / гг, а 14 - неправильный тип), она инвертирует значения дня и месяца.Вместо этого я хочу, чтобы саб сказал пользователю проверить его ввод снова!Вы можете мне помочь?Спасибо!

1 Ответ

0 голосов
/ 04 февраля 2012

Есть варианты этого вопроса каждый месяц или около того. Я убежден, что Excel будет рассматривать дату, которая является действительной американской датой, как американскую дату. Я думал об этом много лет, но другие не согласны.

Я использую функции, подобные приведенной ниже, для проверки форматов, которые, как я полагаю, Excel будет неверно истолковывать и преобразовывать их в однозначный формат.

Я использую английские сокращения в течение нескольких месяцев. Я считаю, что французский - единственный язык, который не допускает трехбуквенных сокращений в течение нескольких месяцев, так что, возможно, у вас есть свой собственный набор. Вам придется адаптировать эту часть процедуры к вашим требованиям.

Надеется, что это поможет.

Function MyDateValue(ByVal DateIn As String, ByRef DateOut As Date) As Boolean

  ' DateIn is a value to be checked as a valid date.
  ' If it is a valid date, DateOut is set to its value and the function
  ' returns True.

  ' Excel misinterprets dates such as "4/14/11" as 14 April 2011.  This routine
  ' checks for such dates and, if necessary, changes them to an unambiguous
  ' format before calling IsDate and DateValue.

  Dim DatePart() As String
  Dim MonthNum As Long

  Const MonthAbbr As String = "janfebmaraprmayjunjulaugsepoctnovdec"

  ' Replace popular delimiters with Microsoft standard
  DateIn = Replace(DateIn, "-", "/")
  DateIn = Replace(DateIn, "\", "/")

  DatePart = Split(DateIn, "/")
  If UBound(DatePart) = 2 Then
    ' DateStg is three values separated by delimiters
    ' Check middle part
    If IsNumeric(DatePart(1)) Then
      MonthNum = Val(DatePart(1))
      If MonthNum >= 1 And MonthNum <= 12 Then
        ' Middle part could be numeric month
        ' Convert to format Excel does not misinterpret
         'Debug.Assert False
        DatePart(1) = Mid(MonthAbbr, ((MonthNum - 1) * 3) + 1, 3)
        DateIn = Join(DatePart, "-")
        If IsDate(DateIn) Then
          DateOut = DateValue(DateIn)
          MyDateValue = True
          Exit Function
        End If
      Else
        ' Middle part cannot be a month
        'Debug.Assert False
        MyDateValue = False
        Exit Function
      End If
    Else
      'Debug.Assert False
      ' The middle part is not a number.  It could be a month abbreviation
      MonthNum = InStr(1, MonthAbbr, LCase(DatePart(1)))
      If MonthNum = 0 Then
        ' The middle portion is neither a month number nor a month abbreviation
        Debug.Assert False
        MyDateValue = False
      Else
        ' The middle portion is a month abbreviation.
        ' Excel will handle date correctly
        'Debug.Assert False
        MonthNum = (MonthNum - 1) / 3 + 1
        DateIn = Join(DatePart, "-")
        If IsDate(DateIn) Then
        'Debug.Assert False
          DateOut = DateValue(DateIn)
          MyDateValue = True
          Exit Function
        End If
      End If
    End If
  Else
    '    Debug.Assert False
    ' Use IsDate for other formats
    If IsDate(DateIn) Then
       ' Debug.Assert False
      DateOut = DateValue(DateIn)
      MyDateValue = True
      Exit Function
    Else
      '  Debug.Assert False
      MyDateValue = False
    End If
  End If

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...