Excel VBA编译错误:自定义类型未定义,求解决按表值显隐分组行
问题解决:VBA编译错误及分组显隐功能实现
编译错误原因
出现“Compile Error. User defined type not defined”是因为ShowGroupIfFindValue过程中参数Show_Group的类型声明错误——VBA中没有Rows这个可作为参数的类型,单个行对象属于Range类型,必须改成Show_Group As Range。
另外还有两处潜在问题需要修正:
- 工作表引用:
Sheets(Sheet13)如果Sheet13是工作表的显示名称,要加双引号写成Sheets("Sheet13");如果是VBA编辑器中工作表的CodeName(属性窗口的(Name)字段),可以直接写Sheet13.Rows(24)。 - 空范围处理:如果Table18没有数据行,
DataBodyRange会是Nothing,直接用CountIf会报错,需要先判断范围是否存在。
修正后的完整代码
Sub ShowHideGrouping() ' 根据Assumptions工作表Table18的内容,控制Sheet13的分组行显隐 Dim tbl As ListObject Dim rng As Range, rng2 As Range ' 明确指定Table18所在工作表,避免依赖ActiveSheet的不确定性 Set tbl = ThisWorkbook.Worksheets("Assumptions").ListObjects("Table18") ' 判断表格是否有数据行,防止DataBodyRange为Nothing If Not tbl.DataBodyRange Is Nothing Then Set rng = tbl.ListColumns(2).DataBodyRange Set rng2 = tbl.ListColumns(4).DataBodyRange End If ' 调用子过程控制分组显隐 ShowGroupIfFindValue rng, 1, Sheet13.Rows(24) ' 若用工作表显示名称,改为Sheets("Sheet13").Rows(24) ShowGroupIfFindValue rng, 2, Sheet13.Rows(46) ShowGroupIfFindValue rng, 3, Sheet13.Rows(68) ShowGroupIfFindValue rng, 3, Sheet13.Rows(90) ShowGroupIfFindValue rng2, "Business Division", Sheet13.Rows(112) ShowGroupIfFindValue rng2, "Complexity", Sheet13.Rows(134) ShowGroupIfFindValue rng2, "Location", Sheet13.Rows(156) End Sub Private Sub ShowGroupIfFindValue(Look_In As Range, Look_for As Variant, Show_Group As Range) ' 查找值存在则显示分组,否则隐藏 If Look_In Is Nothing Then ' 查找范围为空时直接隐藏分组 Show_Group.ShowDetail = False Else Show_Group.ShowDetail = (WorksheetFunction.CountIf(Look_In, Look_for) > 0) End If End Sub
关键修改点说明
- 将
Show_Group As Rows改为Show_Group As Range,直接解决编译错误。 - 明确指定Table18所在工作表,避免
ActiveSheet切换导致的逻辑混乱。 - 添加空范围判断,防止表格无数据时触发运行时错误。
- 简化显隐逻辑判断,用
CountIf(...) > 0直接判断值是否存在,提升代码可读性。
内容的提问来源于stack exchange,提问作者Keith K
相关产品推荐
相关产品推荐

