Индексная функция, возвращающая #Value в UDF

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 работает с этой переменной в другом месте. Что я здесь делаю не так? [это фрагмент, который я тестировал. НЕ полная функция]

РЕШЕНО: Всем спасибо. Да, мне пришлось повозиться с типами переменных.

Чтобы отладить это, вызовите его из Sub. Возможно, вам придется указать третий параметр Index. Примечание: рассмотрите возможность использования As Variant вместо As Integer и указания типа для X, например. ByVal X As Long.

BigBen 18.07.2024 18:22

Рассмотрите возможность использования ThisWorkbook вместо ActiveWorkbok.

BigBen 18.07.2024 18:34

Является ли K12_Values ​​диапазоном, если да, то его необходимо установить.

Nathan_Sav 18.07.2024 18:34

В MS365 использование UDF практически устарело. В диспетчере имен используйте, например. GetK12 в качестве имени и формула =LAMBDA(r,INDEX('K12'!B4:B6980,r)) в качестве ссылки, получая ту же функциональность (при необходимости сохраняя книгу в формате .xlsx).

VBasic2008 18.07.2024 19:28
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
4
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы отладить это, вызовите его из 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

Я только что протестировал этот код. Но этот код ничего не возвращает в непосредственном окне.

lighthouselk 18.07.2024 18:49

Добавьте Application.Volatile, чтобы обновить результат, если полученное значение изменилось.

VBasic2008 18.07.2024 18:51

@ VBasic2008 хорошая мысль... эта UDF мне нравится немного меньше.

BigBen 18.07.2024 18:51

К счастью, у вас нет выбора.

VBasic2008 18.07.2024 18:52

Не кажется ли вам, что использование диапазона было бы более уместным, т. е. Dim K12_Values As Range: Set K12_Values = ThisWorkbook.Worksheets("K12").Range("B4:B6980"), руководствуясь логикой, согласно которой, если Application.Match применяется к диапазону быстрее, чем к массиву, то и Application.Index тоже? Просто кое что для раздумий.

VBasic2008 18.07.2024 19:11

Я полагаю, вы могли бы проверить скорость, используя Range, но _Values предлагал использовать массив, поэтому я продолжил этот подход.

BigBen 18.07.2024 19:12

Это диапазон.

Application.ActiveWorkbook.Sheets("K12").Range("B4:B6980")

Также не нужно «Приложение» выше

Поэтому вы должны установить его как

Set K12_Values = ActiveWorkbook.Sheets("K12").Range("B4:B6980")

Затем вызовите функцию. Пример:

Sub TestMacro()
Debug.Print GetK12(2)
End Sub

Этот код проверен.

Другие вопросы по теме