根据单元格中的单词隐藏excel中的行

时间:2014-01-08 03:24:18

标签: excel vba excel-vba

我在VBA非常新,一直在寻找可以做我想做的VBA代码。我已经尝试了几个,并尝试调整它们,但我似乎无法让它们正确,所以我想尝试一些帮助!

我有6个项目,它们旁边的单元格中有YES或NO,表示该人员是否正在处理该项目。这取决于另一个工作表上该项目旁边的人员名称,因此生成公式而不是下拉列表或键入值。

然后项目下面有几行对应它。

如果项目旁边有NO(在C6中),我希望隐藏该项目的相应行(第13:29行)。

我希望每个项目都重复这个,

所以c7中的no隐藏31:47, C8中的一个隐藏49:65, C9中的一个隐藏67:83, C10中的一个隐藏85:101, C11中的一个隐藏103:118,

我不知道这是否可能并且已经在圈子中进行,真的希望有人可以提供帮助:)

这是我尝试过的改编之一,但我确信我做错了,很抱歉没有在此之前发布

Private Sub Worksheet_Change(ByVal Target As Range) 

If Target.Address = "$C$6" Then 
If Target.Value = NO Then 
Rows(13:29).EntireRow.Hidden = True 
Else 
Rows(13:29).EntireRow.Hidden = False 

If Target.Address = "$C$7" Then 
If Target.Value = NO Then 
Rows(31:47).EntireRow.Hidden = True 
Else 
Rows(31:47).EntireRow.Hidden = False 
End If 
End If 


If Target.Address = "$C$8" Then 
If Target.Value = NO Then 
Rows(49:65).EntireRow.Hidden = True 
Else 
Rows(49:65).EntireRow.Hidden = False 
End If 
End If 

If Target.Address = "$C$9" Then 
If Target.Value = NO Then 
Rows(67:83).EntireRow.Hidden = True 
Else 
Rows(67:83).EntireRow.Hidden = False 
End If 
End If 


If Target.Address = "$C$10" Then 
If Target.Value = NO Then 
Rows(85:101).EntireRow.Hidden = True 
Else 
Rows(85:101).EntireRow.Hidden = False 

End If 
End If 



If Target.Address = "$C$11" Then 
If Target.Value = NO Then 
Rows(103:119).EntireRow.Hidden = True 
Else 
Rows(103:119).EntireRow.Hidden = False 

End If 
End If 


End Sub 

2 个答案:

答案 0 :(得分:2)

我能想到的最短代码:

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    Dim bHide As Boolean
    bHide = (InStr(1, Target.Value, "NO", vbTextCompare) > 0)
    Select Case Target.Address
        Case "$C$6"
            Rows("13:29").EntireRow.Hidden = bHide
        Case "$C$7"
            Rows("31:47").EntireRow.Hidden = bHide
        Case "$C$8"
            Rows("49:65").EntireRow.Hidden = bHide
        Case "$C$9"
            Rows("67:83").EntireRow.Hidden = bHide
        Case "$C$10"
            Rows("85:101").EntireRow.Hidden = bHide
        Case "$C$11"
            Rows("103:119").EntireRow.Hidden = bHide
    End Select
End Sub

请测试。

答案 1 :(得分:1)

  

所以c7中的no隐藏31:47,C8中的no隐藏49:65,C9中的no隐藏67:83,C10中的no隐藏85:101,C11中的no隐藏103:118,< / p>

C11隐藏103:118?这不应该是C11隐藏103:119吗?让我解释一下。

为了简化您的工作,您需要找到代码如何进展的趋势。见这个分析。

enter image description here

您正在寻找行6中的“否”并显示/隐藏行13:29。同样,您在行7中查找“否”并在行31:47中显示/隐藏。所以如果你注意到那就有趋势。该行之间的差异为18。见上图。如果有趋势那么就有可能出现循环!

由于这个简单的表格,我也可以弄清楚你所说的C11 hides 103:118是不正确的,可能是一个错字。 118必须119才能保持18

的差异

因此,您的代码实际上可以压缩为(未经测试)

Dim i As Long, StartRow As Long, EndRow As Long

StartRow = 13
EndRow = 29

For i = 6 To 11
    If UCase(Range("C" & i).Value) = "NO" Then
        Rows(StartRow & ":" & EndRow).EntireRow.Hidden = True
    Else
        Rows(StartRow & ":" & EndRow).EntireRow.Hidden = False
    End If
    StartRow = StartRow + 18
    EndRow = EndRow + 18
Next i

接下来的事情是,由于NO's正在按公式进行更改,因此您必须使用Worksheet_Calculate而不是Worksheet_Change,除非公式正在从中获取值工作表和正在更改C6:C11的单元格由用户手动更改。