Управление данными из текстового поля и значений инвертированного дня / месяца
Мне нужно проверить, действительна ли дата, введенная в текстовое поле. Он должен быть одним текстовым полем, так что не обойти это. Теперь у меня есть этот код:
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
Извините, если у него есть текст на итальянском языке. Функция работает прилично, единственная проблема заключается в том, что если я введу, например, 11/14/12 (где дата dd / mm / yy и 14 – ошибка), она инвертирует значения дня и месяца. Вместо этого я хочу, чтобы подчиненный сказал пользователю снова проверить его вход! Вы можете мне помочь? Спасибо!
- Скопировать и вставить содержимое из текстового поля в диапазон ячеек рабочего листа?
- VBA Userform сохраняет значения в следующий раз
- Присоединение текстового поля к точке или строке на диаграмме в Excel / VBA
- сохранение данных в текстовом поле для Excel в vb.net
- Как сделать текстовое поле ActiveX только для чтения, но прокручиваемым в Excel 2013?
- Добавление переменного количества символов в строку, основанная на текущей длине строки
- Дублируйте то, что находится в текстовом поле в других текстовых блоках на других листах
- Код VBA / Macro для получения значения текстового поля
- Ограничение текстовой строки VBA в текстовом поле
- Сохранить значение текстового поля, VBA, Excel
- Как загрузить значения ячейки Excel в пустые текстовые поля в графическом интерфейсе tkinter после того, как файл был выбран и «Открыть файл» и загружен?
- Зацикливание через файлы Txt с использованием проблемы VBA - DIR ()
- Добавить прослушиватель событий в текстовое поле 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