Excel含合并单元格场景下可靠获取最后一列的VBA实现方案
原代码问题原因
- 仅校验第1行对应列的单元格是否合并,当有内容的合并单元格不在第1行时逻辑完全不生效
- 合并区域列号计算逻辑错误,直接取MergeArea.Columns.Count忽略了合并区域的起始列位置,会返回错误的列号结果
修正后的完整代码
Public Sub Test_LCol() Debug.Print Get_lCol(ActiveSheet) ' 如需返回字母格式列标(如D而非4),可使用下方代码转换 ' Debug.Print Split(Cells(1, Get_lCol(ActiveSheet)).Address, "$")(1) End Sub Public Function Get_lCol(WS As Worksheet) As Long Dim lastCell As Range ' 定位工作表内最后一个存在内容的单元格 Set lastCell = WS.Cells.Find(What:="*", After:=WS.Range("A1"), _ SearchOrder:=xlByColumns, SearchDirection:=xlPrevious) ' 处理空工作表场景 If lastCell Is Nothing Then Get_lCol = 1 Exit Function End If ' 判断单元格是否属于合并区域,是则取合并区域最右列号,否则取单元格自身列号 If lastCell.MergeCells Then Get_lCol = lastCell.MergeArea.Column + lastCell.MergeArea.Columns.Count - 1 Else Get_lCol = lastCell.Column End If End Function
修改点说明
- 移除了原函数仅检查第1行合并单元格的错误逻辑,改为直接判断Find定位到的最后一个有内容的单元格本身是否属于合并区域,兼容合并单元格在任意行的场景
- 修正了合并区域列号计算逻辑,避免忽略合并区域起始列导致的结果偏差
- 移除了对
IsWorksheetEmpty自定义函数的依赖,直接判断Find返回的单元格对象是否为空即可处理空工作表场景 - 返回值改为Long类型,兼容高版本Excel最大16384列的规格
内容的提问来源于stack exchange,提问作者FreeSoftwareServers
相关产品推荐
相关产品推荐

