Как воссоздать следующую функцию Excel как пользовательскую функцию в VBA: = IF (ISBLANK (I2), «поздно», IF (I2> H2, «поздно», «вовремя»)) - PullRequest
0 голосов
/ 09 января 2020

Вот что у меня сейчас, я возвращаю ошибку #NAME после попытки вызвать функцию следующим образом:

= OnTime (H2, I2)

вот моя функция - первая итерация и текущая - после попытки нескольких вещей из связанных потоков:

= IF (ISBLANK (I2), "поздно", IF (I2> H2, "поздно", "в time "))

1-я итерация

Function OnTime(RqstDate, ShipDate)

If IsEmpty(ShipDate) Then

    OnTime = "late"

ElseIf ShipDate > RqstDate Then

    OnTime = "late"

Else

    OnTime = "On Time"

End Function

текущая итерация

Function OnTime(RqstDate As Date, ShipDate As Date) As String

    If IsEmpty(ShipDate) Then

        OnTime = "late"

        Exit Function

    ElseIf ShipDate > RqstDate Then

        OnTime = "late"

        Exit Function

    Else

        OnTime = "On Time"

        Exit Function

End Function

Функция, набранная непосредственно в Excel, работает нормально, но не моя попытка VBA ее реплицировать, Чего мне не хватает, чтобы это нормально функционировало?

Ответы [ 3 ]

1 голос
/ 09 января 2020

Вам не хватает End Если в конце:

Function OnTime(RqstDate As Date, ShipDate As Date) As String
    If IsEmpty(ShipDate) Then
        OnTime = "late"
        Exit Function
    ElseIf ShipDate > RqstDate Then
        OnTime = "late"
        Exit Function
    Else
        OnTime = "On Time"
        Exit Function
    End If 'THIS IS MISSING
End Function

edit: где находится ваша функция? Создайте модуль в своем файле Excel и сохраните там свою функцию . Функции, созданные в ThisWorkbook, не будут видны на листе.

(это было проверено и нормально работает на листе)

0 голосов
/ 09 января 2020

Чтобы уточнить мой вопрос, я хотел создать эту пользовательскую функцию и сделать ее пригодной для использования на нескольких листах. Здесь была проблема со сценариями в виде отсутствующего End If (благодарность Заку за указание на это), но это не то, что я искал точно.

Решение, которое я нашел, отвечало моим потребностям, было связано Скоттом Крейнером в комментариях и предоставлено Egalth в этой теме:

Использование персональной функции XLSB в новой книге

Хотя функцию можно сохранить в personal.xlsb, имя файла необходимо вызывать с помощью функции, чтобы использовать его в новой книге, что делает его почти таким же неуклюжим, как печатать полную версию Excel. Я хотел функцию, которая действовала бы как любая другая предварительно установленная функция: просто введите = ontime ([input], [input]) и отправляйтесь в путь.

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

Если вы хотите действительно универсальный UDF , всегда доступный без префикса или ссылки, вы можете установить его как надстройку.

Единственное исключение состоит в том, что (по крайней мере, в Excel '19) я не смог просто "Сохранить как" "и просто введите .xlam .... Я должен был выбрать" Сохранить как ", а затем выберите" Дополнительные параметры ". Отсюда я смог выбрать «Надстройка Excel» в раскрывающемся меню «Сохранить как тип».

Теперь у меня есть работающий надстройка для пользовательских формул вместе с моим personal.xlsb для макросов!

0 голосов
/ 09 января 2020

Поскольку я не уверен, как вы передаете даты этой функции, и я предполагаю, что вы передаете ее из значения в ячейке. Добавление ByVal и Optional к функции будет означать, что вы хотите использовать значение, а не ссылку в функции; Необязательный Для ShipDate позволит вам запустить функцию без аргумента ShipDate. Как отметил Скотт, вам нужно будет использовать =Personal.xlsb!OnTime() для вызова функции в рабочей книге.

Option Explicit
Sub testDate()
    Dim OrderDate As String
    Dim ShippedDate As String

    OrderDate = Sheet1.Range("A1")
    ShippedDate = Sheet1.Range("B1")

    sheet1.Range("C1") = OnTime(OrderDate,ShippedDate)


End Sub

Function OnTime(ByVal RqstDate As String, Optional ByVal ShipDate As String) As String

    If ShipDate = "" Then

        OnTime = "late"

        Exit Function

    ElseIf ShipDate > RqstDate Then

        OnTime = "late"

        Exit Function

    Else

        OnTime = "On Time"

        Exit Function
    End If

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