阅: 3965 | 回: 1
等级:学者
- 积分:99
- 财富值:249.8
- 身份:普通用户
这个系列中,将介绍本人在Excel工作中碰到的问题、解决的思路和心得。希望能给大家一些启示。
在制作表格时,我们会经常做到一些带有合并项的表格,通常它的某些字段每次都需要合并,每次手动合并显得十分麻烦。
这个时候,用VBA是再适合不过了。
先上效果图:
解决思路:
1.我们需要先选中一个区域(只允许一列)
2.接着输入我们要合并的其他列的列号,VBA代码类似:Application.InputBox(prompt:="输入要合并的列名(用逗号隔开,如 E,F,G):", Type:=2,Default:="I,J,K,M,N,O")
其中Default:="I,J,K,M,N,O" 是默认的值,根据个人情况可以改为自己常用的情形。
3.循环输入的列号,依次合并。
需要注意几个细节问题:
1.用户有可能会选择整列,这时候如果使用for 循环,Excel将会卡死。所以我们必须检查选中区域的大小。(以下的VBA代码还缺少这个判断)
2.如何判断合并单元格,如何判断合并单元格的第一个? 可以使用If r.MergeArea.Cells.Offset.Address = r.Address Then 来判断合并单元格的第一个
3.合并单元格,系统会弹出提示。 我们必须手动关闭提示,使用Application.DisplayAlerts = False 。但要记得运行完要恢复。
VBA代码如下:
Sub 应用选区的合并格式到其他列() On Error GoTo l_err Dim r As Range Dim i, n As Integer, beginRow As Integer Dim cols As String Dim arr() As String, colTgt As String If Selection.Columns.Count > 1 Then MsgBox "选区不允许包含多个列!" Exit Sub End If cols = Application.InputBox(prompt:="输入要合并的列名(用逗号隔开,如 E,F,G):", Type:=2,Default:="I,J,K,M,N,O") arr = Split(cols, ",") Application.DisplayAlerts = False For Each r In Selection If r.MergeCells Then If r.MergeArea.Columns.Count = 1 Then '合并方向:单列 If r.MergeArea.Cells.Offset.Address = r.Address Then n = r.MergeArea.Count beginRow = r.MergeArea.Cells.Offset.Row For i = 0 To UBound(arr) colTgt = arr(i) Range(colTgt & beginRow & ":" & colTgt & CStr(beginRow + n - 1)).Merge Next i End If End If End If Next Application.DisplayAlerts = True Exit Subl_err: Application.DisplayAlerts = True MsgBox "发生错误:" & Err.DescriptionEnd Sub
我只是一个打工仔..