Вывод VBA запись в ячейку - # значение! Ошибка
Я пытаюсь сделать UDF из моей работы (в Excel 2003), и после отладки проблема, кажется, суммируется в этой сжатой версии моей функции:
Function btest(b_1 As Double) As Double
btest = 1
Worksheets("Sheet1").Range("A1").Value = b_1
'^this is the bit I want to work but doesn't^
End Function
Это имитирует мою реальную функцию, которая имеет значение, присвоенное ей без проблем перед следующей строкой вывода ячейки, которая не выполняется. Я считаю, что это связано с ошибкой #VALUE!
, которую я получаю в качестве возврата, хотя я использовал MsgBox
, который показал, что функция действительно имеет числовое значение.
Может ли кто-нибудь пролить свет на это, пожалуйста?
Также: в чем разница между
Worksheets("Sheet1").Cells(1, 1) = B
И
Sheets("Sheet1").Range("A1").Value = B
Где B-это какое-то числовое значение?
Спасибо
2 ответа:
Как вы уже поняли с
Похоже, проблема в том, что любой UDF не может редактировать листы, только возвращать один value...so если я хочу отредактировать другую ячейку как часть того же процесса, мне нужно использовать sub "
Astandard UDF не может изменить лист.
Но с точки зрения вашего последующего комментария
Правильно ли это, и если да, то как я буду действовать - sub в пределах функции или функция в пределах sub? Я хочу свою электронная таблица автоматически реагирует на входы, как это было бы с функцией - никаких кнопок или специальных действий не требуется.
Вы можете использовать событие
В качестве примера:
- Вы хотите отслеживать A1:A10 на определенном листе для ввода
- если эта область используется, вы хотите установить
Worksheets("Sheet1").Range("A1").Value
в это значениеВопрос 1
- щелкните правой кнопкой мыши вкладку листа, который вы хотите отслеживать
- Код Вида
- скопируйте и вставьте в код под 4 Нажмите altf11 для возврата в Excel
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim rng1 As Range Set rng1 = Intersect(Target, Range("a1:10")) If rng1 Is Nothing Then Exit Sub Application.EnableEvents = False Worksheets("Sheet1").Range("A1").Value = rng1.Value Application.EnableEvents = True End Sub
Вопрос 2
Они идентичны.
Вы правы (в своем комментарии), что UDF не может изменить лист, а только возвращает значение.
Это справедливо, если вы вызываете
Sub
илиFunction
из UDF и пытаетесь изменить лист. Он тоже потерпит неудачу.Примечание: есть (довольно уродливая) работа вокруг: смотрите этот ответ