[教えて!VBA] 第5回 ブックの最初のシートの最初のセルを選択した状態にするにはどうすればいいの??
概要
この記事について
かんたんな概要と結論
インデックスの最初の数をコレクションで指定することで最初のシートを参照できます。
非表示シートの存在には注意が必要です。
こんにちは、dedeです。
この記事では、
VBAマクロに関する質問のうち、
皆が疑問に思っているトピックについて解説いたします。
今回は、
ブックの最初のシートの最初のセルを選択した状態にする方法
を解説いたします。
※この記事は、Office VBAマクロのうち
Excel VBAマクロに関するトピックです。
レベル:初級者向け
やりたいこと
Excelで作業をしていると、
トピックごとに複数シートに分けて記載して内容を管理するというのは
よく行われるかと思われます。
シートを他の人に渡したりするときに、
ブックの最初のシートを選択した状態にしておきたい場合があるかと思います。
下の図では、マクロで「表紙」シートを開いた状態にする流れです。
この記事ではその処理の流れを説明します。
処理の流れ
処理の流れは、大きく分けて
- ブックの最初のシートを選択する処理
- シートの最初のセルを選択する処理 の順です。
ブックの最初のシートを選択する処理
シートを選択するためには、
シートが格納されているものの実態について理解するところから始まる必要があります。
※※ここでいう「シート」とはいわゆるワークシート(通常使うセルが敷き詰められたシート)で、
グラフシートやマクロシートと呼ばれるシートは含まれていないことを前提とします。
これらのシートはあまり使われないですしね。
Sheetsコレクションとは?
わたしたちが作成したシートは、
Sheetsコレクションという格納用変数に順次入れられていきます。
コレクションとは、
VBAにおけるオブジェクト(データとそれを操作する関数をまとめたもの)の一種で、
同じ構造のデータをまとめて格納するためのものです。
その点で、配列によく似ています。
ただし、データの入れ方や取り出し方法などの点で配列とは区別されます。
現在表示されているブックのSheetsコレクションを取得するには、
次のように書きます。
1Set mySheets = ActiveWorkbook.Worksheets
2Set mySheets = Worksheets '//省略も可
3
シートのインデックスとは?
シートのインデックスとは、
シートの並び順を規定するもので、
Sheetsコレクションで操作したいシートを参照する際に利用されます。
1my_number = ActiveSheet.Index '//現在表示しているシートのインデックス番号が格納されます
2name = Worksheets.Item(my_number).name '//現在表示しているシートを参照し、その名前を取得します。
3name = Worksheets(my_number).name '//Itemプロパティは省略可。省略すると、配列に似た参照方法となります。
インデックスは1から始まりシート数を最大上限とします。
10シート存在するブックなら、
最初のシートのインデックスは1、最後のシートのインデックスは10です。
インデックスの並びの決め方は、
UIで見たときの左から右のシートタブの並びと同じです。
例えば、下のようなブックであれば、
表紙シートのインデックスは1、年間推移シートは2、総括シートは3です。
選択方法
上記を踏まえ、
ブックの最初のシートを選択する処理のコードは次のようになります。
1Dim firstWorkSheet
2Set firstWorkSheet = Worksheets(1)
3firstWorkSheet.Select '//シートの選択
4
ただし非表示シートが有ると工夫が必要
今まで説明した方法は、
じつは非表示シートが存在すると使用できません。
理由は、非表示シートではSelectメソッドを実行するとエラーが起こるからです。
そのため、非表示ではないシートのうち
最も番号の若いものを選択するという工夫が必要となります。
1'可視シートのうち最も番号の若いものを選択
2For Each my_sheet In Worksheets
3 If my_sheet.Visible = True Then
4 my_sheet.Select
5 Exit For
6 End If
7Next
8
マクロを利用するブックが、
非表示シートを含んでいるかいないかについては
注意する必要があるでしょう。
シートの最初のセルを選択する処理
シートの最初のセルはA1セルです。
そのため、A1にカーソルを選択させれば目的達成されます。
1ActiveSheet.Range("A1").Select
最終的なコード
1Sub ブックの最初のシートの最初のセルを選択()
2 Dim firstWorkSheet
3 Set firstWorkSheet = Worksheets(1)
4 firstWorkSheet.Select '//シートの選択
5
6 firstWorkSheet.Range("A1").Select
7End Sub
8
デモ
次のように3シート存在するブックで、
三枚目の総括シートを表示中です。
VBAマクロを実行すると、
一枚目の表紙シートが開かれ、A1セルに照準が合わされた状態になります。
応用:すべてのシートの最初のセルを選択した状態にするマクロ
一枚目シートだけではなく、
すべてのシートのA1セルにカーソルが合った状態にするマクロは、
次のようになります。
1Sub すべてのシートの最初のセルを選択
2 '変数
3 Dim cntObj As Object 'ループカウンタ
4
5
6 'すべてのシートのカーソルを左上セル(A1セル)に合わせる
7 For Each cntObj In Worksheets
8 '非表示セルは飛ばす
9 If cntObj.Visible = True Then
10 cntObj.Select
11 cntObj.Range("A1").Select
12 End If
13 Next
14
15 '可視シートのうち最も番号の若いものを選択
16 For Each cntObj In Worksheets
17 If cntObj.Visible = True Then
18 cntObj.Select
19 Exit For
20 End If
21 Next
22
23End Sub
終わりに
このマクロを通して、
シートの取り扱い方、
VBAにおけるコレクションという存在と使用方法、
非表示シートの注意点について把握することができるでしょう。
これらの知識は他マクロにも応用できるでしょう。
関連記事
- [教えて!VBA] 第4回 シート上の図形をコピーして他のセル上に貼り付けするにはどうすればいいの??
- [Excel VBA] セルの文字色・背景色だけをコピーして貼り付けるマクロを作成しました
- [教えて!VBA] 第2回 一つのセルの値が「東京都」であることを条件として別のアクションを行うにはどうすればいいの??
- [Excel VBA] 年度に関わらず営業日数を算出する方法について紹介
- [Excel VBA] 結合セルにコピーペーストするマクロ