Вывод 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 3

2 ответа:

Как вы уже поняли с

Похоже, проблема в том, что любой UDF не может редактировать листы, только возвращать один value...so если я хочу отредактировать другую ячейку как часть того же процесса, мне нужно использовать sub "

Astandard UDF не может изменить лист.

Но с точки зрения вашего последующего комментария

Правильно ли это, и если да, то как я буду действовать - sub в пределах функции или функция в пределах sub? Я хочу свою электронная таблица автоматически реагирует на входы, как это было бы с функцией - никаких кнопок или специальных действий не требуется.

Вы можете использовать событие

В качестве примера:

  • Вы хотите отслеживать A1:A10 на определенном листе для ввода
  • если эта область используется, вы хотите установить Worksheets("Sheet1").Range("A1").Value в это значение

Вопрос 1

  1. щелкните правой кнопкой мыши вкладку листа, который вы хотите отслеживать
  2. Код Вида
  3. скопируйте и вставьте в код под 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 и пытаетесь изменить лист. Он тоже потерпит неудачу.

Примечание: есть (довольно уродливая) работа вокруг: смотрите этот ответ