Объединение двух функций vba

У меня есть следующие функции 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

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

Cyril 18.05.2018 19:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
312
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот некоторая очищенная логика, в которой все это объединено в одну функцию:

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

Это хорошо, потому что логика сохраняется отдельно (если это здесь желательно ...)

Я попробовал ваш первый метод, но получаю сообщение об ошибке выполнения «Индекс вне допустимого диапазона». Любые идеи?

JBinson88 18.05.2018 19:42

Я только что отредактировал сообщение выше, так как первая функция была неправильной. Если не возражаете, взгляните. Это дало эту ошибку для: datecleanup = Split (strInput, Chr (32)) (0).

JBinson88 18.05.2018 19:51

Ой! конечно было бы. Простите. Жирный потрогал эту строчку. Я поправил.

JNevill 18.05.2018 19:52

И с учетом вашего редактирования (теперь это имеет смысл ... Мне было интересно, как это могло бы работать раньше) ... любой из этих вариантов должен работать.

JNevill 18.05.2018 19:53

Потрясающе, это здорово !! Работает как положено! Я использую функцию разделения, потому что у меня есть проблемы с целостностью данных, когда текст добавляется в поля даты. Функция разделения отлично работает при захвате только даты, если дата появляется первой в строке. Однако, если текст появляется первым, то Split возвращает первое слово и игнорирует последующую дату в строке. Примером может служить строка «Свинка на 8.10.15», и сплит возвращает «Свинка». Наверное, следует спросить в другом потоке, который я предполагаю ...

JBinson88 18.05.2018 20:04

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

JNevill 18.05.2018 20:06

@ JBinson88 изучите регулярные выражения, они помогут вам сопоставить шаблон даты внутри строки. Особенно, если вам приходится мириться с несовместимыми разделителями datepart.

Mathieu Guindon 18.05.2018 20:07

Другие вопросы по теме