簡體   English   中英

根據單元格中的值隱藏和取消隱藏一系列行

[英]Hide and Unhide a range of rows based on the value in a cell

非常基本,我敢肯定,但我一生都無法弄清楚。

我有一組單選按鈕,可以在 1 和 2 之間更改單元格(“L37”)的值。

我嘗試用幾種不同的方式編寫 VBA 代碼,但沒有運氣。 請指教。

Sub hide_sheet()
    If Worksheets("Feedback").Range("L37").Value = 1 Then
      Rows("63:93").EntireRow.Hidden = True
    Else Worksheets("Feedback").Range("L37").Value = 2 Then
      Worksheets("Feedback").Rows("63:93").EntireRow.Hidden = False
    End If
End Sub

我通過與單選按鈕綁定的宏讓它工作得很好; 但是,由於我需要保護工作表,我需要更改它。

我正在使用保護/取消保護 VBA 代碼,並希望將其包含到代碼中,這樣它就不會觸發宏/工作表保護警告。

這是我用於所有內容的保護/取消保護代碼。

Sub unprotect()

    Worksheets("Feedback").unprotect
    
End Sub

Sub protect()

    Worksheets("Feedback").protect , _
        AllowFormattingCells:=True, _
        AllowFormattingRows:=True
        
    
End Sub

任何建議將不勝感激。 提前感謝您的幫助。

顯示/隱藏行

問題

  • Feedback工作表不合格,因此如果錯誤的工作簿處於活動狀態,它將失敗。 要引用包含此代碼的工作簿,您可以使用ThisWorkbook

     ThisWorkbook.Worksheets("Feedback")...
  • 您在 If 子句中使用Rows("63:93")而不是Worksheets("Feedback").Rows("63:93") 如果錯誤的工作表處於活動狀態(選中),它將失敗。

  • 您正在使用Else而不是ElseIf

  • 您可以使用With語句來減少鍵入,如以下代碼所示。

  • 如果將單元格值轉換為字符串,則如果單元格意外包含錯誤值,則代碼不會失敗。

編碼

Sub ShowHideRowsFix()
    With ThisWorkbook.Worksheets("Feedback")
        .Unprotect
        Select Case CStr(.Range("L37").Value)
        Case "1"
            .Rows("63:93").Hidden = True
        Case "2"
            .Rows("63:93").Hidden = False
        Case Else
        End Select
        .Protect AllowFormattingCells:=True, AllowFormattingRows:=True
    End With
End Sub

一種提升

  • 要自動執行此操作(不需要按鈕),在 VBE 項目瀏覽器 window 中標識的Feedback工作表的工作表模塊中,例如Sheet1(FeedBack) (雙擊打開),您可以使用以下代碼。
Private Sub Worksheet_Change(ByVal Target As Range)
    
    Const CellAddress As String = "L37"
    
    Dim Cell As Range: Set Cell = Me.Range(CellAddress)
    If Intersect(Cell, Target) Is Nothing Then Exit Sub
    
    ShowHideRows Cell

End Sub

Sub ShowHideRows(ByVal Cell As Range)
    With Cell.Worksheet
        .Unprotect
        Select Case CStr(Cell.Value)
        Case "1"
            .Rows("63:93").Hidden = True
        Case "2"
            .Rows("63:93").Hidden = False
        Case Else
        End Select
        .Protect AllowFormattingCells:=True, AllowFormattingRows:=True
    End With
End Sub

我更喜歡盡可能簡單的方法。 這是我用來隱藏為您的需要重新編寫的列的方法。

以下代碼可能存在於用戶窗體或標准代碼模塊中:

IF RadioButton1.Value = True then 'Assuming the value is 1
   rwControl "hRW"   'This hides the Rows
 ELSE
   rwControl "uRW"   'This unhides the Rows
End If

您可以直接從 RadioButton_Change() 事件中調用此代碼,包括以下代碼:

 IF RadioButton1.Value = True then 'Assuming the value is 1 rwControl "hRW" 'This hides the Rows ELSE rwControl "uRW" 'This unhides the Rows End If

或者,為了保持簡單:

在您的RadioButton_Change()事件中只需添加:

 Private Sub RadioButton1 Change() With ThisWorkBook.Worksheets("Feedback").Unprotect If RadioButton1.Value = True Then.Rows("63:93").Hidden = True Else.Rows("63:93").Hidden = False End If.Protect End With End Sub

使用這種方法可以消除對Worksheet Module CodingCase Coding的需求,並且如果您認為RadioButtons對功能很重要,則可以保留它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM