Excel VBA - 根据其他单元格值显示/隐藏行和工作表的条件逻辑

问题描述 投票:0回答:1

免责声明:我是 VBA 菜鸟 :)

我有一本包含很多工作表的工作簿。 在 Sheet1 上,我有很多“部分”。 在每个“部分”中,我都有一个单元格(例如 B31),可以是“是”或“否”。

如果单元格为“是”,那么我想:

  • 在同一张纸上显示第 32 至 46 行(Sheet1)
  • 在不同的工作表上显示第 19 至 36 行(工作表 2)
  • 显示表3

如果单元格为“否”,那么我想:

  • 隐藏同一张纸(Sheet1)上的第 32 至 46 行
  • 在不同的工作表上隐藏第 19 至 36 行(工作表 2)
  • 隐藏工作表3

这是 Sheet1 上 30 个不同“部分”的前提。 每个部分都会评估不同单元格中的“是”或“否”值,并显示/隐藏同一张工作表中接下来的 15 行,显示/隐藏 Sheet2 行,并完全隐藏某个工作表(范围从 Sheet3 到 Sheet 30) )

到目前为止,我已经可以正常工作了,但我觉得我的代码写得很糟糕。 如果有人添加额外的部分,维护将会很困难。 有时我会黑屏几秒钟,因为运行代码需要很长时间。

最终,这是我为每个部分所做的代码。对于我正在评估的每个单独部分,都会重复下面的代码。下面的代码适用于我正在评估的 3 个不同部分,有没有办法可以更好地对其进行编码,以实现可重用性和更好的性能?或者有什么突出的“愚蠢”方式来做到这一点?

Dim ScopeChange As Range
Dim Module_1 As Variant
Dim Module_2 As Variant
Dim Module_3 As Variant

Module_1 = Range("B31").Value
Module_2 = Range("B49").Value
Module_3 = Range("B67").Value

Set ScopeChange = Range("B31")
If Not ScopeChange Is Nothing Then
    Application.EnableEvents = False
    Select Case Module_1
        Case "Yes": Rows("32:46").EntireRow.Hidden = False
                    Worksheets("Sheet2").Rows("19:36").EntireRow.Hidden = False
                    Worksheets("Sheet3").Visible = True
        Case "No": Rows("32:46").EntireRow.Hidden = True
                    Worksheets("Sheet2").Rows("19:36").EntireRow.Hidden = True
                    Worksheets("Sheet3").Visible = False
    End Select
    Application.EnableEvents = True
End If

Set ScopeChange = Range("B49")
If Not ScopeChange Is Nothing Then
    Application.EnableEvents = False
    Select Case Module_2
        Case "Yes": Rows("50:64").EntireRow.Hidden = False
                    Worksheets("Sheet2").Rows("37:54").EntireRow.Hidden = False
                    Worksheets("Sheet4").Visible = True
        Case "No": Rows("50:64").EntireRow.Hidden = True
                    Worksheets("Sheet2").Rows("37:54").EntireRow.Hidden = True
                    Worksheets("Sheet4").Visible = False
    End Select
    Application.EnableEvents = True
End If

Set ScopeChange = Range("B67")
If Not ScopeChange Is Nothing Then
    Application.EnableEvents = False
    Select Case Module_3
        Case "Yes": Rows("68:82").EntireRow.Hidden = False
                    Worksheets("Sheet2").Rows("55:72").EntireRow.Hidden = False
                    Worksheets("Sheet5").Visible = True
        Case "No": Rows("68:82").EntireRow.Hidden = True
                    Worksheets("Sheet2").Rows("55:72").EntireRow.Hidden = True
                    Worksheets("Sheet5").Visible = False
    End Select
    Application.EnableEvents = True
End If

End Sub
excel vba row show-hide worksheet
1个回答
0
投票
  • 无论更改的单元格数量有多少,代码始终会评估所有部分(将来 30 个或什至更多)以隐藏/取消隐藏行和工作表。这可以显着增加处理时间。

  • 更改:利用更改事件代码仅验证更改的单元格并调整相关行和工作表的可见性。

  • 另一个优点是,如果用户添加新部分,只要该部分的布局遵循相同的模式,您就不必修改代码。

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    With Target
        If .CountLarge = 1 And .Column = 2 And .Row > 30 Then
            If ((.Row - 13) Mod 18 = 0) And Len(.Value) > 0 Then
                Dim iIndex As Long, rngSht1 As Range, rngSht2 As Range
                iIndex = (.Row - 13) / 18
                Application.EnableEvents = False
                Set rngSht1 = Me.Cells(iIndex * 18 + 14, 1).Resize(15).EntireRow
                Set rngSht2 = Worksheets("Sheet2").Cells(iIndex * 18 + 1, 1).Resize(18).EntireRow
                Select Case UCase(.Value)
                Case "YES"
                    rngSht1.Hidden = False
                    rngSht2.Hidden = False
                    Worksheets("Sheet" & iIndex + 2).Visible = True
                Case "NO"
                    rngSht1.Hidden = True
                    rngSht2.Hidden = True
                    Worksheets("Sheet" & iIndex + 2).Visible = False
                End Select
                Application.EnableEvents = True
            End If
        End If
    End With
End Sub

© www.soinside.com 2019 - 2024. All rights reserved.