工作表更改解决方案
它有什么作用?
- 当
Target Column 中的值更改为新值时,
在同一 Source Column 中查找同一行 Source Column。
对于每个找到的值,此(找到)行中的值
Target Column 更改为上述新值。
用法
- 要成功运行以下代码,必须复制两个代码
适当地到一个工作簿:第一个到 sheet 模块,第二个到 标准 模块。
- 这里没有什么可运行的,一切都自动运行。
- 唯一可以更改的是短代码中的最后三个值。
两个密码
1.工作表模块
以下代码将被复制到 sheet 模块中,例如Sheet1
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
updateColumn Me, Target, "B", "C", 2
End Sub
- 您可以使用数字
2 和3,而不是"B" 和"C"。
- 您可以根据需要更改这些值。
- 您可以将其复制到多个工作表模块并更改参数
对于
SourceColumn、TargetColumn 和FirstRow。
-
Me 和 Target 保持不变。
2。标准模块
以下代码将被复制到 standard 模块中,例如Module1
Option Explicit
Sub updateColumn(Sheet As Worksheet, _
TargetCell As Range, _
ByVal SourceColumn As Variant, _
ByVal TargetColumn As Variant, _
Optional ByVal FirstRow As Long = 4)
If TargetCell.Cells.CountLarge > 1 Then GoTo MoreThanOneCell
Dim rng As Range: Set rng = Sheet.Columns(TargetColumn)
If Intersect(TargetCell, rng) Is Nothing Then GoTo NotInTargetColumn
Set rng = rng.Find("*", , xlValues, , , xlPrevious)
If rng Is Nothing Then GoTo EmptyTargetColumn
If rng.Row < FirstRow Then GoTo FirstRowBelowLastRow
Dim LastRow As Long: LastRow = rng.Row
Set rng = Sheet.Columns(SourceColumn).Find("*", , xlValues, , , xlPrevious)
If Not rng Is Nothing Then
If rng.Row > LastRow Then LastRow = rng.Row
Else ' Empty Source Column. Don't care.
End If
If FirstRow = LastRow Then GoTo OnlyOneCell
Set rng = Sheet.Range(Sheet.Cells(FirstRow, TargetColumn), _
Sheet.Cells(LastRow, TargetColumn))
If Intersect(TargetCell, rng) Is Nothing Then GoTo NotInTargetRange
Dim ColOff As Long: ColOff = Sheet.Columns(SourceColumn).Column - rng.Column
Dim Target As Variant: Target = rng.Value
Dim Source As Variant: Source = rng.Offset(, ColOff).Value
Dim i As Long, tVal As Variant, sVal As Variant
tVal = TargetCell.Value
sVal = TargetCell.Offset(, ColOff).Value
Debug.Print TargetCell.Address, tVal, _
TargetCell.Offset(, ColOff).Address, sVal
On Error GoTo CleanExit
For i = 1 To UBound(Source)
If Source(i, 1) = sVal Then
Target(i, 1) = tVal
End If
Next i
'Application.EnableEvents = False
rng.Value = Target
CleanExit:
' Application.EnableEvents = True
LastExit:
Exit Sub
MoreThanOneCell:
'Debug.Print "More than one cell."
GoTo LastExit
NotInTargetColumn:
'Debug.Print "Not in Target Column."
GoTo LastExit
EmptyTargetColumn:
'Debug.Print "Empty Target Column."
GoTo LastExit
FirstRowBelowLastRow:
'Debug.Print "First row below last row."
GoTo LastExit
OnlyOneCell:
'Debug.Print "Only one cell."
GoTo LastExit
NotInTargetRange:
'Debug.Print "Not in Target Range."
GoTo LastExit
End Sub
您可以取消注释Debug.Print 行以监视Immediate window (CTRL + G) 中VBE (Alt+F11).