说明: F5和G5 是下拉选择表格. F5可以下拉选择1,2,3. G5可以下拉选择有或无。 如上表格所示:F5和G5 排列组合成这几种显示形式。选择数据验证--序列--1,2,3,4,5 (记住分隔符为英文符号).下面介绍宏代码:(不用宏也能实现,但是可能后面要手动反复刷新)' ========== 1. 手动修改单元格时触发(手动输入/下拉选择) ==========
Private Sub Worksheet_Change(ByVal Target As Range)
Call 双控核心逻辑
End Sub
' ========== 2. 公式计算时触发(解决不刷新、缓存bug) ==========
Private Sub Worksheet_Calculate()
Call 双控核心逻辑
End Sub
' ========== 3. 选中单元格兜底(解决下拉选择不触发) ==========
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Me.Range("F5:G5")) Is Nothing Then
Call 双控核心逻辑
End If
End Sub
' ========== 4. 核心控制逻辑(完全匹配你的需求逻辑) ==========
Private Sub 双控核心逻辑()
Application.ScreenUpdating = False ' 关闭屏幕刷新,防止闪烁
' 1. 定义控制单元格
Dim 数字单元格 As Range: Set 数字单元格 = Me.Range("F5")
Dim 开关单元格 As Range: Set 开关单元格 = Me.Range("G5")
' 2. 定义3组【表格+色块】的独立行范围(精准对应你的布局)
Dim 表格行数组 As Variant: 表格行数组 = Array("1:4", "9:12", "17:20")
Dim 色块行数组 As Variant: 色块行数组 = Array("5:8", "13:16", "21:24")
Dim 总份数 As Integer: 总份数 = 3
' 3. 读取控制参数,完整容错处理
Dim 显示数量 As Integer, 总开关状态 As String
On Error Resume Next
显示数量 = Int(数字单元格.Value)
总开关状态 = 开关单元格.Value
' 限制数字范围,防止超范围/负数
If 显示数量 < 0 Then 显示数量 = 0
If 显示数量 > 总份数 Then 显示数量 = 总份数
On Error GoTo 0
' 4. 先统一恢复所有行(避免状态混乱)
Dim i As Integer
For i = 0 To 总份数 - 1
Me.Range(表格行数组(i)).EntireRow.Hidden = False
Me.Range(色块行数组(i)).EntireRow.Hidden = False
Next i
' 5. 分两种状态执行逻辑
Select Case 总开关状态
' ========== 状态1:G5="有" → 按F5显示对应表格+色块 ==========
Case "有"
For i = 1 To 总份数
' 逻辑:序号≤显示数量 → 显示;否则隐藏(表格+色块同步)
Dim 显示状态 As Boolean: 显示状态 = (i <= 显示数量)
Me.Range(表格行数组(i - 1)).EntireRow.Hidden = Not 显示状态
Me.Range(色块行数组(i - 1)).EntireRow.Hidden = Not 显示状态
Next i
' ========== 状态2:G5="无" → 仅按F5显示对应色块,表格全隐藏 ==========
Case "无"
' 第一步:所有表格全部隐藏
For i = 0 To 总份数 - 1
Me.Range(表格行数组(i)).EntireRow.Hidden = True
Next i
' 第二步:按F5数字显示对应色块,多余隐藏
For i = 1 To 总份数
Dim 色块显示状态 As Boolean: 色块显示状态 = (i <= 显示数量)
Me.Range(色块行数组(i - 1)).EntireRow.Hidden = Not 色块显示状态
Next i
End Select
Me.Calculate ' 强制刷新,消除缓存残留
Application.ScreenUpdating = True ' 恢复屏幕刷新
End Sub
' ========== 【可选】一键恢复所有行(防误操作兜底) ==========
Sub 一键恢复所有()
Dim 表格行数组 As Variant: 表格行数组 = Array("1:4", "9:12", "17:20")
Dim 色块行数组 As Variant: 色块行数组 = Array("5:8", "13:16", "21:24")
Dim i As Integer
For i = LBound(表格行数组) To UBound(表格行数组)
Me.Range(表格行数组(i)).EntireRow.Hidden = False
Me.Range(色块行数组(i)).EntireRow.Hidden = False
Next i
MsgBox "所有表格+色块已全部恢复显示!", vbInformation
End Sub