У меня есть следующие функции VBA в Excel (datecleanup и date1), которые я хотел бы объединить в date1. Или лучше взять логику в dateclean и поставить в date1. Я уверен, что это очень просто, однако я новичок в VBA и не уверен, как это сделать.
функция datecleanup:
Function datecleanup(inputdate As Variant) As Variant
If Len(inputdate) = 0 Then
inputdate = "01/01/1901"
Else
If Len(inputdate) = 4 Then
inputdate = "01/01/" & inputdate
Else
If InStr(1, inputdate, ".") Then
inputdate = Replace(inputdate, ".", "/")
End If
dateclean = Split(strInput, Chr(32))(0)
End If
End If
End Function
функция date1:
datecleanup = inputdate
Function date1(strInput) As String
date1 = Split(strInput, Chr(32))(0)
End Function
Я хотел бы, чтобы логика date1 была заключительной частью функции dateclean. Как я могу этого добиться? Огромное спасибо!
Обновлено:
Это правильная функция очистки даты:
Function datecleanup(inputdate As Variant) As Variant
If Len(inputdate) = 0 Then
inputdate = "01/01/1901"
Else
If Len(inputdate) = 4 Then
inputdate = "01/01/" & inputdate
Else
If InStr(1, inputdate, ".") Then
inputdate = Replace(inputdate, ".", "/")
End If
End If
End If
datecleanup = inputdate
End Function





Вот некоторая очищенная логика, в которой все это объединено в одну функцию:
Function datecleanup(inputdate As Variant) As String
If Len(inputdate) = 0 Then
inputdate = "01/01/1901"
ElseIf Len(inputdate) = 4 Then
inputdate = "01/01/" & inputdate
ElseIf InStr(1, inputdate, ".") Then
inputdate = Replace(inputdate, ".", "/")
End If
datecleanup = Split(inputDate, Chr(32))(0)
End Function
В качестве альтернативы вы можете сохранить их отдельные функции и просто вызвать функцию datecleanup из своей функции date1:
Private Function datecleanup(inputdate As Variant) As String
If Len(inputdate) = 0 Then
inputdate = "01/01/1901"
ElseIf Len(inputdate) = 4 Then
inputdate = "01/01/" & inputdate
ElseIf InStr(1, inputdate, ".") Then
inputdate = Replace(inputdate, ".", "/")
End If
datecleanup = inputdate
End Function
Function date1(strInput) As String
date1 = Split(datecleanup(strInput), Chr(32))(0)
End Function
Это хорошо, потому что логика сохраняется отдельно (если это здесь желательно ...)
Я попробовал ваш первый метод, но получаю сообщение об ошибке выполнения «Индекс вне допустимого диапазона». Любые идеи?
Я только что отредактировал сообщение выше, так как первая функция была неправильной. Если не возражаете, взгляните. Это дало эту ошибку для: datecleanup = Split (strInput, Chr (32)) (0).
Ой! конечно было бы. Простите. Жирный потрогал эту строчку. Я поправил.
И с учетом вашего редактирования (теперь это имеет смысл ... Мне было интересно, как это могло бы работать раньше) ... любой из этих вариантов должен работать.
Потрясающе, это здорово !! Работает как положено! Я использую функцию разделения, потому что у меня есть проблемы с целостностью данных, когда текст добавляется в поля даты. Функция разделения отлично работает при захвате только даты, если дата появляется первой в строке. Однако, если текст появляется первым, то Split возвращает первое слово и игнорирует последующую дату в строке. Примером может служить строка «Свинка на 8.10.15», и сплит возвращает «Свинка». Наверное, следует спросить в другом потоке, который я предполагаю ...
Наверное, было бы неплохо. Я бы открыл новый вопрос, содержащий некоторые образцы данных, которые содержат всевозможные уродливые данные, которые вам нужно проанализировать, чтобы найти эту дату и ваше текущее использование функции разделения, а также то, как это неприемлемо с учетом различных типов строк, которые вы используете имея дело с.
@ JBinson88 изучите регулярные выражения, они помогут вам сопоставить шаблон даты внутри строки. Особенно, если вам приходится мириться с несовместимыми разделителями datepart.
Создайте подпрограмму или используйте существующую подпрограмму и вызовите обе функции в том порядке, в котором вы хотите, чтобы они выполнялись. Это может потребовать использования глобальных переменных для хранения данных между двумя функциями.