Excel 根据另一列中的值填充一列的公式
Excel formula to fill a column based on value in another column
我如何制作一个公式,以便在为 ID
的特定值更新 Completed
中的值时,它会自动填充到该特定值的 Completed
的所有单元格中ID
?而且,当我从 Completed
中的一个单元格中删除值时,它会自动从 Completed
中与 ID
.
中的该值对应的所有单元格中删除
例如。在下面的数据中,我希望三个空白单元格分别自动填充 4
、6
和 5
。
Role ID Completed
A 1 3
A 2 4
A 5 3
A 8 6
B 2
B 8
B 10 5
C 10
C 15 2
这是一种方法。
您的设置在 A、B 和 C 列
在 E 和 F 列中准备一个 LOOKUP table,如下所示。
ID Completed
1 3
2 4
5 3
8 6
10 5
15 2
然后在 C 列(单元格 C2)中,您可以使用如下所示的简单公式并根据需要向下复制。
=IFERROR(VLOOKUP(B2,$E:$F,2,0),"")
因此,只要您更新 E 和 F 列中的状态,它就会在公式列中更新。
一个作品sheet改变解决方案
它有什么作用?
- 当
Target Column
中的值更改为 新值 时,
Source Column
的同一行正在同一 Source Column
中查找。
对于每个找到的值,此(找到的)行中的值
Target Column
更改为上述新值。
用法
- 到运行以下成功,两个代码都要复制
适当地到一个工作簿:第一个到 sheet 模块,第二个到 standard 模块。
- 这里运行什么都没有,一切运行s 自动.
- 唯一可以更改的是短代码中的最后三个值。
两个代码
1. Sheet模块
以下代码将被复制到 sheet 模块中,例如Sheet1
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
updateColumn Me, Target, "B", "C", 2
End Sub
- 您可以使用数字
2
和 3
. 而不是 "B"
和 "C"
- 您可以根据需要更改这些值。
- 可以复制到多个sheet模块中,修改参数
对于
SourceColumn
、TargetColumn
和 FirstRow
。
Me
和 Target
保持不变。
2。标准模块
以下代码将被复制到标准模块中,例如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
中 Change event
的行为(CTRL + G) 在 VBE
(Alt+F11).
我如何制作一个公式,以便在为 ID
的特定值更新 Completed
中的值时,它会自动填充到该特定值的 Completed
的所有单元格中ID
?而且,当我从 Completed
中的一个单元格中删除值时,它会自动从 Completed
中与 ID
.
例如。在下面的数据中,我希望三个空白单元格分别自动填充 4
、6
和 5
。
Role ID Completed
A 1 3
A 2 4
A 5 3
A 8 6
B 2
B 8
B 10 5
C 10
C 15 2
这是一种方法。
您的设置在 A、B 和 C 列
在 E 和 F 列中准备一个 LOOKUP table,如下所示。
ID Completed 1 3 2 4 5 3 8 6 10 5 15 2
然后在 C 列(单元格 C2)中,您可以使用如下所示的简单公式并根据需要向下复制。
=IFERROR(VLOOKUP(B2,$E:$F,2,0),"")
因此,只要您更新 E 和 F 列中的状态,它就会在公式列中更新。
一个作品sheet改变解决方案
它有什么作用?
- 当
Target Column
中的值更改为 新值 时,Source Column
的同一行正在同一Source Column
中查找。 对于每个找到的值,此(找到的)行中的值Target Column
更改为上述新值。
用法
- 到运行以下成功,两个代码都要复制 适当地到一个工作簿:第一个到 sheet 模块,第二个到 standard 模块。
- 这里运行什么都没有,一切运行s 自动.
- 唯一可以更改的是短代码中的最后三个值。
两个代码
1. Sheet模块
以下代码将被复制到 sheet 模块中,例如Sheet1
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
updateColumn Me, Target, "B", "C", 2
End Sub
- 您可以使用数字
2
和3
. 而不是 - 您可以根据需要更改这些值。
- 可以复制到多个sheet模块中,修改参数
对于
SourceColumn
、TargetColumn
和FirstRow
。 Me
和Target
保持不变。
"B"
和 "C"
2。标准模块
以下代码将被复制到标准模块中,例如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
中 Change event
的行为(CTRL + G) 在 VBE
(Alt+F11).