根据条件在多列中填充和删除单元格

我有以下的列和值:

Begin Time Other values First Name Last Name other info 5041* value1 info1 5041* value2 firstname1 lastname1 info2 13089 value3 info3 16130 value4 info4 19739 value5 info5 26300 value6 info6 26391* value7 firstname2 lastname2 info7 27878 value8 info8 27878 value9 info9 28234 value10 info10 28738 value11 info11 29854 value12 info12 63110 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 86712* 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 19739 value5 firstname1 lastname1 info5 26300 value6 firstname1 lastname1 info6 26391 value7 firstname2 lastname2 info7 27878 value8 firstname2 lastname2 info8 27878 value9 firstname2 lastname2 info9 28234 value10 firstname2 lastname2 info10 28738 value11 firstname2 lastname2 info11 29854 value12 firstname2 lastname2 info12 63110 value13 firstname2 lastname2 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 86712 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的回答,我正在使用下面的代码

 Sub FillColBlanksSpecial() Dim wks As Worksheet Dim rng As Range Dim rng2 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 .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=r[-1]c" End If End With 'un comment the next line if you want the formulas to revert to values only .Cells = .Cells.Value End With End With End If Next wks End Sub 

目标是填写C&D列中的值,直到带有-A-B的工作表中的下一个值以工作表名称作为后缀。

正如您在示例数据中看到的那样,我希望这个填充考虑到第一列中的代码。 例如:在A2A3中 ,代码是5041 ,所以我想用C3D3中的值(即firstname1lastname1填充 第2行 ,然后填写相同的值,直到下一次出现值列C&D (即firstname2lastname2 )或有时在下一个出现之前的一行,因为这一行在A列中共享相同的代码,而在A之后。 而后一个例子是填充名字3lastname3,直到firstname4lastname4出现之前的一行,因为该行在列A中共享相同的代码,下面的firstname4lastname4将由firstname4lastname4 填充轮到了。

如何修改这个VBA代码来适应这种情况?

这是带有更长示例数据的excel工作表。 工作簿包含两张表: 我有 什么和我期望的

除第一栏中的代码外,星号标记仅用于视觉可达性的目的; 否则它们不会出现在原始数据表中。

你将不得不填写一个稍微复杂一点的公式。 此外,由于此公式在build立默认值之前会同时向上和向下,所以在继续下一个空白单元格之前,公式必须parsing为它们的返回值,以便可以在未来的查找中使用该值,而不会导致循环引用。

 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中的新公式(从C2看)

 =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)) 
  • 该公式首先查看是否在A列上方有一个非空白名字的值 ,如果有,则接受它并继续前进。
  • 如果上面的值没有find,那么它会查找下面的名字 ,其中名字不是空白。 如果find,它接受它并继续前进。
  • 如果两者都没有find,它将接受它上面的值作为默认值。

如果你遵循这个逻辑,你可以看到,公式必须立即恢复到值,或者后续的公式可以find它作为一个公式,并创build一个循环引用。 这是慢一点,因为它循环通过xlCellTypeBlanks而不是按块中的公式和值,但它是彻底的。