2017-08-10 117 views
0

我试图创建一个隐藏行,如果特定列中的单元格包含0值的宏。数据更新后重新运行Excel宏

我发现从另一个论坛使用的宏将隐藏行(下面),但它只会在数据第一次刷新时隐藏行。我在表格的顶部使用数据验证单元格,该单元格从另一个工作表中提取数据以填充参考数据(而工作表的其余部分使用SUMIFS)。

当我的团队更新单元格以选择各种选项(例如:美国,亚洲,欧洲,全部)时,我需要再次运行宏才能隐藏任何包含0值的单元格。我也不能有一个宏会混淆在工作表中使用的SUMIFS公式。

电流公式我:

Sub HideRows() 
Application.ScreenUpdating = False 
Application.Calculation = xlManual 

For Each c In Range("E7:E153") 
    If c.Value = 0 Then Rows(c.Row).Hidden = True 
Next 

Application.Calculation = xlAutomatic 
Application.ScreenUpdating = True 
End Sub 

我想我需要的是添加某种在年底重新运行或循环线,但我不知道在哪里何去何从。任何帮助将不胜感激。

TYVM。

+0

“...隐藏任何包含0值的单元格”。你想隐藏那一行吗?柱?或者从字面上看就是那个单元格你不能完全(AFAIK)隐藏一个单元格......但也许我们可以通过使文本变成白色或其他东西来“隐藏”它? – BruceWayne

回答

0
Private Sub Worksheet_Change(ByVal Target As Range) 

    MsgBox "You just changed " & Target.Address 

End Sub 

http://www.ozgrid.com/VBA/run-macros-change.htm

只是参考target.Address借到chages特定的细胞,然后把它称之为HideRows

如果您需要事先取消隐藏所有行只添加这代码到您的程序ActiveSheet.Cells.EntireRow.Hidden = False

+0

@KPaul它有什么关系吗?如果target.Address改变并且它调用了他的sub,那么最终的结果仍然可以达到。重点是说明如何使用worksheet_change事件。没有提到我从来没有说过任何地方隐藏行。我说过“然后让它调用hideRows”sub,这是他工作的sub的名字。基本的面向对象,如果你分开工作表的变化形式隐藏行子(这是应该做的第一个地方,哈哈) –

+0

嗨@KPaul布鲁斯韦恩和DougCoats非常感谢你的帮助。我尝试了您提供的宏,它在您第一次过滤数据时起作用,但如果要筛选更多选项,则不会清除隐藏的行。例如:如果我要过滤欧洲,然后再回到全部,然后由销售人员进行过滤,则前一个过滤器的隐藏行不会隐藏。因此,当我大致进行3次数据更新时,我没有剩下行。 是否有可以进行更新,以便来自1个过滤器的隐藏行在下一次数据刷新时变为不隐藏/不相关? 再次感谢! – bgreen

+0

也许宏可以填充所有单元格包含0的特定颜色,然后我可以使用过滤器选项按颜色进行过滤 - 这是否行得通? – bgreen

1

您可以使用Worksheet_Change事件。

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Count = 1 Then 
     Application.ScreenUpdating = False 
     Application.Calculation = xlManual 

     For Each c In Range("E7:E153") 
      If c.Value = 0 Then Rows(c.Row).Hidden = True Else Rows(c.Row).Hidden = False 
     Next 

     Application.Calculation = xlAutomatic 
     Application.ScreenUpdating = True 
    End If 
End Sub 
+0

嗨, 这与之前的问题相同 - 它不会隐藏之前数据过滤器之后的行。 改变,而不是要求,但只有当我点击数据刷新后的单元格时才执行宏。没关系,但有没有办法让它自己做? – bgreen

+0

尝试添加Else行(c.Row).Hidden = False。我上面更新了我的答案。 –

+0

@K Paul它的工作原理!谢谢!任何想法,如果有办法让它,以便您不必点击以让宏再次执行(又名取消隐藏/隐藏行)? – bgreen