Excel 根据另一列中的值填充一列的公式

Excel formula to fill a column based on value in another column

我如何制作一个公式,以便在为 ID 的特定值更新 Completed 中的值时,它会自动填充到该特定值的 Completed 的所有单元格中ID?而且,当我从 Completed 中的一个单元格中删除值时,它会自动从 Completed 中与 ID.

中的该值对应的所有单元格中删除

例如。在下面的数据中,我希望三个空白单元格分别自动填充 465

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
  • 您可以使用数字 23.
  • 而不是 "B""C"
  • 您可以根据需要更改这些值。
  • 可以复制到多个sheet模块中,修改参数 对于 SourceColumnTargetColumnFirstRow
  • MeTarget 保持不变。

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 windowChange event 的行为(CTRL + G) 在 VBE (Alt+F11).