【问题标题】:Excel formula to fill a column based on value in another columnExcel公式根据另一列中的值填充一列
【发布时间】:2020-06-24 03:48:43
【问题描述】:

我如何制定一个公式,以便在为特定的 ID 值更新 Completed 中的值时,它会自动填充到特定 IDCompleted 的所有单元格中?而且,当我从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 

【问题讨论】:

  • 在这种情况下,您将需要一个基于 VBA 的 Worksheet_Change 事件代码。除非您将完整列作为公式列并且完成是基于 LOOKUP 的列,否则公式解决方案将是不可能的。
  • 无论如何都乐意去做。但是,由于我是 Excel 业余爱好者,你能指导我如何做到这一点吗? :)
  • @shrivallabha.redij 顺便说一句,我之前使用公式 - stackoverflow.com/questions/62397515/… 尝试过类似的事情,但从那时起要求略有变化......

标签: excel excel-formula conditional-formatting


【解决方案1】:

工作表更改解决方案

它有什么作用?

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

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).

【讨论】:

  • 像魅力一样工作!非常感谢:)
  • 我遇到了这种方法的错误。当我在“角色”上使用过滤器来选择角色的子集时,该过程无法更新值。你知道为什么会这样吗?
【解决方案2】:

这是一种方法。

  • 您的设置位于 A、B 和 C 列中

  • 在 E & F 列中准备一个 LOOKUP 表,如下所示。

      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 列中更新状态,它就会在公式列中得到更新。

【讨论】:

  • 对不起,这种方法对我不起作用!我不知道此处“已完成”的值。我只是想自动化这个工作表,这样当其他人输入这些值时,他们的工作就会减少。
  • @harry04 请参阅 VBasic 的回复。建议这是否适合您。如果没有,那么我将研究基于 VBA 的选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2020-02-17
  • 2021-01-24
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
相关资源
最近更新 更多