タケモ塾

  • 2022.10.07
  • VBA

【VBA】Excelのシート操作は、Object名で制御しよう!

ExcelVBAシート操作の基本

プログラム開発において、コーディング記述(Step数)の多さは、「可読性の低下」を招きます。
それは「メンテナンス性の低下」に直結するため、セルネッツでは、シンプル設計を推奨しています。

この記事では、VBAによるExcelシート操作でありがちな、シート制御のシンプル記述について紹介たします。今日から利用できるので、是非、お試しください!

シート名は変更される!!

VBAの開発経験がある方であれば、シートの操作は必ず行ったことがあると思います。
その際、以下のような構文で記載していませんか?

ThisWorkbook.Worksheets(“Sheet1”).Range(“A1”) = “値をセット”

または、以下のように一度、変数にセットして処理を行っているという方もいるかと思います。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(“Sheet1”)
ws.Range(“A1”) = “値をセット”

いずれも「シート名」を元に処理を行っており、シート名が変更されたらエラーが発生し、処理が行えなくなります。

開発者自身もそのことに気付いているため「ブック保護」よりシートの名前を変更できなくする場合がありますが、不要な制限のあるツールは使いにくいですよね。

また、「シート名を変更しないでください」と伝えて回避するという方法もありますが、いずれにせよちょっとした修正で動かなくなるというのは使いやすいツールといえません。

シートのオブジェクト名とは?

1ブックの中に「11」「12」「13」という名称でシートを配置しました。VisualBasicからオブジェクトを見てみましょう。

「11」シートがVisualBasicでは「Sheet1(11)」と表示されています。

これは「オブジェクト名」と「シート名」を表しており、VisualBasicは「11」というシートではなく「Sheet1」として判断しています。だんだん混乱してきますね。

CellnetsVBA1

どういうことなのか検証するために、実際に「Sheet1」に対して処理を行ってみましょう。

「Sheet1」に対して直接処理を記述し、実行してみましょう。ブックを確認すると「11」シートに値がセットされています。

CellnetsVBA2

実行した結果より、直接シートオブジェクトに対して処理を指定できるということがわかります。

ただ、このままでは「結局Sheet1とは?」と混乱のもととなるため、わかりやすい名称を設定してみましょう。

シートにオブジェクト名を設定しよう!

モジュール名同様「プロパティ」の(オブジェクト名)からシートのオブジェクト名を設定します。

ここでは例として「O_11」(11シート)、「O_12」(12シート)、「O_13」(13シート)と設定します。

オブジェクト名を設定する前は「11」シート、「13」シート、「12」シートの順で表示されていましたが、設定後は「11」シート、「12」シート、「13」シートの順番で表示されています。

このように、オブジェクト名を設定するとVisualBasic上から意図した並び順でシートを参照することができます。

CellnetsVBA3

なお、オブジェクト名を変更したことはコードに自動反映されませんので「Sheet1」としていた部分は「O_11」に修正しましょう。

CellnetsVBA4

シート名が変更されても大丈夫

このように「オブジェクト名」を設定し、プログラムも「オブジェクト名」でシートを扱うようにすると、シート名がどのように変更されてもプログラムに影響はありません。

実際に変更した際のサンプルを元に確認してみましょう。

()で表示された部分(シート名)は変わりますが、オブジェクト名は変わっていません。コードに影響なくシート名を変更することができるということです。

CellnetsVBA5

まとめ

シートに「オブジェクト名」を設定することで「シート名を変更されてもコードに影響しない」つくりにできるということがわかりました。また、それだけでなく「意図した順序でシートを並べることができる」という利点もあります。

本紹介の中ではお伝えできていませんが、「可読性を上げる」というポイントもありますので、ぜひお試しください。