根据单元格中的值创建/显示行

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

我在单元格“I2”和隐藏名称范围中有一个下拉列表。

我愿意:
如果在“I2”单元格中选择 1,则显示名称范围 1。
如果在“I2”中选择 2,则显示名称范围 1 和名称范围 2。
如果在“I2”中选择 3,则显示名称范围 1 和名称范围 2 和名称范围 3,依此类推。

enter image description here

我可以对所有 30 种可能的组合使用 If 语句,但这会是重复的。

If Worksheets("sheet1").Range("I2").Value = 1 Then
    Range("NameRange1).EntireRow.Hidden = False
    Range("NameRange2).EntireRow.Hidden = True
    Range("NameRange3).EntireRow.Hidden = True
    .... and so on 

有没有一种有效的方法来例如循环范围以隐藏取消隐藏所需的行?

也许我可以使用一个单独的过程来根据单元格“I2”中的值“动态”创建行(第 6 行、第 7 行、第 8 行等)。这样我就可以立即创建所需的行。

excel vba
2个回答
1
投票

以下例程将显示达到特定数字的范围并隐藏所有其他数字。它将循环遍历所有范围并检查范围编号是否大于给定的数字

showUntilRange
。由于
hidden
属性是布尔值,因此您可以简单地使用术语
(i > showUntilRange)

Sub showHideRanges(showUntilRange As Long)
    Const rangeCount As Long = 30
    Const rangeNamePrefix As String = "NameRange"
    
    Dim i As Long, rangeName As String, r As Range
    For i = 1 To rangeCount
        rangeName = rangeNamePrefix & i
        On Error Resume Next
        Set r = Nothing
        Set r = Range(rangeName)
        On Error GoTo 0
        If r Is Nothing Then
            Debug.Print "couldn't find range " & rangeName
        Else
            r.EntireRow.Hidden = (i > showUntilRange)
        End If
    Next i
End Sub

您的活动例程可能如下所示:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("I2")) Is Nothing Then Exit Sub
    
    showHideRanges CLng(Target)
End Sub

0
投票

尝试这样的事情:

Dim rStart As Integer
Dim rEnd As Integer
Dim i As Integer
    rStart = Range("NameRange1").Row
    rEnd = Range("NameRange30").Row
    
    For i = rStart To rEnd
        Range("NameRange" & i).EntireRow.Hidden = (i = Range("I2").Value)
    Next i

For .. Next Loop
循环遍历所有命名范围。如果名称与下拉单元格的值匹配,则显示整行。如果匹配失败,则隐藏整行。

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