Как вызвать функцию VBA в подпроцедуре и объявить ее как переменную? - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь вызвать функцию и объявить ее как переменную в моем текущем подпрограмме.

Я попытался изменить объявление на Public, но я не знаю, в чем проблема.

Я хочу объявить rngResult для результата моей функции

Dim i As Integer
For i = 1 To GPN.Count

    lookupValue1 = GPN.Rows(i).Value
    lookupValue2 = Email.Rows(i).Value

Dim rngResult As Range

Set rngResult = DualFindMod(lookupValue1, lookupValue2, lookupRange1, lookupRange2)

rngResult.Offset(0, 2).Value = Union(GPN.Rows(i), Email.Rows(i)).Value

Next i

Код функции

Public Function DualFindMod(lookupValue1 As String, lookupValue2 As String, lookupRange1 As Range, lookupRange2 As Range) As Range
'Returns selection of lookupRanges based on matching lookupValues.

'A. Set parameters for subroutine arguments

'B. Find & match lookupValues to lookupRanges, then select all matching ranges

'collMatch is the collection of the matching ranges

    Dim i As Integer
    Dim rngResult As Range

    If collMatch.Count > 0 Then
        i = 1
        Set rngResult = collMatch.Item(1)
        Do While i < collMatch.Count
            Set rngResult = Union(rngResult, collMatch.Item(i + 1))
            i = i + 1
        Loop
    End If

End Function

Ответы [ 3 ]

0 голосов
/ 01 июля 2019

"Вы ничего не возвращаете в своей функции. Если вы добавите оператор Set DualFindMod = rngResult: это то, что вы хотите? См. Stackoverflow.com/a/2781710/7599798"

Ответил FunThomas

0 голосов
/ 01 июля 2019

Я думаю, что вы должны добавить возврат значения в функцию, как уже упоминалось. Вот код:

Public Function DualFindMod(lookupValue1 As String, lookupValue2 As String, lookupRange1 As Range, lookupRange2 As Range) As Range
'Returns selection of lookupRanges based on matching lookupValues.

'A. Set parameters for subroutine arguments

'B. Find & match lookupValues to lookupRanges, then select all matching ranges

'collMatch is the collection of the matching ranges

    Dim i As Integer
    Dim rngResult As Range

    If collMatch.Count > 0 Then
        i = 1
        Set rngResult = collMatch.Item(1)
        Do While i < collMatch.Count
            Set rngResult = Union(rngResult, collMatch.Item(i + 1))
            i = i + 1
        Loop
    End If
    DualFindMod = rngResult
End Function

Другой вариант - использовать параметры ref:

Public Sub DualFindMod(lookupValue1 As String, lookupValue2 As String, lookupRange1 As Range, lookupRange2 As Range, ByRef rngOutput As Range) 
'Returns selection of lookupRanges based on matching lookupValues.

'A. Set parameters for subroutine arguments

'B. Find & match lookupValues to lookupRanges, then select all matching ranges

'collMatch is the collection of the matching ranges

    Dim i As Integer
    Dim rngResult As Range

    If collMatch.Count > 0 Then
        i = 1
        Set rngResult = collMatch.Item(1)
        Do While i < collMatch.Count
            Set rngResult = Union(rngResult, collMatch.Item(i + 1))
            i = i + 1
        Loop
    End If
    Set rngOutput = rngResult 
End Sub

А потом назовите это так:

Dim i As Integer
For i = 1 To GPN.Count

    lookupValue1 = GPN.Rows(i).Value
    lookupValue2 = Email.Rows(i).Value

Dim rngResult As Range

DualFindMod lookupValue1, lookupValue2, lookupRange1, lookupRange2, rngResult 

rngResult.Offset(0, 2).Value = Union(GPN.Rows(i), Email.Rows(i)).Value

Next i
0 голосов
/ 01 июля 2019

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

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

Вот хороший пример того, как их настроить: Как объявить глобальную переменную в VBA?

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