Public Function GetK12(X) As Integer
K12_Values = Application.ActiveWorkbook.Sheets("K12").Range("B4:B6980")
GetK12 = Application.Index(K12_Values, X)
End Function
Вызов этого из моего листа возвращает ошибку #VALUE. Я проверил переменные. INSERT-MATCH работает с этой переменной в другом месте. Что я здесь делаю не так? [это фрагмент, который я тестировал. НЕ полная функция]
РЕШЕНО: Всем спасибо. Да, мне пришлось повозиться с типами переменных.
Рассмотрите возможность использования ThisWorkbook
вместо ActiveWorkbok
.
Является ли K12_Values диапазоном, если да, то его необходимо установить.
В MS365 использование UDF практически устарело. В диспетчере имен используйте, например. GetK12
в качестве имени и формула =LAMBDA(r,INDEX('K12'!B4:B6980,r))
в качестве ссылки, получая ту же функциональность (при необходимости сохраняя книгу в формате .xlsx
).
Чтобы отладить это, вызовите его из Sub
:
Sub tester()
Debug.Print GetK12(1)
End Sub
Скорее всего, вы получите ошибку «Несоответствие типов», и ваше вероятное исправление будет состоять из нескольких частей:
As Integer
на As Variant
.Index
может возвращать массив.Другие рекомендации:
ActiveWorkbook
на ThisWorkbook
.X
.Application.Volatile
, чтобы принудительно пересчитать UDF, например. когда ячейка в B4:B6980
изменяется.Public Function GetK12(ByVal X As Long) As Variant
Application.Volatile
Dim K12_Values As Variant
K12_Values = ThisWorkbook.Worksheets("K12").Range("B4:B6980").Value
GetK12 = Application.Index(K12_Values, X, 1)
End Function
Я только что протестировал этот код. Но этот код ничего не возвращает в непосредственном окне.
Добавьте Application.Volatile
, чтобы обновить результат, если полученное значение изменилось.
@ VBasic2008 хорошая мысль... эта UDF мне нравится немного меньше.
К счастью, у вас нет выбора.
Не кажется ли вам, что использование диапазона было бы более уместным, т. е. Dim K12_Values As Range: Set K12_Values = ThisWorkbook.Worksheets("K12").Range("B4:B6980")
, руководствуясь логикой, согласно которой, если Application.Match
применяется к диапазону быстрее, чем к массиву, то и Application.Index
тоже? Просто кое что для раздумий.
Я полагаю, вы могли бы проверить скорость, используя Range
, но _Values
предлагал использовать массив, поэтому я продолжил этот подход.
Это диапазон.
Application.ActiveWorkbook.Sheets("K12").Range("B4:B6980")
Также не нужно «Приложение» выше
Поэтому вы должны установить его как
Set K12_Values = ActiveWorkbook.Sheets("K12").Range("B4:B6980")
Затем вызовите функцию. Пример:
Sub TestMacro()
Debug.Print GetK12(2)
End Sub
Этот код проверен.
Чтобы отладить это, вызовите его из
Sub
. Возможно, вам придется указать третий параметрIndex
. Примечание: рассмотрите возможность использованияAs Variant
вместоAs Integer
и указания типа дляX
, например.ByVal X As Long
.