优化冗余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
运行此代码