实例需求:数据表中F列中存在数据缺失,如下图所示。现需要根据A列中的内容(类别,图中C1、C2、B1为不同类别),补充F列数据,已知每个类别中F列存在不少于一个非空单元格,并且其内容相同。
示例代码如下。
Sub Demo()
Dim rngF As Range, arrData, i As Long
Dim RowCnt As Long
arrData = [a1].CurrentRegion.Value
RowCnt = UBound(arrData)
For i = 2 To RowCnt
If arrData(i, 1) <> arrData(i - 1, 1) Then
If Len(arrData(i, 6)) = 0 Then
Cells(i, 6) = Cells(i, 6).End(xlDown)
End If
End If
Next
With Range("F2").Resize(RowCnt - 1, 1)
.NumberFormatLocal = "G/通用格式"
.SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C"
.Formula = .Value
End With
End Sub
【代码解析】
第4行代码将数据表加载到数组中。
第5行代码获取数据表的行数。
第6~12行代码从第二行开始循环遍历数据,确保每个类别的首行记录F列不为空,这样才能确保后续公式填充的结果是正确的。
如果当前行A列单元格不等于上一行A列单元格,则为一个新类别的首行数据记录,第8行代码判断其F列是否为空,如果为空,第9行代码使用当前行之下的第一个非空单元格填充当前行单元格。
第14行代码设置单元格区域数字格式为通用。
第15行代码使用SpecialCells(xlCellTypeBlanks)
筛选数据表中F列的空白单元格,并设置公式为等于其上的相邻单元格。
第16行代码将F列中的公式转换为静态数值。
使用数组+字典的方式也可以实现本需求,本文只是展示另外一个实现思路。