セル範囲を配列として取得して、使うにはどうするか 101回

セル範囲を配列として取得して、使うにはどうするか

マクロ講座 動画編 101回
マクロ講座

動画でExcel セル範囲を配列として取得して、使うにはどうするか

セル範囲を配列として取得して、使うにはどうするか

動画版「マクロ講座」の解説記事です。
配列を1つずつ手作業で指定するのは面倒です。
もし既に表があるのであればそれを、配列として取得するという方法が考えられます。
今回はすでにある表形式のデータを入れとして取り込む方法そしてそれを活用する方法を紹介します。
(サンプルファイルは、こちらです。 セル範囲を配列として取得して、使うにはどうするか、サンプル101回

マクロ動画 セル範囲を配列として取得して、使うにはどうするか

中級以外の人にもわかるように丁寧に解説しています。

シートの表を配列として利用する

  1. セル範囲A1からB10を指定する方法は複数あります。
    範囲指定方法: A1:B10、左上セルと右下セルの指定
    A1.CurrentRegion、ActiveSheet.UsedRangeなどです。

    シートのセル範囲を配列として取得する、タイトル01
  2. 今回はA1.CurrentRegionを使用して範囲を指定します。
    表には、支店名と店長名が記載されていて、支店名でブックを作成して、シート名には支店名、セルのA1には支店名、B1には店長名を記入するというマクロを作成します。

    シートのセル範囲を配列として取得する、タイトル02
  3. コードを書いていきましょう。Alt + F11でVisual Basic Editorを開きます。変数の宣言: branchArrは支店の配列を表すVariant型の変数です。

    シートのセル範囲を配列として取得する、タイトル03
  4. 配列は後で代入するため、最初は変数名のみ指定します。"Variant"を使用することで、変数に後で配列を格納できます。

    シートのセル範囲を配列として取得する、タイトル04
  5. シート名とオブジェクト名を"shlist"に変更しています。

    シートのセル範囲を配列として取得する、タイトル05

配列からデータをFor文を使って取得する

  1. Sheets("shlist")のオブジェクト名をshlistに変更してあるので、変数として宣言しなくても、Excelが理解してくれるので、このような記述のしかたができます。

    シートのセル範囲を配列として取得する、タイトル06
  2. shlistのA1.CurrentRegionを取得してbranchArrに代入します。これでセル範囲から配列を取得できました。

    シートのセル範囲を配列として取得する、タイトル07
  3. "r"をLong型の変数として宣言します。ループ変数"r"を使用して指定された名前を繰り返し処理します。

    シートのセル範囲を配列として取得する、タイトル08
  4. 2から10までの範囲をループ処理します(1は見出し行なので除く)。

    シートのセル範囲を配列として取得する、タイトル09
  5. newbookを設定します。そのあと、For文を利用して、シートを追加するループ処理をするわけです。

    シートのセル範囲を配列として取得する、タイトル10

配列からデータを取得する

  1. 新規シートを追加したら、そのシートに名前をつけてやります。このとき取得済みの配列を利用します。

    シートのセル範囲を配列として取得する、タイトル01
  2. シートの名前をbranchArr(r, 1)(支店名)で設定します。また、シートのセルA1に支店名ranchArr(r, 1)を入力します。セルB1にマネージャー名(branchArr(r, 2))を入力します。


    シートのセル範囲を配列として取得する、タイトル01
  3. この例により、シートに記入されたデータが、そもそも指定してやれば配列なのだということがおわかりいただけると思います。

    シートのセル範囲を配列として取得する、タイトル02
  4. 実行すると、新規ブックが作成され、支店名ごとのシートが作成されています。またシートのシートのセルA1に支店名、セルB1に店長名が入力されています。

    シートのセル範囲を配列として取得する、タイトル03
  5. Sub getrange_addsheet()
        Dim branchArr As Variant
        branchArr = shlist.Range("A1").CurrentRegion
        Dim r As Long, newbook As Workbook, newsh As Worksheet
        Set newbook = Workbooks.Add
        For r = 2 To 10
            Set newsh = newbook.Worksheets.Add
            newsh.Name = branchArr(r, 1)
            newsh.Range("A1").Value = branchArr(r, 1)
            newsh.Range("B1").Value = branchArr(r, 2)
        Next r
    End Sub
    

シートのオブジェクト名を変更しているのはなぜか。その利点は?

  • 名前の意味を明確にする: "shlist"という名前は、シートが支店リストを表していることを明示しています。そのため、コードを読む他の人や自分自身が後で見返した時に、シートの目的や役割がすぐに理解できます。
  • コードの可読性を向上させる: "shlist"という具体的な名前は、コード内でシートに関連する処理を行う際に直感的に理解できます。シートを追加、編集、削除する場合に、オブジェクト名が明確であれば、コードの意図が明確になり、他の人がコードを理解しやすくなります。
  • コードの保守性を向上させる: オブジェクト名を適切に設定することにより、将来的な変更や修正が容易になります。例えば、シートのオブジェクト名を変更する必要がある場合でも、"shlist"という名前はシートの機能を表しているため、関連するコードを探しやすくなります。
  • オブジェクト名=コード名が、上記サンプルでは"shlist"なので、変数の宣言やセットをせずに直接コードに記載できるという利点があります。