2015-04-23 34 views
1

在Excel中,我有一个元素列表。每一行都有一个颜色。 对于每种颜色,我都会创建一个按钮来隐藏其他行。Excel VBA - 按颜色比较行时的改进时间

例如,如果我点击红色的按钮,所有不是红色的行都被隐藏。

而且还有一个复位按钮,取消隐藏所有行 下面的代码:

Sub Red_Click() 
    Dim Color_Index As Long 
    Color_Index = Range("I1").Interior.ColorIndex 
    Call HideOther(Color_Index) 
End Sub 

Sub Green_Click() 
Dim Color_Index As Long 
Color_Index = Range("E1").Interior.ColorIndex 
Call HideOther(Color_Index) 
End Sub 

Sub HideOther(Color_Index) 
    Set rRange = Range("$A4:$A313") 
    For Each cl In rRange 
     currentColIndex = cl.Interior.ColorIndex 
     If currentColIndex <> Color_Index Then 
      cl.EntireRow.Hidden = True 
     End If 
    Next cl 
End Sub 

Sub Reset() 
    Cells.EntireRow.Hidden = False 
End Sub 

我比较我的色彩每一行的颜色。

我有300行,所以需要一些时间(约15秒),有没有办法来改善时间?我问这是因为重置/取消隐藏功能是即时的。

我在Excel中的一个初学者,所以也许我没有看到更容易的解决方案

+3

如果您有Excel 2007或更高版本,你可以通过颜色自动筛选。在做宏时录制一个宏会给你基本的代码。 – Rory

+2

在开始时关闭屏幕更新可能会有所帮助。 Application.ScreenUpdating = False(结束时返回true)。 –

+0

此外,您可能会禁用事件并再次启用它们,禁用自动重新计算并重新启用它等。 – user3819867

回答

1

正如评论中所说,关闭屏幕更新将有所帮助。根据您的数据,关闭计算也可能有帮助。

除此之外,在速度上的重大改进会立即被隐藏的所有行:

Sub HideOther(Color_Index) 
    Dim cells As Range 

    Set rRange = Range("$A4:$A313") 
    For Each cl In rRange 
     currentColIndex = cl.Interior.ColorIndex 
     If currentColIndex <> Color_Index Then 
      If Not cells Is Nothing Then 
       Set cells = Union(cells, cl) 
      Else 
       Set cells = cl 
      End If 
     End If 
    Next cl 

    cells.EntireRow.Hidden = True 
End Sub 
+0

它完美的作品。谢谢! – jvo

0

我认为这将是稍快,因为我少预定义的东西,并用定义的变量(即我不知道是什么我正在做)。

Sub Red_Click() 
    Dim Color_Index As Long 
    Color_Index = Range("I1").Interior.ColorIndex 
    Call HideOther(Color_Index) 
End Sub 

Sub Green_Click() 
Dim Color_Index As Long 
Color_Index = Range("E1").Interior.ColorIndex 
Call HideOther(Color_Index) 
End Sub 

Sub HideOther(Color_Index As Long) 
    For Each Cell In Range("$A4:$A313")            'why define something when you're 
     If Cell.Interior.ColorIndex <> Color_Index Then Cell.EntireRow.Hidden = True 'using it but once 
    Next 
End Sub 

Sub Reset() 
    Cells.EntireRow.Hidden = False 
End Sub