隱藏基於多個單元格的行

隱藏基於多個單元格的行

我的資料庫變得越來越龐大,我正在努力讓事情變得更容易管理。我基本上想做的是:

如果儲存格 E:E =「完成」隱藏對應的行
否則如果儲存格 F:F =「完成」隱藏相同/對應的行

這將持續一年中的 52 週,並根據數據添加無限數量的行

我嘗試過一個簡單的程式碼:

Private Sub Worksheet_Change(check)

    If Range("E:Z") = Complete Then
        Rows("3:7000").EntireRow.Hidden = True
    Else
        Rows("3:7000").EntireRow.Hidden = False
    End If

這可以編譯,但不會發生很多其他事情。

任何幫助都會很棒。

答案1

好吧,讓我們把這個分開。

您的命令將整行和整列作為區塊進行尋址,但它們實際上並未評估目前儲存格。 VBA 中的文字值必須位於雙引號內,否則 Excel 會認為這是命名變數或物件。

據我了解,您需要查看 E 至 Z 列以輸入“完成”一詞。 Worksheet_Change 事件作用於目標,即已變更的儲存格。若要查看儲存格是否位於 E 到 Z 列中,您可以檢查目標是否與該範圍相交。

Intersect(Target, Range("E:Z"))

該命令傳回一個範圍物件。如果變更的儲存格不在指定範圍內,則不傳回任何內容。因此,下一個有點雙重否定,但我們希望如果相交物件是不是沒有什麼。這樣寫如下

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
'   do something
End If

接下來您要檢查目標儲存格的值是否為「Complete」。使其不區分大小寫可能是個好主意,因此將目標包裝到UCasewill 中即可解決。

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    If UCase(Target.Value) = "COMPLETE" Then
        ' some code to hide the row
    End If
End If

隱藏行的程式碼需要取得目標儲存格的行號。這可以透過 來完成Target.Row,然後可以將其輸入到Rows()與您使用的命令類似的命令中,但僅適用於目標單元格的行。

Rows(Target.Row).EntireRow.Hidden = True

到目前為止,程式碼將是

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    If UCase(Target.Value) = "COMPLETE" Then
        Rows(Target.Row).EntireRow.Hidden = True
    End If
End If

End Sub

……這適用於單獨的行。但是,如果您一下子將“Complete”複製到幾行中,則目標將包含多於一行,並且需要調整程式碼以反映這一點。宣告一個名為 cel 的範圍,然後循環遍歷目標範圍中的每個 cel。 UCase 和 Rows 命令現在需要尋址cel而不是Target

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cel As Range
If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    For Each cel In Target
        If UCase(cel.Value) = "COMPLETE" Then
            Rows(cel.Row).EntireRow.Hidden = True
        End If
    Next cel
End If

End Sub

現在你就得到了它。

相關內容