2014-01-08 123 views
2

我在VBA中很新,并且一直在寻找可以做我想做的事情的VBA代码。我试了几次,试图调整他们,但我似乎无法让他们正确的想所以我想尝试一些帮助!根据单元格中的单词隐藏excel中的行

我有6个项目在其旁边的单元格中显示YES或NO,表示该人员是否在处理该项目。这是由另一张工作表上该项目旁边的人员名称确定的,因此生成的是公式,而不是下拉式或键入的值。

该项目下面有几行对应于它。

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

我想这要反复对每一个项目,

所以C7无隐藏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 
+1

请向我们展示您的这些改编。 :) – Manhattan

+0

我已经更新了代码的帖子,对不起之前错过了 – user3171565

+0

删除了我的downvote。在我的头顶上,没有触及你的代码,你有没有尝试将'NO'转换为''NO''? :) – Manhattan

回答

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 

请测试。

+0

+1:我做到的确切方式。无需使用'InStr',在编辑工作正常之前进行简单的布尔检查。虽然这有一个固有的弱点,我敢肯定,如果这个要求是我认为的那样。 – Manhattan

+1

@ BK201:恩,不是我这样做的,虽然结果是由一个公式产生的,所以'Worksheet_Change'不会工作:) –

+0

@SiddharthRout:正是我为什么不能发布我的。他说'不'也是从某个地方来的。另一个固有的弱点是......如果你同时改变多个单元格,它会抛出错误13。在“bHide”行之前添加'On Error Resume Next'似乎是解决方案,但它不会隐藏任何东西。 :) – Manhattan

1

所以在C7一个没有隐藏31:47,一个没有在C8隐藏49:65,在C9一个没有隐藏67:83,一个没有在C10隐藏85:101,没有在C11隐藏103: 118,

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的单元由用户手动更改。

+0

这种模式很好的选择!但是如果这个模式被破坏的话,VBA新手很难维护(如果某些“否”需要更多的行来隐藏其他的)。关于Worksheet_Calculate绝对正确。 – PatricK

+0

@PatricK:我们都是新手一次;) –

+0

@SiddharthRout,它工作!非常感谢您的帮助!我不可能通过自己想出这个代码来解决它,希望我不会破坏它!,非常感谢所有花时间帮助我的人:) – user3171565

相关问题