EXCEL VBA小白第三课:删除行,合并空白单元格

本文首发于我的知乎和公众号info_star,转载请注明出处。

今天要说的这段代码呢,同样是因为同事妹子有需求而写的。
做数据透视表的时候,经常有一个组里面出现几个分支都有数值的情况,老板要求把数据透视表贴成数值格式并且合并掉空白单元格。那么如果有很多列并且每一列都要这样做,是不是瞬间觉得不会再爱了→。→
为了生动形象,我特意做了个表格。就像下图这样,类似红框里这种情况都要去合并单元格。



有人说直接用数据透视表上面的标签填充就好了。图样!妹子说老板不接受这样的。任性!
诶,我时常在想如果我是个汉子,就能和妹子和和美美相亲相爱了,美滋滋(误!)

言归正传,借由这个Demo,就可以开始学一点新的语法啦。
这段代码的核心知识为如下几项操作的代码:
a. 合并单元格
b. (Ctrl+Shift+箭头键)将单元格的选定范围扩展到活动单元格所在列或行中的最后一个非空单元格,或者如果下一个单元格为空,则将选定范围扩展到下一个非空单元格。
c. 删除行
d.如何自动选择下一个需要合并单元格的范围(编程思路)

一 分析需求
首先,(假装)老板给了我这个数据,让我整理一下。


于是,我做了个数据透视表,这样的。


拷出来贴成数值格式(偷懒用了上面的图):



接下来,我们要,删除 Grand Total这一行,合并上面的空白单元格,做成如下的样子。



所以我们要写一段代码,做以下几步:
插入数据透视表(略)
拷贝粘贴数据透视表(略)
删除总计行(这一步可以在数据透视表里做,但是,我们这不是要演示删除行的代码嘛~)
合并空白单元格(本课重点)

二 设计代码
我们可以确定初始单元格的位置,这里假设I20单元格。
我们要定义两个变量i,j。i定位合并区域最下面一个单元格,j定位合并区域最上面一个单元格。
这就决定了,对i我们用For语句遍历每一行,如果不为空,则给j赋值 i=j,如果为空就合并从Ij到Ii的单元格。
语句如下:
For i = 20 To 31 

If Range("I" & i) <> "" Then 

j = i 

Else 

Application.DisplayAlerts = False 

Range("I" & j & ":I" & i).Merge 

Application.DisplayAlerts = True 

End If

这里我假设的是只有一列需要合并,如果有多于一列需要合并,可以增加一个变量k,并将单元格表示为Cells的形式,遍历你需要合并的列。

三 语句tips
’跳过合并单元格出现的警告
Application.DisplayAlerts = False 
’合并单元格
Range("I" & j & ":I" & i).Merge 
’删除选中行
Selection.Delete Shift:=xlUp