VBA通过遍历数组并按特定条件构建新数组的实现需求
提取Excel中每个0的前一个数值
问题说明
现有Excel一列数据,其中分布着非连续的0,需要构建另一列数据,筛选出每个0的前一个数字。示例数据集如下(需提取1、4、6):
5 1 0 4 0 820 4 6 0 74现有初始VBA代码:
Sub Cat() Range("V12").Select Do Until IsEmpty(ActiveCell) ActiveCell.Offset(1, 0).Select Loop End Sub
解决方案
方法1:Excel公式法
如果数据在A列,想在B列得到结果:
在B1单元格输入公式后下拉填充:
=IF(A2=0,A1,"")逻辑:如果下一行是0,就显示当前行的数值,否则留空,后续筛选B列非空值即可得到所有目标数据。
若使用Excel 365/2021,可直接用动态数组公式一步提取所有结果:
=FILTER(A1:A9,A2:A10=0)注:A1:A9是原数据区域(排除最后一行,因为最后一行后面没有0),A2:A10是对应下一行的区域,公式会自动筛选出符合条件的数值并排列。
方法2:改进版VBA代码
针对你给出的初始代码,修改成能直接提取目标值的版本(假设原数据在V列从V12开始,结果输出到W列):
Sub ExtractPreZeroValue() Dim sourceCell As Range Dim resultCell As Range ' 设置源数据起始单元格 Set sourceCell = Range("V12") ' 设置结果输出的起始单元格 Set resultCell = Range("W12") Do Until IsEmpty(sourceCell) ' 检查当前单元格的下一行是否为0 If sourceCell.Offset(1, 0).Value = 0 Then ' 将当前值写入结果列 resultCell.Value = sourceCell.Value ' 结果单元格下移一行 Set resultCell = resultCell.Offset(1, 0) End If ' 源单元格下移一行继续遍历 Set sourceCell = sourceCell.Offset(1, 0) Loop End Sub
运行这个宏后,W列会自动列出所有0的前一个数值,无需手动筛选。
内容的提问来源于stack exchange,提问作者Kisheon
相关产品推荐
相关产品推荐

