Изменить произвольное количество переменных в подпрограмме - PullRequest
1 голос
/ 09 февраля 2020

Итак, у меня есть приложение, в котором я просматриваю данные из множества различных таблиц и вводю данные в группу переменных, которые будут использоваться в других местах. Я написал функцию для поиска и возврата строки (в виде Range) из указанной таблицы с учетом записи в первом столбце:

Public Function RowLookup(table As Range, entry As String) As Variant
    Dim rowNum As Variant
    rowNum = Application.Match(entry, table.Columns.item(1), 0)

    If IsError(rowNum) Then
        RowLookup = CVErr(xlErrValue)
    Else
        RowLookup = table.Rows(rowNum)(1)
    End If
End Function

Однако теперь я получил тонну кода это выглядит так:

tempRow = RowLookup(Range("Table1"), var1)
If IsError(tempRow) Then
    var2 = ""
    var3 = ""
    var4 = ""
    var5 = ""
    Debug.Print "Error looking up data"
Else
    var2 = tempRow(1, 2)
    var3 = tempRow(1, 3)
    var4 = tempRow(1, 4)
    var5 = tempRow(1, 6)
End If

Есть идеи, как включить этот шаблонный код в функцию? Я хочу, чтобы он взял произвольно длинный список пар (colIndex, variable) и затем установил каждую переменную на основе columnIndex. Использование коллекции не работает, так как я могу изменить только запись в коллекции, а не исходную переменную.

1 Ответ

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

Вы можете передать Vars и Table Indexs как ParamArray

Я бы переделал RowLookup как Sub. Param Array ожидает пары переменных и номера столбцов таблицы.

  • Нечетное число переданных параметров приводит к ошибке.
  • Индекс столбцов> количество столбцов в таблице игнорируется
  • Варианты не обязательно должны быть вариантами (они будут приводиться к типу, поэтому могут выдавать ошибки)
Public Sub RowLookup(table As Range, entry As Variant, ParamArray Vars() As Variant)
    Dim rowNum As Variant
    Dim i As Long
    Dim TableData As Variant
    Dim TableColumns As Long

    If WorksheetFunction.IsEven(UBound(Vars)) Then
        For i = 0 To UBound(Vars) - 1 Step 2
            Vars(i) = CVErr(xlErrNA)
        Next
    Else
        rowNum = Application.Match(entry, table.Columns(1), 0)

        If IsError(rowNum) Then
            For i = 0 To UBound(Vars) - 1 Step 2
                Vars(i) = CVErr(xlErrValue)
            Next
        Else
            TableData = table.Value
            TableColumns = UBound(TableData, 2)
            For i = 0 To UBound(Vars) - 1 Step 2
                If Vars(i + 1) >= 1 And Vars(i + 1) <= TableColumns Then
                    Vars(i) = TableData(rowNum, Vars(i + 1))
                End If
            Next
        End If
    End If
End Sub

и называть это так

Sub Demo()
    Dim SomeLongVar As Long
    Dim SomeStringVar As String
    Dim var3(1 To 2) As Variant
    Dim var4 As Variant
    Dim var5 As Variant

    var3(2) = 5 ' Column Index

    RowLookup Range("Table1"), "x", SomeLongVar, 2, SomeStringVar, 3, var3(1), var3(2)

    Debug.Print SomeLongVar, SomeStringVar, var3(1)
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...