Ячейка Excel как пользовательский ввод и как формула - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь сделать ячейку E23 как пользовательский ввод и как ячейку формулы, если пользователь не вводит никакого значения.Например: если пользователь вводит значение в ячейку E23, учитывайте это значение.Если пользователь не вводит никакого значения, скопируйте значение из ячейки B23.Ниже приведен код VBA, который я попробовал.

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$E$23" And Target.Value = "" Then
     Target.Formula = "=B23"
End If

Код работает нормально, пока я не изменю значение в ячейке B23 с помощью выбора, сделанного в выпадающем списке.Когда я изменяю выделение в выпадающем списке с варианта 1 на вариант 2, новое значение обновляется в ячейке B23, которая должна быть скопирована в E23.Но это дает мне ошибку времени выполнения «13» Несоответствие типов.

Любая помощь приветствуется.Спасибо

1 Ответ

0 голосов
/ 25 апреля 2018

Проблема в том, что эта строка

Target.Formula = "=B23"

изменяет целевую ячейку, и это вызывает событие Worksheet_Change, которое изменяет целевую ячейку, и это вызывает событие Worksheet_Change… и т. Д.

Таким образом, вам нужно отключить события, прежде чем вы измените целевую ячейку (и снова включите их).

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$E$23" And Target.Value = vbNullString Then
        Application.EnableEvents = False
            Target.Formula = "=B23"
        Application.EnableEvents = True
    End If
End Sub

Альтернатива, которая работает также при выборе нескольких ячеек:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("E23")) Is Nothing Then
        Application.EnableEvents = False
        If Range("E23").Value = vbNullString Then
            Range("E23").Formula = "=B23"
        Else
            Range("E23").Value = Range("E23").Value - Range("E17").Value
        End If
        Application.EnableEvents = True
    End If
End Sub
...