优化冗余Excel VBA代码

快速问题的学习目的。 我有下面的代码工作正常,除非我敢肯定,这是我的工作簿开始放缓的几个原因之一。

基本上,在定义的范围单元“propcount”上设置一个返回一个数字的公式。 我想根据这个数字来显示特定的表格,但是我的代码是非常多余的。 有人可以帮我解决吗? 另外请注意工作表#不一定按顺序。 目前,它会影响表格14至29,但会跳过28; 在未来它可能会变得越来越没有组织。

有任何想法吗?

Private Sub Worksheet_Calculate() If Range("propcount") = "0" Then Sheet14.Visible = xlVeryHidden Sheet15.Visible = xlVeryHidden Sheet16.Visible = xlVeryHidden Sheet17.Visible = xlVeryHidden Sheet18.Visible = xlVeryHidden Sheet19.Visible = xlVeryHidden Sheet20.Visible = xlVeryHidden Sheet21.Visible = xlVeryHidden Sheet22.Visible = xlVeryHidden Sheet23.Visible = xlVeryHidden Sheet24.Visible = xlVeryHidden Sheet25.Visible = xlVeryHidden Sheet26.Visible = xlVeryHidden Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "1" Then Sheet14.Visible = True Sheet15.Visible = xlVeryHidden Sheet16.Visible = xlVeryHidden Sheet17.Visible = xlVeryHidden Sheet18.Visible = xlVeryHidden Sheet19.Visible = xlVeryHidden Sheet20.Visible = xlVeryHidden Sheet21.Visible = xlVeryHidden Sheet22.Visible = xlVeryHidden Sheet23.Visible = xlVeryHidden Sheet24.Visible = xlVeryHidden Sheet25.Visible = xlVeryHidden Sheet26.Visible = xlVeryHidden Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "2" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = xlVeryHidden Sheet17.Visible = xlVeryHidden Sheet18.Visible = xlVeryHidden Sheet19.Visible = xlVeryHidden Sheet20.Visible = xlVeryHidden Sheet21.Visible = xlVeryHidden Sheet22.Visible = xlVeryHidden Sheet23.Visible = xlVeryHidden Sheet24.Visible = xlVeryHidden Sheet25.Visible = xlVeryHidden Sheet26.Visible = xlVeryHidden Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "3" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = True Sheet17.Visible = xlVeryHidden Sheet18.Visible = xlVeryHidden Sheet19.Visible = xlVeryHidden Sheet20.Visible = xlVeryHidden Sheet21.Visible = xlVeryHidden Sheet22.Visible = xlVeryHidden Sheet23.Visible = xlVeryHidden Sheet24.Visible = xlVeryHidden Sheet25.Visible = xlVeryHidden Sheet26.Visible = xlVeryHidden Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "4" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = True Sheet17.Visible = True Sheet18.Visible = xlVeryHidden Sheet19.Visible = xlVeryHidden Sheet20.Visible = xlVeryHidden Sheet21.Visible = xlVeryHidden Sheet22.Visible = xlVeryHidden Sheet23.Visible = xlVeryHidden Sheet24.Visible = xlVeryHidden Sheet25.Visible = xlVeryHidden Sheet26.Visible = xlVeryHidden Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "5" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = True Sheet17.Visible = True Sheet18.Visible = True Sheet19.Visible = xlVeryHidden Sheet20.Visible = xlVeryHidden Sheet21.Visible = xlVeryHidden Sheet22.Visible = xlVeryHidden Sheet23.Visible = xlVeryHidden Sheet24.Visible = xlVeryHidden Sheet25.Visible = xlVeryHidden Sheet26.Visible = xlVeryHidden Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "6" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = True Sheet17.Visible = True Sheet18.Visible = True Sheet19.Visible = True Sheet20.Visible = xlVeryHidden Sheet21.Visible = xlVeryHidden Sheet22.Visible = xlVeryHidden Sheet23.Visible = xlVeryHidden Sheet24.Visible = xlVeryHidden Sheet25.Visible = xlVeryHidden Sheet26.Visible = xlVeryHidden Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "7" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = True Sheet17.Visible = True Sheet18.Visible = True Sheet19.Visible = True Sheet20.Visible = True Sheet21.Visible = xlVeryHidden Sheet22.Visible = xlVeryHidden Sheet23.Visible = xlVeryHidden Sheet24.Visible = xlVeryHidden Sheet25.Visible = xlVeryHidden Sheet26.Visible = xlVeryHidden Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "8" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = True Sheet17.Visible = True Sheet18.Visible = True Sheet19.Visible = True Sheet20.Visible = True Sheet21.Visible = True Sheet22.Visible = xlVeryHidden Sheet23.Visible = xlVeryHidden Sheet24.Visible = xlVeryHidden Sheet25.Visible = xlVeryHidden Sheet26.Visible = xlVeryHidden Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "9" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = True Sheet17.Visible = True Sheet18.Visible = True Sheet19.Visible = True Sheet20.Visible = True Sheet21.Visible = True Sheet22.Visible = True Sheet23.Visible = xlVeryHidden Sheet24.Visible = xlVeryHidden Sheet25.Visible = xlVeryHidden Sheet26.Visible = xlVeryHidden Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "10" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = True Sheet17.Visible = True Sheet18.Visible = True Sheet19.Visible = True Sheet20.Visible = True Sheet21.Visible = True Sheet22.Visible = True Sheet23.Visible = True Sheet24.Visible = xlVeryHidden Sheet25.Visible = xlVeryHidden Sheet26.Visible = xlVeryHidden Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "11" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = True Sheet17.Visible = True Sheet18.Visible = True Sheet19.Visible = True Sheet20.Visible = True Sheet21.Visible = True Sheet22.Visible = True Sheet23.Visible = True Sheet24.Visible = True Sheet25.Visible = xlVeryHidden Sheet26.Visible = xlVeryHidden Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "12" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = True Sheet17.Visible = True Sheet18.Visible = True Sheet19.Visible = True Sheet20.Visible = True Sheet21.Visible = True Sheet22.Visible = True Sheet23.Visible = True Sheet24.Visible = True Sheet25.Visible = True Sheet26.Visible = xlVeryHidden Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "13" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = True Sheet17.Visible = True Sheet18.Visible = True Sheet19.Visible = True Sheet20.Visible = True Sheet21.Visible = True Sheet22.Visible = True Sheet23.Visible = True Sheet24.Visible = True Sheet25.Visible = True Sheet26.Visible = True Sheet27.Visible = xlVeryHidden Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "14" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = True Sheet17.Visible = True Sheet18.Visible = True Sheet19.Visible = True Sheet20.Visible = True Sheet21.Visible = True Sheet22.Visible = True Sheet23.Visible = True Sheet24.Visible = True Sheet25.Visible = True Sheet26.Visible = True Sheet27.Visible = True Sheet29.Visible = xlVeryHidden ElseIf Range("propcount") = "15" Then Sheet14.Visible = True Sheet15.Visible = True Sheet16.Visible = True Sheet17.Visible = True Sheet18.Visible = True Sheet19.Visible = True Sheet20.Visible = True Sheet21.Visible = True Sheet22.Visible = True Sheet23.Visible = True Sheet24.Visible = True Sheet25.Visible = True Sheet26.Visible = True Sheet27.Visible = True Sheet29.Visible = True End If End Sub 

循环通过设置它们的表单。 从第一张纸张循环到子公寓,使他们可见。 像这样的东西。

 Dim ws As Excel.Worksheet Dim iIndex as Integer if Range("propcount") > 0 then For iIndex = 14 To 14 + Range("propcount") Set ws = Worksheets(iIndex) ws.Visible = true Next iIndex End if 

或者,也许你想隐藏它们。 在这种情况下,你可以从人数到最后一张。

 Dim ws As Excel.Worksheet Dim iIndex as Integer if Range("propcount") > 0 then For iIndex = 14 + Range("propcount") To ActiveWorkbook.Worksheets.count Set ws = Worksheets(iIndex) ws.Visible = xlVeryHidden Next iIndex End if 

如果工作表不总是处于可靠状态,则可能要同时使用显示和隐藏。

 Dim ws As Excel.Worksheet Dim iIndex as Integer if Range("propcount") > 0 then For iIndex = 14 To 14 + Range("propcount") Set ws = Worksheets(iIndex) ws.Visible = true Next iIndex For iIndex = 14 + Range("propcount") To ActiveWorkbook.Worksheets.count Set ws = Worksheets(iIndex) ws.Visible = xlVeryHidden Next iIndex End if 

例如

 Sub SetVis(propCount As Long) Dim arr, i As Long arr = Array(Sheet14, Sheet15, Sheet16, Sheet17, Sheet18, Sheet19, _ Sheet20, Sheet21, Sheet22, Sheet23, Sheet24, Sheet25, _ Sheet26, Sheet27, Sheet29) 'assuming lbound=0 (ie, not using Option Base 1) For i = LBound(arr) To UBound(arr) arr(i).Visible = IIf(i < propCount, True, xlVeryHidden) Next i End Sub 

呼叫:

 Private Sub Worksheet_Calculate() SetVis clng(Me.Range("propcount").Value End Sub 

应该添加一些检查单元格值等

您可能想要在数组中定义图纸名称。 您甚至可以将configuration存储在文本或ini文件中,并在函数开始时读取它。

例如:

 Dim a(15) As String ... a(3) = "/14/15/16/" ' Just store the sheet numbers that need to be visible a(4) = "/14/15/16/17/" ' Delimit them with any character you like ... 

这给了你很大的灵活性。 您不必依赖您的表格顺序,因为正如您在Sheet28发现的Sheet28 ,保持顺序并不总是那么容易。

然后,根据您的propcount值获取适当的string:

 Dim strSheetList As String strSheetList = a(Range("propcount")) 

最后,迭代所有表单并检查每个表单以查看是否需要显示:

 Dim sh As Worksheet, strSheetNum As String For Each sh In Worksheets strSheetNum = Mid$(sh.CodeName, 6) If InStr(strSheetList, "/" & strSheetNum & "/") Then sh.Visible = True Else sh.Visible = xlVeryHidden End If Next 

你也可以这样做:

 Sheets14.Visible = IIf(propcount > 0, True, xlVeryHidden) ... 

顺便说一句,减less这个任务的代码行将不会优化性能恕我直言。 问题可能是您正在On Calculate事件On Calculate运行此代码