可见除指定的两张纸之外的所有纸张

时间:2016-12-10 14:24:46

标签: vba worksheet

我已经编写了一些代码来隐藏和取消隐藏工作表,通过更改第一个工作表中的值,除了前两页之外,如何才能看到所有工作表?

Private Sub Worksheet_Change(ByVal Target As Range)
    If Range("H5").Value = "ADMIN" Then
        Sheets(2).Visible = True
        Sheets(2).Activate
    Else
        Sheets(2).Visible = xlVeryHidden
    End If
    If Range("G8").Value = True And Range("H5").Value = "" Then
        Sheets(3).Visible = True 'I want to visible all sheets except first two sheets.
        Sheets(4).Visible = True
        Sheets(1).Visible = xlVeryHidden
        Sheets(2).Visible = xlVeryHidden
    Else
        Sheets(3).Visible = xlVeryHidden
        Sheets(4).Visible = xlVeryHidden
    End If
End Sub

3 个答案:

答案 0 :(得分:0)

您需要做的是遍历工作簿中的所有Sheets,如果Sheet.Index大于2,则将表格设为可见。

见下面的循环:

Dim Sht As Worksheet

' loop through all worksheets in this workbook
For Each Sht In ThisWorkbook.Worksheets
    If Sht.Index > 2 Then ' check if index > 2
        Sht.Visible = xlSheetVisible
    Else
        Sht.Visible = xlVeryHidden
    End If
Next Sht

整个代码

Private Sub Worksheet_Change(ByVal Target As Range)

Dim Sht As Worksheet

If Range("H5").Value = "ADMIN" Then
    Sheets(2).Visible = True
    Sheets(2).Activate
Else
    Sheets(2).Visible = xlVeryHidden
End If

If Range("G8").Value = True And Range("H5").Value = "" Then
    For Each Sht In ThisWorkbook.Worksheets
        If Sht.Index > 2 Then
            Sht.Visible = xlSheetVisible

        End If
    Next Sht

End If

End Sub

答案 1 :(得分:0)

编辑以反映Adnan的最后一段代码

您可以尝试以下代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim iSht As Long

    Sheets(2).Visible = xlVeryHidden '<--| you'll make it visible if the case (see below)
    Select Case Range("H5").Value '<--| check for H5 cell only once
        Case "ADMIN"
            Sheets(2).Visible = True
            Sheets(2).Activate
        Case ""
            If Range("G8").Value Then '<--| check for it only when H5 cell value <> "ADMIN"
                For iSht = 3 To Sheets.count '<--| loop through sheets indexes greater than 2, and avoid 'If ... Then' check
                    Sheets(iSht).Visible = True
                Next iSht
                Sheets(1).Visible = xlVeryHidden '<--| hide first sheet only once
            End If
    End Select
End Sub

它与你的相同,但有一些逻辑上的改进:

  • 不会检查Range("H5").Value

  • 两次 在Range("G8").Value为“ADMIN”之后
  • 无法检查Range("H5").Value

  • 不会在每个If Sht.Index > 2 Then循环中进行For Each Sht In ThisWorkbook.Worksheets检查

  • 未在每个Sheets(1).Visible = xlVeryHidden循环中设置For Each Sht In ThisWorkbook.Worksheets

答案 2 :(得分:0)

Private Sub Worksheet_Change(ByVal Target As Range)

Dim Sht As Worksheet

If Range("H5").Value = "ADMIN" Then
    Sheets(2).Visible = True
    Sheets(2).Activate
Else
    Sheets(2).Visible = xlVeryHidden
End If

If Range("G8").Value = True And Range("H5").Value = "" Then
    For Each Sht In ThisWorkbook.Worksheets
        If Sht.Index > 2 Then
            Sht.Visible = xlSheetVisible
            Sheets(1).Visible = xlVeryHidden
'     Else
'         Sht.Visible = xlVeryHidden
        End If
    Next Sht
'Else
'    Sheets(3).Visible = xlVeryHidden
'    Sheets(4).Visible = xlVeryHidden
End If

End Sub