Excel — Измените значение ячейки из другой ячейки, но измененная ячейка сохраняет значение, когда входная ячейка очищена

#excel #input #cell

#excel #ввод #ячейка

Вопрос:

Я в основном пытаюсь создать входную ячейку. Чего я хочу, так это того, что когда я изменяю значение C2, оно изменяет значение C1. Но когда я стираю C2, я хочу, чтобы C1 сохранил значение.

Итак, если я сделаю C2 = «Adam», C1 = «Adam», но затем я изменю C2 = «» и C1 по-прежнему будет «Adam».

Кто-нибудь может мне помочь с этим? Я целую вечность искал в Интернете и не могу найти ничего, что помогло бы мне найти решение.

Комментарии:

1. Что вы уже пробовали?

Ответ №1:

Вы можете сделать это на Worksheet_Change событии,

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row = 2 And Target.Column = 3 Then    'C2
        If Target.Value <> "" Then
            Range("C1").Value = Target.Value
        End If
    End If
End Sub
  

Формула =C2 или какой-либо вариант не будут работать, потому что они не могут запомнить значение, которое с тех пор было удалено.


Я полагаю, вы могли бы подделать формулу, подобную следующей, но я определенно не рекомендую это, особенно в сочетании с кодом. Я просто публикую это из интереса.

 Private Sub Worksheet_Change(ByVal Target As Range)
    Static old As String

    If Target.Row = 2 And Target.Column = 3 Then    'C2
        If Target.Value <> "" Then
            Range("C1").Formula = "=IF(N(""""),"""","""")amp;C2"
            old = Target.Value
        Else
            Range("C1").Formula = "=IF(N(""" amp; old amp; """),"""","""")amp; """ amp; old amp; """"
        End If

    End If
End Sub
  

Это бессмысленно, потому что вам все равно нужен код.


Я полагаю, что даже возможно, чтобы код просто записывал в именованный диапазон / значение, на которое затем ссылается формула:

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Value <> "" Then
        ActiveWorkbook.Names.Add Name:="stored", RefersToR1C1:="=""" amp; Target.Value amp; """"
    End If
End Sub
  

Ответ №2:

Мы можем сделать это с помощью макроса события. Поместите следующий код в область кода рабочего листа:

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim C1 As Range, C2 As Range
    Set C1 = Range("C1")
    Set C2 = Range("C2")

    If Intersect(Target, C2) Is Nothing Then Exit Sub
    If C2.Value = "" Then Exit Sub

    Application.EnableEvents = False
        C2.Copy C1
    Application.EnableEvents = True
End Sub
  

Поскольку это код рабочего листа, его очень легко установить и использовать автоматически:

  1. щелкните правой кнопкой мыши название вкладки в нижней части окна Excel
  2. выберите Просмотр кода — откроется окно VBE
  3. вставьте содержимое и закройте окно VBE

Если у вас есть какие-либо проблемы, сначала попробуйте это на пробном листе.

Если вы сохраните книгу, макрос будет сохранен вместе с ней. Если вы используете версию Excel более поздней, чем 2003, вы должны сохранить файл как .xlsm, а не .xlsx

Чтобы удалить макрос:

  1. откройте окна VBE, как указано выше
  2. очистите код
  3. закройте окно VBE

Чтобы узнать больше о макросах в целом, см.:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

и

http://msdn.microsoft.com/en-us/library/ee814735 (v=office.14).aspx

Чтобы узнать больше о макросах событий (код рабочего листа), см.:

http://www.mvps.org/dmcritchie/excel/event.htm

Для этого должны быть включены макросы!