シート一覧を取得してシート間の移動を便利にするExcelVBAコード

スポンサーリンク

シート一覧の取得と絞り込み、並び替えができると便利

以前知り合いにExcelVBAで動作するツールを作って渡した際に、使用するシートの数が多く、シート一覧の情報を簡単に取得して並べ替えたり、絞り込んだりしたいと要望をもらったことがあります。

シートの絞り込みや並べ替えについてはExcel標準の機能では存在しないはずなので、きちんとした形で用意できれば色々便利に使えると思って作成してみました。

シート一覧の取得と絞り込み、並べ替えで想定している機能について

今回用意するExcelマクロファイルに搭載予定の機能は下記の4つです。

  • ①シート名一覧を取得する機能
  • ②ハイパーリンクでシートを移動する機能
  • ③シート名で表示するシートを絞り込む機能(こちら参照)
  • ④シートの並べ替えを行う機能(こちら参照)
  • 今回はこのうち、①シート名一覧を取得する機能、②ハイパーリンクでシートを移動する機能の2つを行うExcelVBAコードを紹介します。

    スポンサーリンク

    今回用意したExcelのワークシートについて

    今回私が作成したマクロファイルのシート一覧取得、絞り込み、並べ替え用のシートは下記のようなものを想定しています。

    129-1

    「シートの一覧取得」ボタンをクリックするとA4セルから下に向かってシート名の一覧が表示されます。
    各シート名のセルにはそのシートへのリンクが貼られており、すぐに目的のシートを表示することが可能です。

    その他表示するシートの絞り込みシートの並べ替えについてはそれぞれリンク先をご参照ください。

    Excelのシート名一覧を取得し、ハイパーリンクを設定するExcelVBAコード

    シート名一覧を取得して、ハイパーリンクを設定するExcelVBAコードは下記の通りです。

    Sub シート名抽出()

    Dim i As Long, x As Long, y As Long

    ’シート名一覧の開始位置をxとする
    For i = 1 To Cells(1000000, 1).End(xlUp).Row
    If Cells(i, 1) = “シート名” Then
    x = i
    Exit For
    End If
    Next i

    ’シート名一覧の開始位置が取得できなければ終了
    If x = 0 Then Exit Sub

    ’すでにオートフィルターが設定されていれば解除しておく
    If ActiveSheet.AutoFilterMode = True Then
    Cells(x, 1).AutoFilter
    End If

    ’抽出用シートのシート番号をyとする
    For i = 1 To Worksheets.Count
    If Sheets(i).Name = ActiveSheet.Name Then
    y = i
    Exit For
    End If
    Next i

    ’検索用シートの次のシートからを抽出対象としてハイパーリンクを設定する
    For i = y + 1 To Worksheets.Count
    With ActiveSheet.Hyperlinks
    ’対象となるセルの行は「i – y + x 」となる
    ’この行をVBEにコピーする際はアポストロフィが全角になるので修正してください。
    .Add Anchor:=Cells(i - y + x, 1), Address:=””, SubAddress:=”’” & Sheets(i).Name & “’!A1”, TextToDisplay:=Sheets(i).Name
    End With
    Next

    End Sub

    シート名の一覧表を作る開始位置や一覧表取得用のシートの位置を可変にするために少しサンプルコードが複雑ですが、固定にして変数「x」「y」を数字にしてしまうともっと楽にコードが書けると思います。

    「Cells(i – y + x, 1)」の意味を解説すると下記の通りです。
    シート番号は「y + 1」から開始、セルの行は「x + 1」から開始されるため、シートのインデックス番号が「i」の時、セルの行は「i – (y + 1) + (x + 1)」となり、()を外して
    「i – y – x」で表すことができます。

    この辺りは算数とか数学の考え方です。
    久しぶりすぎて私も理解するのに少し時間がかかります。

    また移動先の各シートから元の一覧表取得用のシートに戻るためのコードを用意しておいた方がより便利だと思います。
    ショートカットまたはボタンなどで下記のExcelVBAを実行できるようにしておくとより使いやすくなります。

    Sub 検索シートに戻る()

    Dim x As Long
    For i = 1 To Worksheets.Count
    If InStr(Sheets(i).Name, “検索”) <> 0 Then
    x = i
    Exit For
    End If
    Next i
    Sheets(x).Select

    End Sub

    こちらは説明不要かもしれませんが、シートを左から順に確認し、「検索」という文字がシート名に含まれている最初のシートに移動するExcelVBAコードになります。

    コメント