获取指定区域首尾可见行并为可见范围添加边框
动态隐藏行后为指定区域可见行的首尾范围添加边框
工作表中Range(C31:C150)包含带编号的方向信息,例如C31:C55为N10、N11……,C56:C75为S40、S41等。辅助列BA根据D列是否为空标记1(D列非空)或0(D列空),随后隐藏所有BA列为0的行,这个动态操作会打乱原方向区域的边框。
示例场景:
- 第一个区域仅C31可见
- 第二个区域C56、57、60、63、64、65、72、73可见
需求:为C31和C56:C73(实际为C列至J列对应行)添加边框。
尝试的方法及问题
方法一:直接对可见单元格加边框
代码:
Sheets("sheet1").Range("C56:J75").SpecialCells(xlCellTypeVisible).BorderAround _ ColorIndex:=0, Weight:=xlMedium
问题:遇到隐藏行时会拆分成多个子区域(如C56:C57、C60、C63:C65、C72:C73),无法合并成首尾行对应的完整范围(如C56:C73)。
方法二:用Find找首尾行
代码:
Dim StartRow As Long, EndRow As Long With Sheets("sheet1") StartRow = .Range("BA56:BA75").Find(what:=1, after:=.Range("BA56")).Row EndRow = .Range("BA56:BA75").Find(what:=1, after:=.Range("BA56"), SearchDirection:=xlPrevious).Row End With
问题:返回的StartRow=61、EndRow=71均为隐藏行,仅处理单一行(如C31)时正常,不适用于分组区域。
方法三:网上找到的首尾可见单元格函数
代码:
Sub main() Dim firstCell As Range, lastCell As Range Set firstCell = first_non_blank_visible_cell(Range("$C$3:$C$5,$C$100:$C$64000")) Set lastCell = last_non_blank_visible_cell(Range("$C$3:$C$5,$C$100:$C$64000")) Debug.Print firstCell.Address Debug.Print lastCell.Address End Sub Function first_non_blank_visible_cell(rng As Range) On Error Resume Next Set rng = rng.SpecialCells(xlCellTypeVisible) Set rng = rng.SpecialCells(xlCellTypeConstants) With rng.Areas(1) Set first_non_blank_visible_cell = .Cells(1) End With End Function Function last_non_blank_visible_cell(rng As Range) On Error Resume Next Set rng = rng.SpecialCells(xlCellTypeVisible) Set rng = rng.SpecialCells(xlCellTypeConstants) With rng.Areas(rng.Areas.Count) Set last_non_blank_visible_cell = .Cells(.Cells.Count) End With End Function
问题:最初可用,修改测试范围后失效,改回原范围也无法正常运行。
解决方案
通过遍历指定区域内的可见单元格,记录最小(首行)和最大(末行)行号,再基于此构建完整范围添加边框。代码如下:
Sub AddBorderToVisibleRange() Dim targetSheet As Worksheet Dim originalRange As Range Dim visibleCell As Range Dim startRow As Long, endRow As Long ' 设置目标工作表和需要处理的原始区域(示例为第二个区域C56:C75) Set targetSheet = ThisWorkbook.Sheets("sheet1") Set originalRange = targetSheet.Range("C56:C75") ' 初始化首尾行号为极端值 startRow = 999999 endRow = 0 ' 遍历区域内的可见单元格,记录最小和最大行号 For Each visibleCell In originalRange.SpecialCells(xlCellTypeVisible) If visibleCell.Row < startRow Then startRow = visibleCell.Row End If If visibleCell.Row > endRow Then endRow = visibleCell.Row End If Next visibleCell ' 如果找到有效行号,为C-J列的对应范围添加边框 If startRow <= endRow Then With targetSheet.Range("C" & startRow & ":J" & endRow) .BorderAround ColorIndex:=0, Weight:=xlMedium ' 可选:添加内部边框 '.Borders(xlInsideHorizontal).Weight = xlThin '.Borders(xlInsideVertical).Weight = xlThin End With End If End Sub
说明:
- 需根据实际需求修改
originalRange的范围(如处理第一个区域时改为C31:C55) - 遍历过程会精准捕捉区域内所有可见行的首尾行号,不受隐藏行影响
- 可根据需要取消注释内部边框的代码,补充细节样式
内容的提问来源于stack exchange,提问作者Pl0x_H3lp
相关产品推荐
相关产品推荐

