Excel: определить функцию VBA для сокращения PERCENTRANK - PullRequest
1 голос
/ 26 октября 2019

В Excel формулы часто становятся очень длинными и, следовательно, нечитаемыми. Например, моя формула выглядит следующим образом:

=PERCENTRANK([vol];[@vol])-PERCENTRANK([pos];[@pos])

Я хотел бы написать просто

=SCORE("vol", "pos")

Как я могу создать пользовательскую функцию из исходной формулы рабочего листа?

1 Ответ

2 голосов
/ 26 октября 2019

Вы можете сделать это относительно легко, используя VBA WorksheetFunction. Самая сложная часть на самом деле - получить столбец [@Range], поэтому вам не нужно его вводить - но это тоже не сложно.

В VBE создайте новый стандартный модуль и вставьте следующееUDF:

Public Function SCORE(vol As Range, pos As Range) As Double

    ' We need to get the entire column of the table for each argument
    Dim tbl As ListObject, volRng As Range, posRng As Range
    Set tbl = vol.ListObject

    Rem -> Table columns are relative to the table - not the worksheet
    Set volRng = tbl.Range.Columns(vol.Column - tbl.Range.Cells(1).Column + 1)
    Set posRng = tbl.Range.Columns(pos.Column - tbl.Range.Cells(1).Column + 1)

    With Application.WorksheetFunction
        SCORE = .PercentRank(volRng, vol) - .PercentRank(posRng, pos)
    End With

End Function

Необходимо помнить, что номера столбцов таблицы не всегда совпадают с номерами таблицы (если ваша таблица не начинается в столбце A). Таким образом, вам необходимо сместить число столбцов рабочего листа, вычтя столбец из аргументов vol и pos из номера столбца первой ячейки всей таблицы tbl.range.cells(1). Затем вы добавляете один, потому что номера столбцов в VBA - это «база 1».

Вам все равно придется отправлять диапазон отдельной ячейки - поэтому использование строковых аргументов здесь не поможет. Учитывая все вышесказанное, ваша новая формула рабочего листа будет выглядеть так:

=SCORE([@vol],[@pos])

или

=SCORE([@vol];[@pos])

в зависимости от того, разделяете ли вы аргументы, используя , или ;.

...