基于命名区域值的VBA工作表行隐藏功能故障排查求助
问题根源
你的核心问题是**varMonth是Range对象而非工作表对象**:
For Each varMonth In Range("ranMonths")遍历的是LISTS表中ranMonths区域的单元格,varMonth本质是单个单元格的Range对象,不是对应名称的工作表。- 当你执行
varMonth.Range("B" & lngRowNumber)时,VBA会把这个Range理解为相对于当前varMonth单元格的偏移范围,而非目标工作表的B列单元格,所以读取的始终是LISTS表的内容。
修正方案
把单元格中的工作表名称转换成真正的工作表对象,再进行操作:
Sub subHideSundays() Dim monthCell As Range Dim targetSheet As Worksheet Dim lngRowNumber As Long ' 遍历ranMonths区域的每个单元格 For Each monthCell In Range("ranMonths") 'LISTS!C11:C23 ' 跳过空单元格 If monthCell.Value = "" Then GoTo NextMonth ' 根据单元格值获取目标工作表 On Error Resume Next Set targetSheet = ThisWorkbook.Worksheets(monthCell.Value) On Error GoTo 0 ' 检查工作表是否存在 If targetSheet Is Nothing Then Debug.Print "工作表 '" & monthCell.Value & "' 不存在" GoTo NextMonth End If Debug.Print "正在处理工作表: " & targetSheet.Name ' 遍历目标行 For lngRowNumber = 7 To 534 Step 17 ' 直接通过目标工作表对象访问单元格 If targetSheet.Range("B" & lngRowNumber).Text Like "Sun*" Then targetSheet.Rows(lngRowNumber - 1).Resize(17).Hidden = True Else targetSheet.Rows(lngRowNumber - 1).Resize(17).Hidden = False End If Next lngRowNumber NextMonth: ' 释放对象引用 Set targetSheet = Nothing Next monthCell End Sub
关键改动说明
- 把
varMonth重命名为monthCell,明确它是单元格对象,避免混淆 - 通过
ThisWorkbook.Worksheets(monthCell.Value)获取对应名称的工作表对象targetSheet - 添加错误处理,防止命名区域中存在无效工作表名称导致崩溃
- 所有单元格和行的操作都基于
targetSheet对象,确保访问的是目标工作表的内容
内容的提问来源于stack exchange,提问作者Wayne C.
相关产品推荐
相关产品推荐

