
本文于2023年8月17日首发于本人同名其他平台,更多文章案例请搜索关注!
内容提要
根据不同条件,连接字符
VBA删除空单元格
大家好,我是冷水泡茶,今天在知乎上看到一个求助贴:

他的具体需求可以描述为:把非空单元格与表头字段合并起来。
看了他的需求,感觉有一点点奇怪,不过应该不难实现,我们一起来看一看吧:
实现过程
1、新建一个工作表,用来处理数据,格式与原表一致。
2、在新表对应单元格输入公式:
=IF(OR(原表!C2=0,原表!C2=""),"",IF(原表!C$1="总价",原表!C2&"(商品总价)",原表!C$1&"*"&原表!C2))
3、看他的目标表的结果,还要把所有非空单元格都挪到左边,这个用公式可能有点难度,就不费那个脑筋了,我们采用删除空单元格的方法:
(1)选中数据区域,选择性粘贴,数值。
(2)把数据区域每一列都分列。
(3)选中数据区域,按F5或Ctrl+G定位,定位条件,空值。
(4)右键点击第一个选中的空单元格,删除,左移。
VBA方法
感觉今天的内容有点少,我就想,是不是可以用VBA呢?这样是不是有点无聊?
其实,在我的回答中,上面的第(2)步“把数据区域每一列都分列“是没有的,也就是说,没有经过分列,直接定位空值,结果会怎么样呢?
结果是定位不到空值,那就没有能达成问主的目的。
原因是看上去是空单元格,实际上它不是空值,它的值=""。
经过分列以后,它就变成空了,就可以定位到了。
虽然勉强达成目标,但是分列的操作也很繁琐。
看来用VBA也是很有必要的,我们就来试试看吧:
Sub Transfer() Dim ws As Worksheet Dim lastRow As Integer Dim lastCol As Integer Dim arr() Set ws = ThisWorkbook.Sheets("原表") ws.Activate With ws .Activate lastRow = .UsedRange.Rows.Count lastCol = .UsedRange.Columns.Count arr = .Range(Cells(1, 1), Cells(lastRow, lastCol)).Value End With For i = 2 To lastRow For j = 3 To lastCol If arr(1, j) <> "总价" Then If arr(i, j) <> 0 Then arr(i, j) = arr(1, j) & "*" & arr(i, j) End If Else arr(i, j) = arr(i, j) & "(商品总价)" End If Next Next With ThisWorkbook.Sheets("目标") .Activate .Range("A1").Resize(lastRow, lastCol) = arr For i = 2 To lastRow For j = lastCol To 3 Step -1 If .Cells(i, j) = 0 Or .Cells(i, j) = "" Then .Cells(i, j).Delete Shift:=xlToLeft End If Next Next End WithEnd Sub
代码解析:
(1)假设数据源是“源表”,结果表是“目标”表。
(2)我们先把数据读入数组arr。
(3)我们从第3列开始,判断数组元素的值,如果不为0不为空,则把数组第1行对应列的元素与当前数组元素连接起来,这里还要区分标题是不是“总价”,连接方式有一点区别。
(4)接着,把“目标”表清除内容,写入数组的值。
(5)最后,把“目标”表数据区域空单元格删除,单元格左移。这里是从最右边向左循环删除,否则可能得不到正确的结果。应该跟删除工作表指定行类似,要从最大的行号开始倒着删除,否则必定报错。
总结
1、回答问题应该经过充分测试。
2、上面VBA代码删除空单元格的操作,也可以在数组中完成,然后再写入工作表。如果数据特别多,那就应该这样做。删除单元格可能速度会有点慢。
---End---
喜欢就点个赞、点在看、留个言呗!分享一下更给力!感谢!