Reputation: 321
quick question for learning purposes. The code I have below works fine, except I'm pretty sure it's one of a couple reasons my Workbook is starting to slow down.
Basically, a formula is set up on the defined range cell "propcount" that returns a number. I want to display specific sheets based on this number, but my code below is extremely redundant. Can someone help me fix? Also please note the Sheet #s are not necessarily in order. Currently, it affects Sheets 14 through 29 but it skips 28; in the future it could become increasingly less organized.
Any ideas?
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
Upvotes: 1
Views: 206
Reputation: 976
You can also do this:
Sheets14.Visible = IIf(propcount > 0, True, xlVeryHidden)
...
Btw, reducing the lines of code for this task will not optimize performance IMHO. The problem might be that you are running this code on the event On Calculate
Upvotes: 1
Reputation: 6761
Loop through the sheets setting them. Loop from the first sheet to the propcount making them visible. Something like this.
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
Or maybe you want to hide them. In that case you could go from the propcount to the last sheet.
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
If the sheets aren't always in a reliable state you may want to use both showing and hiding.
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
Upvotes: 1
Reputation: 16311
You may want to define the sheet names in an array. You could even store the configuration in a text or ini
file and read it at the start of your function.
For example:
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
...
This gives you a lot of flexibility. You don't have to rely on your sheet names being sequential because, as you found with Sheet28
, it's not always easy to keep things in order.
Then, just fetch the proper string based on your propcount
value:
Dim strSheetList As String
strSheetList = a(Range("propcount"))
Finally, iterate all your sheets and check each one to see if it needs to be shown:
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
Upvotes: 1
Reputation: 166306
E.g.
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
Call as:
Private Sub Worksheet_Calculate()
SetVis clng(Me.Range("propcount").Value
End Sub
Should add some checks on the cell value etc.
Upvotes: 2