Запись в лист Excel из настраиваемой функции VBA (не под)

Я был бы очень признателен за вашу помощь в написании данных из пользовательской функции VBA в лист Excel. Мне удалось написать из пользовательской подпрограммы VBA, но при выполнении функции VBA я получаю сообщение об ошибке. В примере кода "Sub write 2" и "Sub write 3" работают нормально. Но «Функциональный тест 2 ()» генерирует «Значение!» в его ячейке и write3 не выполняется.

Sub write2(r As Integer, c As Integer, d As Double)
    Dim a, b As Integer
    For a = r To r + 1
        For b = c To c + 1
            Cells(a, b).Value = d
        Next b
    Next a
End Sub

Sub write3()
    Call write2(3, 60, 0.437)
End Sub

Function test2() As Double
    Call write3
    test2 = 1#
End Function

person user3133655    schedule 25.12.2013    source источник
comment
возможный дубликат Не удается записать VBA данные в ячейки в Excel 2007/2010 в рамках функции   -  person brettdj    schedule 25.12.2013
comment
На самом деле это возможно - хотя и сложно - см. Ссылку выше, которая соответствует тому же запросу, который у вас есть.   -  person brettdj    schedule 25.12.2013
comment
Привет @brettdj: Спасибо! Похоже, у меня был такой же вопрос. К сожалению, кажется, что обходной путь вносит в код много сложностей. Итак, я конвертирую функцию в подпрограмму.   -  person user3133655    schedule 25.12.2013
comment
да, вариант намного лучше :)   -  person brettdj    schedule 25.12.2013
comment
@ user3133655: Подпрограмма - действительно лучший способ. Лично я бы написал здесь одну подпрограмму и одну функцию. Sub просматривает мои данные, передает их в мою функцию, а функция возвращает значение в Sub, который выводит его туда, куда я хочу. Это, конечно, предполагает, что вам абсолютно необходимо использовать функцию. В противном случае его перережет одна большая подводная лодка (или несколько небольших подключаемых модулей, вызывающих друг друга). ;)   -  person NullDev    schedule 25.12.2013


Ответы (1)


Согласно отличному веб-сайту Чипа Пирсона:

UDF может возвращать значение только той ячейке (ям), откуда он был вызван - он не должен изменять содержимое или форматирование какой-либо ячейки и не должен изменять операционную среду Excel. Если вы попытаетесь что-либо изменить, функция немедленно завершится и вернет ошибку #VALUE в вызывающую ячейку.

person Lance Roberts    schedule 25.12.2013
comment
Привет @Lance: Спасибо. В этом случае не могли бы вы помочь мне понять, как передавать данные из UDF в несколько ячеек листа Excel? - person user3133655; 25.12.2013
comment
@ user3133655, вам действительно нужно объяснить, зачем вам это нужно, контекст важен для решения. Вероятно, вам следует создать другой вопрос, основанный на том, чего вы хотите достичь (но будьте конкретны). - person Lance Roberts; 25.12.2013
comment
Затем используйте обычные элементы управления и обычные подпрограммы и функции, без необходимости в UDF. Просто привяжите все к кнопке (или немного больше работы к событию). - person Lance Roberts; 25.12.2013
comment
Привет @LanceRoberts: Я пытаюсь выполнить следующее: (1) Чтение данных из определенных строк в функцию Excel (2) Управление данными в функции (3) Вывод данных на лист Excel. Ограничения: (i) Функция выполняется для каждой строки (ii) Входные данные взяты из этой строки и всех предыдущих строк. Некоторые альтернативные решения, о которых я подумал, заключались в выводе данных в текстовый файл ИЛИ написании подпрограммы (вместо UDF), но я не думал, что эти два были такими же элегантными. Это помогает? - person user3133655; 25.12.2013
comment
На самом деле, в этом случае UDF не выглядит элегантным. Используйте обычную подпрограмму, вызываемую некоторым элементом управления Active-X. - person Lance Roberts; 25.12.2013