1

現在、約を表示するExcel/VBAワークブックに取り組んでいます。予算内の 500 アイテム、それぞれ別の行。ユーザーに予算の詳細レベルを選択してもらいたい: 最高レベルでは個々のアイテムが表示され、詳細レベルではいくつかのアイテムが 1 つのヘッダーの下にグループ化されます。

以下に概説する方法 (行ごとに非表示/非表示にする) は非常に遅く、ほとんどのアイテムを非表示/非表示にするには約 4 分かかります。プログラムを高速化するためのヒントがあれば幸いです。

ダイアログ ボックスで詳細レベルを選択すると、プログラムは次の手順を実行します。

1) 更新画面がオフに設定されている:

        Application.ScreenUpdating = False
        Application.EnableEvents = False

2) 予算内の項目ごとに、その行を非表示にするかどうかが決定されます。これに使用しているコードは次のとおりです。

    with sheets("[name sheet here]")
         .Range("[identifier of budget line item here]").EntireRow.Hidden = False / True
         ...             
         [500 times]
         ...
    end with

3) 第 2 に、詳細レベルに応じて、サブヘッダーに対応するテキストが白または黒になります。これは、約 20 行に対して行われます。

    With Sheets("[name sheet here]").Range("[identifier of budget line item here]").Font
         .ThemeColor = xlThemeColorLight1
         .TintAndShade = 0
    End With

4) 最後に、詳細レベルに応じて、一部の行を非表示にすると見えなくなる線が再び描画されます。これは、さまざまな範囲で 10 回ほど実行されます。

    Range("[range here]").Select
        Selection.Borders(xlDiagonalDown).LineStyle = xlNone
        Selection.Borders(xlDiagonalUp).LineStyle = xlNone
        Selection.Borders(xlEdgeLeft).LineStyle = xlNone
        Selection.Borders(xlEdgeTop).LineStyle = xlNone
        With Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .ColorIndex = 0
            .TintAndShade = 0
            .Weight = xlThin
    End With
4

2 に答える 2

5

いくつかの一般的な考え。

  1. ユーザーが指定した詳細レベルをフィルタリングの基準として使用して、データ範囲にオートフィルターを適用します。結果をオートフィルターのように見せたくない場合は、各列の上部にあるドロップダウン矢印をプログラムで非表示にすることができます。この方法については、こちらで説明しています。

  2. ユーザーにオートフィルターを表示したくない場合でも、それを使用してフィルター処理を行うことができます。手順は次のとおりです。非表示にしたくない行を除外する (表示しない) には、オートフィルターを使用します。フィルタリングされた行を範囲変数に割り当てます。フィルターを取り外します。範囲変数で識別された行をまとめて非表示にします。この手法の実際の例については、この SO 投稿を参照してください。

  3. Union 関数を使用してリストをループし、非表示にするすべての行を 1 つの範囲オブジェクトに集めてから、範囲内の行に対して IsHidden プロパティを True に設定して行を非表示にします (HideRange.EntireRow.IsHidden = True)。(アプローチの例については、こちらを参照してください。その場合、選択した行を削除するために使用されます。)

これらの手法はいずれも、rowsl を非表示にするのに 4 分もかかりません。

于 2013-08-10T13:09:30.163 に答える
0

一度に 1 行ずつではなく、より広い範囲の行を非表示にしないのはなぜですか? お気に入り

Sub HideRows()
    ActiveSheet.Range(Cells(1, 1), Cells(500, 1)).EntireRow.Hidden = True
End Sub
Sub UnHideRows()
    ActiveSheet.Range(Cells(1, 1), Cells(500, 1)).EntireRow.Hidden = False
End Sub
于 2013-08-10T09:01:34.993 に答える