Excel合并分组数据展开折叠宏时遇运行时错误1004求助
合并Excel分组行折叠/展开宏时遇Runtime Error 1004问题
我想做一个能切换分组数据行折叠/展开状态的宏,原本两个单独的宏运行正常:
Sub Expand1() Rows(2).EntireRow.ShowDetail = True End Sub Sub Collapse1() Rows(2).EntireRow.ShowDetail = False End Sub
我把它们合并成一个宏,打算绑定到按钮上,通过检查ShowDetail的状态来自动切换,写了这段代码:
Sub Colland() If Rows(2).EntireRow.ShowDetail = True Then Rows(2).EntireRow.ShowDetail = False Else: Rows(2).EntireRow.ShowDetail = True End If End Sub
但执行时Excel弹出错误:
runtime error 1004 :" the showDetail property cannot be changed.
我猜问题出在检查属性状态的时候没法修改它。
解决办法
1. 先确认操作的是分组汇总行
ShowDetail属性只对分组的汇总行生效,如果第2行不是带+/-折叠符号的汇总行,直接改这个属性肯定会报错。先确认目标行是不是分组的汇总行。
2. 优化代码:先存状态再切换,加错误处理
可以先把当前状态存到变量里,再切换,同时加错误捕获避免崩溃:
Sub Colland() Dim currentState As Boolean ' 临时忽略错误,获取当前状态 On Error Resume Next currentState = Rows(2).EntireRow.ShowDetail ' 恢复正常错误捕获 On Error GoTo 0 If Err.Number = 0 Then ' 直接取反状态实现切换 Rows(2).EntireRow.ShowDetail = Not currentState Else MsgBox "这行不是分组汇总行,没法切换折叠/展开" End If End Sub
3. 检查工作表是否被保护
如果当前工作表是保护状态,且没开“修改分组”的权限,也会改不了ShowDetail。可以先解锁,操作完再锁回去:
Sub Colland() Dim ws As Worksheet Set ws = ActiveSheet Dim wasProtected As Boolean ' 记录保护状态并解锁(有密码的话在Unprotect后加密码,比如Unprotect "1234") wasProtected = ws.ProtectContents If wasProtected Then ws.Unprotect ' 切换状态 On Error Resume Next ws.Rows(2).EntireRow.ShowDetail = Not ws.Rows(2).EntireRow.ShowDetail On Error GoTo 0 ' 恢复保护(有密码的话在Protect后加参数) If wasProtected Then ws.Protect End Sub
4. 用分组自带的Toggle方法更靠谱
不用依赖ShowDetail,直接调用分组的切换方法:
Sub Colland() ' 检查该行是否在分组里 If Rows(2).OutlineLevel > 1 Then ' 切换当前分组的显示状态 Rows(2).EntireRow.Outline.ToggleOutlineShow Else MsgBox "这行没在分组里哦" End If End Sub
内容的提问来源于stack exchange,提问作者CodingDonut
相关产品推荐
相关产品推荐

