根据另一列中的值填充多列中的单元格

Posted

技术标签:

【中文标题】根据另一列中的值填充多列中的单元格【英文标题】:Fill up and down cells in multiple columns based on values in another column 【发布时间】:2015-05-03 00:52:06 【问题描述】:

我有以下列和值:

Begin Time  Other values    First Name  Last Name   other info
5041*       value1                                  info1
5041*       value2          firstname1  lastname1   info2
13089       value3                                  info3
16130       value4                                  info4
26391*      value5                                  info5
26391*      value6                                  info6
26391*      value7          firstname2  lastname2   info7
27878       value8                                  info8
27878       value9                                  info9
28234       value10                                 info10
63189*      value11                                 info11
63189*      value12                                 info12
63189*      value13                                 info13
63189*      value14         firstname3  lastname3   info14
64335       value15                                 info15
65423       value16                                 info16
72089*      value17                                 info17
72089*      value18         firstname4  lastname4   info18
73495       value19                                 info19
73495       value20                                 info20
74330       value21                                 info21
74877       value22                                 info22
76710       value23                                 info23
82599*      value24                                 info24
82599*      value25          firstname5 lastname5   info25
98712*      value26                                 info26
98712*      value27          firstname6 lastname6   info27
98725       value28                                 info28
100605      value29                                 info29
100605      value30                                 info30
100954      value31                                 info31

我希望这样:

Begin Time  Other values    First Name  Last Name   other info
5041        value1          firstname1  lastname1   info1
5041        value2          firstname1  lastname1   info2
13089       value3          firstname1  lastname1   info3
16130       value4          firstname1  lastname1   info4
26391       value5          firstname2  lastname2   info5
26391       value6          firstname2  lastname2   info6
26391       value7          firstname2  lastname2   info7
27878       value8          firstname2  lastname2   info8
27878       value9          firstname2  lastname2   info9
28234       value10         firstname2  lastname2   info10
63189       value11         firstname3  lastname3   info11
63189       value12         firstname3  lastname3   info12
63189       value13         firstname3  lastname3   info13
63189       value14         firstname3  lastname3   info14
64335       value15         firstname3  lastname3   info15
65423       value16         firstname3  lastname3   info16
72089       value17         firstname4  lastname4   info17
72089       value18         firstname4  lastname4   info18
73495       value19         firstname4  lastname4   info19
73495       value20         firstname4  lastname4   info20
74330       value21         firstname4  lastname4   info21
74877       value22         firstname4  lastname4   info22
76710       value23         firstname4  lastname4   info23
82599       value24         firstname5  lastname5   info24
82599       value25         firstname5  lastname5   info25
98712       value26         firstname6  lastname6   info26
98712       value27         firstname6  lastname6   info27
98725       value28         firstname6  lastname6   info28
100605      value29         firstname6  lastname6   info29
100605      value30         firstname6  lastname6   info30
100954      value31         firstname6  lastname6   info31

感谢@Jeeped's answer,我正在使用以下代码

Sub FillColBlanksSpecial2()

    Dim wks As Worksheet
    Dim rng As Range
    Dim rng2 As Range
    Dim blnk As Range
    Dim LastRow As Long
    Dim col As Long
    Dim lRows As Long
    Dim lLimit As Long

    Dim lCount As Long
    On Error Resume Next

    lRows = 2
    lLimit = 1000

    Set wks = ActiveSheet
    For Each wks In Worksheets
        If Right(wks.Name, 2) = "-A" Or Right(wks.Name, 2) = "-B" Then
            With wks
                With .Cells(1, 1).CurrentRegion
                    With .Columns("C:D")
                        If CBool(Application.CountBlank(.Cells)) Then
                            For Each blnk In .SpecialCells(xlCellTypeBlanks)
                                blnk.FormulaR1C1 = "=if(countifs(r1c1:r[-1]c1, rc1, r1c:r[-1]c, ""<>""), index(r1c:r[-1]c, match(rc1, r1c1:r[-1]c1, 0)), if(countifs(r[1]c1:r9999c1, rc1, r[1]c:r9999c, ""<>""), index(r[1]c:r9999c, match(rc1, r[1]c1:r9999c1, 0)), r[-1]c))"
                                blnk.Value = blnk.Value
                            Next blnk
                        End If
                    End With
                End With
            End With
        End If
    Next wks
End Sub

使用 xlR1C1 样式的公式及其 xlA1 等效项:

=IF(COUNTIFS(R1C1:R[-1]C1, RC1, R1C:R[-1]C, "<>"), INDEX(R1C:R[-1]C, MATCH(RC1, R1C1:R[-1]C1, 0)), IF(COUNTIFS(R[1]C1:R9999C1, RC1, R[1]C:R9999C, "<>"), INDEX(R[1]C:R9999C, MATCH(RC1, R[1]C1:R9999C1, 0)), R[-1]C))
=IF(COUNTIFS($A$1:$A1, $A2, C$1:C1, "<>"), INDEX(C$1:C1, MATCH($A2, $A$1:$A1, 0)), IF(COUNTIFS($A3:$A$9999, $A2, C3:C$9999, "<>"), INDEX(C3:C$9999, MATCH($A2, $A3:$A$9999, 0)), C1))

目标是根据条件向上和向下填充C:D 与现有值: 1。取 C:D 中的值并填写,直到同一列中的下一个非空单元格。(这些非空单元格包含唯一值,firstname1、firstname2 等) 2。如果上面的空行与 A 列 中的值相同,则取 C:D 中的值并填充 up低于并且我们正在处理其值。

@Jeeped 的回答工作正常:它从列 C:D 中获取值并填充空行,直到包含新值的下一行;如果该空行在列 A 中与下面包含要复制的值的行共享相同的值,它也会填充一个空行。

但它只填满一行。我的示例数据(下面的链接)显示可能有多于一个空行 在列 C:D 中包含需要填充的值的行上方。

如何修改此 vba 代码以适应这种情况?

Here is the excel worksheet with a longer example data. The workbook contains two sheets: what I have & what I expect.

P.S. 除了第一列中的代码之外,星号标记仅用于视觉可访问性,以识别在列 A 中具有相同值的空行下面的行在列 C:D 中有值;否则它们不会出现在原始数据表中。

空行是指那些在C:D列中没有值的行。

【问题讨论】:

【参考方案1】:

我将公式稍微复杂了一点,以实现对多个列的垂直查找。需要修改的单行位于所有嵌套代码的中心。

blnk.FormulaR1C1 = "=if(countifs(r1c1:r[-1]c1, rc1, r1c:r[-1]c, ""<>""), index(r1c:r[-1]c, match(rc1, r1c1:r[-1]c1, 0)), if(countifs(r[1]c1:r9999c1, rc1, r[1]c:r9999c, ""<>""), index(r[1]c:r9999c, min(index(row(r:r9998)-row(r[-1])+((r[1]c1:r9999c1<>rc1)+not(len(r[1]c:r9999c)))*1e+99, , ))), r[-1]c))"

这转化为一个 xlA1 样式的公式,如下所示(从 C2 看)。

=IF(COUNTIFS($A$1:$A1, $A2, C$1:C1, "<>"), INDEX(C$1:C1, MATCH($A2, $A$1:$A1, 0)), IF(COUNTIFS($A3:$A$9999, $A2, C3:C$9999, "<>"), INDEX(C3:C$9999, MIN(INDEX(ROW(2:$9998)-ROW(1:1)+(($A3:$A$9999<>$A2)+NOT(LEN(C3:C$9999)))*1E+99, , ))), C1))

请注意,编码公式需要将带引号的字符串中的引号加倍。

【讨论】:

你是hero of SO excel-vba tag!。谢谢 谢谢你;我不知道那个统计数据。我正在快速接近 SO 的一个里程碑,很高兴你参与其中。

以上是关于根据另一列中的值填充多列中的单元格的主要内容,如果未能解决你的问题,请参考以下文章

根据另一列中的行自动填充第二列中的数据

Google表格中的查询功能-根据另一列获取一列中的非空最后一个单元格

MySQL - 如何根据另一列中的唯一值转置一列中的单元格?

WPF DataGrid中一列中的动态单元格控件

如果列中的单元格部分包含另一列中的文本

如何根据另一列中的单元格值有条件地填充熊猫列