`
阅: 3614 | 回: 1
发表于2015/7/23 10:51:50 楼主 
头像 等级:学者
积分: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


我只是一个打工仔..
发表于 2015/7/23 10:53:23   
头像 等级:传说级人物
积分:638
财富值:934
身份:普通用户
好帖,赞一个
我的个性签名

快速回复

目前不允许游客发表,请 登录 注册 后再发贴。