2017-08-31 29 views
0

我有一個工作表,其設置方式與日曆類似 - 每個列都是工作日,直到月底,列A是名稱任務,每行都是一個特定的任務(8個任務),然後在下一個月下面使用相同的任務。如果一列中的單元格包含特定的字符串,如何隱藏一行

目前,我們正在使用下面的代碼隱藏每行每一個任務切換按鈕(其他行刪除以節省空間):

Private Sub ToggleButton13_Click() 
If ToggleButton13.Value = True Then 

     Rows(22).EntireRow.Hidden = True 

    Else 

     Rows(22).EntireRow.Hidden = False 

    End If 
End Sub 

這是好的,但這種日曆現在一直用添加生長需要我們進入每個切換按鈕和每一行以改變它適應新任務的任務。由於日曆不屬於我,我沒有任何經驗,因此以前發現的任何形式的編碼,實際用戶不希望手動更改(我可以理解爲什麼,它可能是耗時的)。我想知道我們是否可以在togglebutton中使用'IF'功能?

那麼有效:

  1. 一切都是可見
  2. 按ToggleButton13

    IF ColumnA cell contains 'Admin' then hide the row ELSE If ColumnA cell doesn't contain 'Admin' then show the row

+0

只需使用'IF'與'Row.Hidden'。循環行;看看該行是否包含「Admin」,如果有,則將該行設置爲「Hidden」。你可以使用按鈕來觸發宏。 –

回答

0

兩種方式我能想到的:

週期的每一行,並設置隱藏屬性。
由於代碼在ToggleButton後面,我們不需要指定表名。代碼將在當前活動工作表上運行,這是正確的工作表,因爲您已按下ToggleButton。

由於ToggleButton返回TRUE或FALSE,我們可以將隱藏屬性設置爲該值。

Private Sub ToggleButton1_Click() 
    Dim rDataRange As Range 
    Dim rCell As Range 

    'Set rDataRange = Range("A2", Cells(Rows.Count, 1).End(xlUp)) 
    'Take into account hidden rows: 
    Set rDataRange = Range("A2", HiddenLastCell(ActiveSheet)) 

    For Each rCell In rDataRange 
     If rCell = "Admin" Then 
      Rows(rCell.Row).EntireRow.Hidden = ToggleButton1 
     End If 
    Next rCell 
End Sub 

設置在rDataRange範圍內使用此功能找到的最後一個單元格,即使它是隱藏的:

Public Function HiddenLastCell(wrkSht As Worksheet) As Range 

    Dim rLastCell As Range 
    Dim bHasHiddenData As Boolean 
    Dim rSearch As Range 
    Dim lLastCol As Long, lLastRow As Long 
    Dim lRow As Long 

    With wrkSht 
     Set rLastCell = .Columns(1).Find("*", , , , xlByColumns, xlPrevious) 

     If Not rLastCell Is Nothing Then 
      bHasHiddenData = rLastCell.Row <> .UsedRange.Rows.Count 
     Else 
      bHasHiddenData = .UsedRange.Rows.Count > 1 
     End If 

     If bHasHiddenData Then 
      Set rSearch = .Range(.Cells(1, 1), .Cells(.UsedRange.Row + .UsedRange.Rows.Count - 1, 1)) 
      For lRow = rSearch.Rows.Count + 1 To 2 Step -1 
       If .Cells(lRow, 1) = vbNullString And .Cells(lRow - 1, 1) <> vbNullString Then 
        Set HiddenLastCell = .Cells(lRow, 1) 
       End If 
      Next lRow 
     Else 
      On Error Resume Next 
      lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column 
      lLastRow = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row 
      If lLastCol = 0 Then lLastCol = 1 
      If lLastRow = 0 Then lLastRow = 1 
      Set HiddenLastCell = wrkSht.Cells(lLastRow, lLastCol) 
      On Error GoTo 0 
     End If 
    End With 

End Function 

使用自動篩選隱藏行。
這個代碼添加到按鈕:

Private Sub ToggleButton1_Click() 
    FilterAdmin ToggleButton1.Value 
End Sub 

此代碼將應用或刪除過濾器:

Sub FilterAdmin(ToggleOn As Boolean) 

    Dim rDataRange As Range 
    Dim rLastCell As Range 

    With ThisWorkbook 

     If ToggleOn Then 
      Set rLastCell = LastCell(.Worksheets("Sheet1")) 
      With .Worksheets("Sheet1") 
       'Get reference to data range (A1 to last used cell). 
       'Or you can manually set the range. 
       Set rDataRange = .Range(.Cells(1, 1), rLastCell) 

       'If auto-filter isn't turned on then turn it on. 
       If Not .AutoFilterMode Then rDataRange.AutoFilter 

       'Remove any applied filters. 
       If .FilterMode Then .ShowAllData 

       rDataRange.AutoFilter Field:=1, Criteria1:="<>Admin", Operator:=xlAnd 
      End With 
     Else 
      If .Worksheets("Sheet1").FilterMode Then .Worksheets("Sheet1").ShowAllData 
     End If 
    End With 

End Sub 

該函數將返回一個包含數據和在上述過程中使用的最後一個單元:

Public Function LastCell(wrkSht As Worksheet, Optional Col As Long = 0) As Range 

    Dim lLastCol As Long, lLastRow As Long 

    On Error Resume Next 

    With wrkSht 
     If Col = 0 Then 
      lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column 
      lLastRow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row 
     Else 
      lLastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column 
      lLastRow = .Columns(Col).Find("*", , , , xlByColumns, xlPrevious).Row 
     End If 

     If lLastCol = 0 Then lLastCol = 1 
     If lLastRow = 0 Then lLastRow = 1 

     Set LastCell = wrkSht.Cells(lLastRow, lLastCol) 
    End With 
    On Error GoTo 0 

End Function 

您可以更改代碼中的工作表參考,以使用ActiveSheet而不是Sheet1(同樣,按下切換按鈕時,正確的工作表將被激活)。

+0

謝謝Darren Bartrup-Cook!我已經使用了你的第一個建議,這已經解決了我的問題,現在我唯一擁有的是,如果我所有的切換按鈕被按下並且任務被隱藏,那麼即使它們不能被隱藏切換令人沮喪。不要以爲你有任何指針? 我想創建另一個取消隱藏所有行的ToggleButton。 –

+0

通過隱藏所有任務隱藏所有行的聲音,所以列A顯示爲空,並且設置'rDataRange'的行將返回對單元格A1:A2的引用。我將更新代碼以考慮這一點 - 這可能不是查找最後一行(考慮隱藏行)的最佳方式,但它可以工作。 –

0

假設:條目A列中是連續的......它會派上用場你的表不斷增長,所以只需要遵循一個格式。

 Private Sub ToggleButton13_Click() 

     Dim indexCol, indexRow as Integer 
     dim myKey as String 

     myKey = "Admin" 


     indexCol = 1 ' For Column A 
    indexRow = 2 'row index from where the first entry starts in the Column 


    ' loop will traves each row utill columnA entry correspondig to that row is not empty 
    Do While IsEmpty(ActiveSheet.Cells(indexRow, indexCol)) = False 

    If ActiveSheet.Cells(indexRow, indexCol).Value = myKey Then 

      Rows(indexRow).EntireRow.Hidden = True 

     Else 

      Rows(indexRow).EntireRow.Hidden = False 

     End If 

     indexRow = indexRow + 1 

    Loop  

    End Sub 
0

嘗試一個通用循環,類似於Ron Rosenfield在評論中提出的建議。由於您對編碼沒有經驗,您可以通過它發表評論:

Dim i, LR as Integer 'i will be variable for row in the loop, LR as variable for last row 
LR = Cells(Rows.Count,1).End(xlUp).Row 'Determines the last row based on contiguous cells in column 1, aka column A 
For i = 2 to LR 'Starting at Row 2 with the assumption that you have headers 
    If Cells(i,1).Value="Admin" Then 'Cells(row,column) here is column 1, aka column A. 
     Rows(i).EntireRow.Hidden=True 'Hides row if true 
    Else 
     Rows(i).EntireRow.Hidden=False 'Ensure row is not hidden if false. 
    End If 
Next i 

這將在您的按鈕單擊宏內。

相關問題