2016-10-19 15 views
0

セル値(1〜10)に基づいていくつかの行を表示/非表示にするセクションがあるシートで作業しています。現時点では、いくつかのネストされたif文があります。これは私のワークブックを痛々しくゆっくりさせました。このコードを縮小する方法はありますか?ありがとう。セル値に基づいて行を非表示にするVBAマクロ

If Range("B87").Value = 10 Then 
     Rows("88:98").EntireRow.Hidden = False 
    Else 
    If Range("B87").Value = 9 Then 
     Rows("98").EntireRow.Hidden = True 
     Rows("88:97").EntireRow.Hidden = False 
    Else 
    If Range("B87").Value = 8 Then 
     Rows("97:98").EntireRow.Hidden = True 
     Rows("88:96").EntireRow.Hidden = False 
    Else 
    If Range("B87").Value = 7 Then 
     Rows("96:98").EntireRow.Hidden = True 
     Rows("88:95").EntireRow.Hidden = False 
    Else 
    If Range("B87").Value = 6 Then 
     Rows("95:98").EntireRow.Hidden = True 
     Rows("88:94").EntireRow.Hidden = False 
    Else 
    If Range("B87").Value = 5 Then 
     Rows("94:98").EntireRow.Hidden = True 
     Rows("88:93").EntireRow.Hidden = False 
    Else 
    If Range("B87").Value = 4 Then 
     Rows("93:98").EntireRow.Hidden = True 
     Rows("88:92").EntireRow.Hidden = False 
    Else 
    If Range("B87").Value = 3 Then 
     Rows("92:98").EntireRow.Hidden = True 
     Rows("88:91").EntireRow.Hidden = False 
    Else 
    If Range("B87").Value = 2 Then 
     Rows("91:98").EntireRow.Hidden = True 
     Rows("88:90").EntireRow.Hidden = False 
    Else 
    If Range("B87").Value = 1 Then 
     Rows("90:98").EntireRow.Hidden = True 
     Rows("88:89").EntireRow.Hidden = False 
    Else 
    If Range("B87").Value = 0 Then 
     Rows("88:98").EntireRow.Hidden = True 
    End If 
    End If 
    End If 
    End If 
    End If 
    End If 
    End If 
    End If 
    End If 
    End If 
    End If 
+2

Select Caseを使用することはオプションであるか、またはこれらをElseIFに調整するだけで、下部に余分なEnd IFがすべて失われる可能性があります。 – Rdster

+0

ありがとうございます。コードが機能するので、私はcodereviewセクションでも調べます。ワークブックのスピードアップを考えているだけです。 – zanzibar

答えて

1

。私は見てコードを短くするより算術的にしようとしました。これが動作するかどうかを参照してください:Rowsや「EntireColumn when using Columns`を使用した場合

Sub t() 
Dim myVal As String 
Dim mainRow As Long, tweakRow As Long 
Dim hideRange As Range, showRange As Range 
Dim row1 As Long, row2 As Long 

mainRow = 98 
myVal = Range("B87").Value 

If myVal = 10 Then 
    Rows(mainRow - 10 & ":" & mainRow - 10 + myVal).EntireRow.Hidden = False 
ElseIf myVal >= 1 And myVal <= 9 Then 
    tweakRow = mainRow - 10 
    row1 = (mainRow - (9 - myVal)) 
    row2 = (mainRow - (10 - myVal)) 
    Set hideRange = Rows(row1 & ":" & mainRow).EntireRow 
    Set showRange = Rows(tweakRow & ":" & row2).EntireRow 

    Debug.Print "For a value of " & myVal & ", we will hide range: " & hideRange.Address & ", and show range: " & showRange.Address 

    hideRange.Hidden = True 
    showRange.Hidden = False 
ElseIf myVal = 0 Then 
    Rows(mainRow - 10 & ":" & mainRow).EntireRow.Hidden = True 
End If 

End Sub 
+0

はい - ありがとう!これはうまくいき、現在はワークブック全体で実装しています。 – zanzibar

+0

これを適用したい場所が複数ある場合は、このSubをワークシートの変更と呼びます。ありがとう。 – zanzibar

+0

@ザンジバルなぜワークシートの変更イベントですか?これを複数の範囲に渡って実行したい場合は、それらを最初にサブに渡すことができます。 – BruceWayne

1

ケースステートメントを試すことがあります。

ああ、または少なくともEndIfステートメントの量を減らすElseIfオプションを使用することもできます。 。

私はケースのコードは次のようなものに見えると思う:

選択範囲(「B87」)の値を

Case "1" 

Case "2" 

... 

エンドを選択あなたは基本的に同じコードの全体の多くを持っている

1

あなたはEntireRowを使用する必要はありません。

Rows("88:98").Hidden = True 

If Range("B87").Value > 0 Then 
    Rows(88).Resize(1 + Range("B87").Value).Hidden = False 
End If 
関連する問題