Вы можете сделать это относительно легко, используя 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])
в зависимости от того, разделяете ли вы аргументы, используя ,
или ;
.