Метод использования UDF для возврата Range в виде String для использования в функциях Lookup - PullRequest
0 голосов
/ 26 февраля 2019

Для моей проблемы у меня есть UDF, который принимает строку и, используя регистр выбора, затем возвращает ссылку на строку в указанный массив.Возвращаемая строка представляет собой ссылку на массив листа и диапазона в следующем виде:

'WorksheetExample'! $ B $ 1: $ E $ 44

Этот пользовательский UDF является вложеннымв VLookup / Match в моей таблице, чтобы дать правильную ссылку для этого случая.

Public Function EquipCatRNG(tag As String, tagOrCatRef As String)

'Hardcoded Category Ranges for Matches
Dim tagRef, catRef As String
Dim subfix As String
subfix = Left(tag, 1)
Select Case subfix
    Case "E"
    'Range for heat exchanger info, 'Heat Exchangers Template (EDS)'!$B$1:$J$53
    tagRef = "'Heat Exchangers Template (EDS)'!$B$1:$J$1"
    catRef = "'Heat Exchangers Template (EDS)'!$B$1:$B$53"
    Case "P"
        If InStr(tag, "Drive") > 0 Then
        tagRef = "'Pumps And Drives Template (EDS)'!$B$44:$G$44"
        catRef = "'Pumps And Drives Template (EDS)'!$B$44:$B$68"
        Else
        tagRef = "'Pumps And Drives Template (EDS)'!$B$1:$G$1"
        catRef = "'Pumps And Drives Template (EDS)'!$B$1:$B$42"
        End If
    Case "T"
        If InStr(tag, "Internals") > 0 Then
        tagRef = "'Towers Template (EDS)'!$B$46:$E$46"
        catRef = "'Towers Template (EDS)'!$B$46:$B$68"
        Else
        tagRef = "'Towers Template (EDS)'!$B$1:$E$1"
        catRef = "'Towers Template (EDS)'!$B$1:$B$44"
        End If
    Case "R"
        tagRef = "'Reactors Template (EDS)'!$B$1:$C$1"
        catRef = "'Reactors Template (EDS)'!$B$1:$B$61"
    Case "H"
        tagRef = "'Heaters Template (EDS)'!$B$1:$C$1"
        catRef = "'Heaters Template (EDS)'!$B$1:$B$45"
    Case "V"
        If InStr(tag, "Internals") > 0 Then
        tagRef = "'Vessels Template (EDS)'!$B$45:$F$45"
        catRef = "'Vessels Template (EDS)'!$B$45:$B$64"
        Else
        tagRef = "'Vessels Template (EDS)'!$B$1:$F$1"
        catRef = "'Vessels Template (EDS)'!$B$1:$B$43"
        End If
End Select
    tagOrCatRef = LCase(tagOrCatRef)
    If tagOrCatRef = "tag" Then
        EquipCatRNG = tagRef
    Else
        EquipCatRNG = catRef
    End If

End Function

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

РЕДАКТИРОВАТЬ для ясности: эта функция успешно передает строку, но она не работает в качестве допустимой ссылки в функциях Vlookup / Match в моей таблице.Мне нужно знать, как это сделать: 1. Выполнить операцию формулы для возвращенной строки после UDF, чтобы Vlookup принял ее в качестве допустимой ссылки?2. Передать это изначально как диапазон?

1 Ответ

0 голосов
/ 26 февраля 2019

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

Public Function EquipCatRNG(tag As String, tagOrCatRef As String) as range

'Hardcoded Category Ranges for Matches
Dim tagRef As range, catRef As range
Dim subfix As String
subfix = Left(tag, 1)
Select Case subfix
    Case "E"
        'Range for heat exchanger info, 'Heat Exchangers Template (EDS)'!$B$1:$J$53
        Set tagRef = worksheets("Heat Exchangers Template (EDS)").Range("B1:J1")
        Set catRef = worksheets("Heat Exchangers Template (EDS)").Range("B1:B53")
    Case "P"
        If InStr(tag, "Drive") > 0 Then
          Set tagRef = worksheets("Pumps And Drives Template (EDS)").Range("B44:G44")
          Set catRef = worksheets("Pumps And Drives Template (EDS)").Range("B44:B68")
        Else
          Set tagRef = worksheets("Pumps And Drives Template (EDS)").Range("B1:G1")
          Set catRef = worksheets("Pumps And Drives Template (EDS)").Range("B1:B42")
        End If
    Case "T"
        'etc, etc, etc
         ...

End Select

    tagOrCatRef = LCase(tagOrCatRef)
    If tagOrCatRef = "tag" Then
        Set EquipCatRNG = tagRef
    Else
        Set EquipCatRNG = catRef
    End If

End Function

При использовании на рабочем листе это будет выглядеть следующим образом:

=MATCH("abc", EquipCatRNG("E", "Tag"), 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...