重点内容
适用版本
桌面版通用(Excel 365 / 2021 / 2019 等)。
完整 VBA 代码
Dim counter As Integer, i As Integer
counter = 0
For i = 1 To 10
If Cells(i, 1).Value <> "" Then
Cells(counter + 1, 2).Value = Cells(i, 1).Value
counter = counter + 1
End If
Next i
Range("A1:A10").Value = ""
Range("A1:A10").Value = Range("B1:B10").Value
Range("B1:B10") = ""代码说明
- 声明
counter(记录已复制了几个非空值)、i(循环变量)两个Integer变量,counter初始化为 0 - 用
For i = 1 To 10循环遍历第一列(A 列)第 1 到第 10 行 - 用
Cells(i, 1).Value <> ""判断这个单元格是不是非空(<>表示"不等于"),是非空的才处理 - 把这个非空值写到第二列(B 列)的
counter + 1行——因为counter从 0 开始,第一个非空值会写到 B1,第二个写到 B2,以此类推,这样非空值在 B 列会紧密排列、不留空隙 - 每复制一个值,
counter加 1 - 循环结束后,先清空 A1:A10,再把 B1:B10(已经紧密排列好的非空值)整批复制回 A1:A10,最后清空辅助列 B1:B10
怎么运行
Alt+F11 打开 VBA 编辑器,把代码放进按钮点击事件,按 F5 或点命令按钮执行,A 列的空白单元格会被移除,数据自动往上靠齐。
运行前后 A 列的对比,原本夹杂空白格的数据,运行后空白格消失、数据紧密往上排列
学完你会
常见错误
- 循环范围写死是
1 To 10,如果实际数据超过 10 行,超出部分不会被处理;数据行数不固定时要记得同步改这个上限,或改成动态抓取最后一行 - B 列(辅助列)如果本来就有其他数据,会被这段代码覆盖又清空,执行前要确认 B 列是空的,或换一个没在用的列当辅助列
- 这段代码是"删除空白后数据上移",不是"隐藏空白行"——原本 A 列的行号跟数据的对应关系会改变,如果旁边其他列(B、C...)有跟 A 列同一行对应的数据,这个操作会让数据对不上,只适合单独处理一列的场景
Sources
Blog / Website: