So I've an excel table as
If I change the value of 3 to 1, the value 1 should automatically change to 3. Thus the final table should be like
CodePudding user response:
You could try this code to be put in the worksheet code pane (myAddress set as A1:A4 implies column A row 1 to 4, which needs to be modified according to the user's worksheet)
Option Explicit
Dim myVal As Variant
Dim okChange As Boolean
Const myAddress As String = "A1:A4"
Private Sub Worksheet_Change(ByVal target As Range)
If Not okChange Then Exit Sub
Dim f As Range
Set f = Range(myAddress).Find(what:=target.Value, LookIn:=xlValues, lookat:=xlWhole, after:=target)
If Not f Is Nothing Then
Application.EnableEvents = False
f.Value = myVal
Application.EnableEvents = True
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal target As Range)
okChange = False
Select Case True
Case target.CountLarge > 1
Case Intersect(target, Range(myAddress)) Is Nothing
Case Else
myVal = target.Value
okChange = True
End Select
End Sub
CodePudding user response:
In this answer I'm assuming the Table is called Table1 and the column you wish the sub to affect is called Column1. Edit the code to your requirement as necessary.
Private Sub Worksheet_Change(ByVal Target As Range)
'Exit sub if edited value isn't in the desired range:
If Intersect(Target, ActiveSheet.Range("Table1[Column1]")) Is Nothing Then Exit Sub
Dim OldValue As Variant, changeCell as Range
'Find the Old value of the cell
With Application
.EnableEvents = False
.Undo
OldValue = Target.Value
.Undo
End With 'Application
'Find the value to be changed:
Set ChangeCell = ExceptRange(Range("Table1[Column1]"), Target).Find(What:=Target.Value, LookIn:=xlValues)
'Edit to the Old value
If Not ChangeCell Is Nothing Then ChangeCell.Value = OldValue
Application.EnableEvents = True
End Sub
Function ExceptRange(Rng As Range, Except As Range) As Range
'The opposite of Intersect
Dim a As Long, Confirmed() As Range
For a = 1 To Rng.Cells.Count
If Intersect(Rng.Cells(a), Except) Is Nothing Then
If ExceptRange Is Nothing Then
Set ExceptRange = Rng.Cells(a)
Else
Set ExceptRange = Union(ExceptRange, Rng.Cells(a))
End If
End If
Next
End Function


