2016-01-13 181 views
0

如果隐藏了整个行的范围,我想取消隐藏单个行。如果该范围内的单行不被隐藏,我想隐藏该行。这是什么语法?我目前的代码如下:隐藏/取消隐藏基于单元格范围的隐藏/未隐藏状态的行

Public Sub MySub() 

Application.ScreenUpdating = False 

With Range("A1:A5") 
.EntireRow.Hidden = False 

For Each cell In Range("A1:A5") 
    Select Case cell.Value 
     Case Is = "-" 
     cell.EntireRow.Hidden = True 
    End Select 
Next cell 

End With 

Application.ScreenUpdating = True 

End Sub 
+0

你可以检查'如果行(Cell.Row).EntireRow.Hidden = True然后...'?不太清楚问题是什么,你能澄清一点吗? – BruceWayne

+1

所以我在A1:A5中有值。如果其中任何值等于“ - ”,则VBA代码将隐藏相应的行。如果它们全都等于“ - ”,我希望单元格6行取消隐藏。如果即使第1-5行中的一个未被隐藏(意味着A1,A2,A3,A4或A5中的值不等于“ - ”),我希望第6行被隐藏。 –

回答

1

我想我明白了。这个怎么样:

Sub test() 
Dim cel As Range, rng As Range 
Dim hideRow&, numDashes& 

Set rng = Range("A1:A5") 
hideRow = rng.Count + 1 

For Each cel In rng 
    If cel.Value = "-" Then 
     numDashes = numDashes + 1 
     Rows(cel.Row).EntireRow.Hidden = True 
    End If 
Next cel 
If numDashes = rng.Count Then 
    ' If all cells in the range are '-' 
    Rows(hideRow).EntireRow.Hidden = False 
Else 
    Rows(hideRow).EntireRow.Hidden = True 
End If 
End Sub 

我是那种假设你要隐藏/取消隐藏行6,因为它是一个你的范围内的最后一行以下的。因此,我创建了一个变量来保存这个。这样,如果你想改变你的范围来说A1:A100,你所要做的就是调整rng,它会看起来隐藏/取消隐藏第101行。当然,如果你只需要它是6,那么只是做hideRow = 6

编辑:为了好玩,我试图减少计数变量numDashes的使用,并试图检查所有-的范围,以便更加简洁。下面也应该工作,但可能需要一两个调整:

Sub test2() 
Dim cel As Range, rng As Range 
Dim hideRow& 

Set rng = Range("A1:A5") 
hideRow = rng.Count + 1 
'Check to see if your range is entirely made up of `-` 
If WorksheetFunction.CountIf(rng, "-") = rng.Count Then 
    Rows(hideRow).EntireRow.Hidden = False 
    ' If you want to stop your macro if ALL range values are "-", then uncomment the next line: 
    'Exit Sub 
Else 
    Rows(hideRow).EntireRow.Hidden = True 
End If 

For Each cel In rng 
    If cel.Value = "-" Then 
     Rows(cel.Row).EntireRow.Hidden = True 
    End If 
Next cel 

End Sub 
+0

@MarkRomano - 调整是什么?悬念! – BruceWayne

+0

真棒,韦恩!我做的唯一的调整是第一个'If'语句的'Else'语句,行'行(cel.Row).EntireRow.Hidden = False'。在我真正的Excel文档中,这些值A1:A5根据另一个工作表中单元格中的值进行更改。此外,只有在该单元格发生更改时才会触发此方法。这可能是我不得不添加'Else'的原因。再次感谢! –

+0

@MarkRomano - 所以,只有当A1:A5中的值发生变化时,这个宏才会运行?你可以使一个'Worksheet_Change'事件自动触发,而不必猜测/知道一个单元格是否已经改变。 – BruceWayne

0

你可以用一个辅助列中的公式做到这一点。我用这个财务报表来压缩多列都为零的行来缩短报表。

=IF(AND(SUM(A7:R7)<1,SUM(A7:R7)>-1),IF(OR(ISNUMBER(LEFT(H7,4)),ISBLANK(H7),ISERR(VALUE(LEFT(H7,4)))),"Show","Hide"),"Show"). 

然后按该列过滤行。

+1

@BruceWayne感谢您编辑帖子。我对此很陌生。你如何在滚动中获得公式?看起来你没有改变它。 –

+0

我刚刚突出显示公式,并单击了代码标签按钮('{}')。 – BruceWayne