Пожалуйста, обратитесь к совету, приведенному в комментариях, чтобы понять, почему ваш вопрос подвергается понижению. Тем не менее, я нахожу случай, который вы описываете, довольно интересным, поэтому я дал ему шанс. Вставьте следующий код в модуль рабочего листа в VBA.
Dim oldVal As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count = 1 Then oldVal = Target.Value2
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Set rng = Range("A1:A26")
If Target.Cells.Count = 1 And Not Intersect(Target, rng) Is Nothing Then
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim newVal As String
newVal = Target.Value2
Target.Value2 = oldVal
Dim newValRng As Range
Set newValRng = rng.Find(newVal, LookAt:=xlWhole, MatchCase:=True)
If Not newValRng Is Nothing Then
newValRng.Value2 = oldVal
Target.Value2 = newVal
Else
MsgBox ("Please enter a value that is already in range " & rng.Address)
End If
Application.ScreenUpdating = True
Application.EnableEvents = True
End If
End Sub
Чтобы немного объяснить, что происходит: каждый раз, когда пользователь выбирает одну ячейку в книге, значение этой ячейки сохраняется в oldVal
,Чтобы быть сверхбезопасным, вы также можете выполнить это на Workbook_Open
, чтобы охватить крайний случай, когда пользователь не меняет выбор перед изменением значения.
Затем, когда ячейка изменяется, новое значение сохраняется вnewVal
и изменение отменено. Затем идентифицируется ячейка с newVal
. Если такой ячейки не существует, выдается сообщение об ошибке и никаких изменений не происходит. Если ячейка найдена, ей присваивается значение oldVal
, и первоначальное изменение пользователя переделывается.