Установка Range.Value вызывает #VALUE!в Excel VBA, а также повторная отправка функции вызывает повторную отправку всех других функций - PullRequest
0 голосов
/ 22 ноября 2018

Я прошу прощения за то, как это должно быть тривиально для разработчиков VBA, но я провел некоторое копание и не могу понять, почему следующий код, когда он присваивается ячейке и выполняется, приводит к #VALUE!

Function foo()
    Range("A1:B3").Value = 10
End Function

Лист Excel:

excel

Сначала я попытался

ActiveSheet.Range("A1").Value = "abc"

, но это тоже не сработало.Что очень просто я здесь делаю неправильно?

Кроме того, почему, когда я пытаюсь повторно выполнить функцию (используя F2 и затем Enter), Excel повторно отправляет другие функции, которые находятся в том же рабочем листе?Это действительно сводит с ума.Я нажал F2 и Enter, так почему бы Excel подумать, что я хочу отправить все остальные функции, и как это можно предотвратить?Спасибо большое.

1 Ответ

0 голосов
/ 23 ноября 2018

Редактировать: вы пытались использовать UDF для изменения некоторых полей и согласились с тем, что нужно использовать какую-то модификацию события вместо того, чтобы запускать код из кнопки в комментариях к @Mathieu Guindon.Поскольку UDF запускает код только тогда, когда некоторые ячейки пересчитываются, предполагается, что вы должны запускать код, когда некоторые ячейки на листе меняются либо вручную, либо по какой-либо формуле.Предлагаемые ниже решения запускают код при изменении значения ячейки F1.Вы можете изменить его в соответствии со своими потребностями.

Old Post: Это не чистый способ, но может быть назван грязной идеей обходного пути.Предположим, что вы хотите изменить значение ячейки F1 для выполнения кода, можете попробовать

Public F1Val As Variant
Private Sub Worksheet_Activate()
F1Val = Range("F1").Value
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If F1Val <> Range("F1").Value Then
Range("A1:B3").Value = 10
F1Val = Range("F1").Value
End If
End Sub

Осторожно : Конечно, это будет иметь неприятные последствия, если ячейка F1 связана с формулой с изменением ячеек.

Альтернативно, если достаточно только ручного изменения ячейки F1 для выполнения кода, тогда можно просто попробовать

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("F1")) Is Nothing Then
Range("A1:B3").Value = 10
End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...