エクセルマクロ(その2)セルの選択方法

エクセルVBAは、単なるプログラムではなくて、エクセルと密接に関連したプログラムになっています。

その中でも最もよく使われるのが「セルの選択」というコマンドです。

今回は、この「セルの選択」に焦点を当てて、マクロプログラムを説明していきたいと思います。

なお、この記事は前回の記事の続きとして書いていますので、前回の記事を読みたい場合は、以下のリンクをクリックしてください。

★前回の記事
エクセルマクロ(その1)VBEの使い方を知ろう

 

1.マクロのエラー表示について

一応、前回の補足として、マクロのエラーのことを書いておきます。

記述したプログラムにエラーがある場合は、マクロを実行した時にエラー画面が出てくることがあります。

エクセル マクロ エラー画面

このようなエラー画面がでた場合、「終了」ボタンを押すと、マクロを強制的に終了することができます。

しかし、「終了」ボタンを押した場合、どこでエラーが発生したかを認識することができません。そこで、通常は「デバッグ」ボタンを押すようにしてください。

そうすると、エラーが起きている行が黄色く塗りつぶされて、エラーを見つけることができるようになります。

エクセル マクロ エラー解除

上記のように黄色に塗りつぶされた行にエラーの原因があります。

この場合、エラーを修正する場合は、上記の図の赤い丸で囲まれた四角のボタンを押して、デバッグモードをリセットしてください。それから、エラーのある行を修正するようにしてください。

 

 

2.セルを選択する

エクセルでは、セルを選択してから、何かを実行するという手順になります。ですので、最初の覚えていただくのは、セルの選択の方法です。

標準モジュールを挿入してから、以下のプログラムを書いてみましょう。

Sub セルの選択1()
Range("C3").Select
End Sub

プログラムのコマンドは、小文字で書いても自動で文字の先頭が大文字になりますが、この場合の、C3のCは、小文字で書いても大文字にはなりません。セル番地を書く時は、大文字で書くようにしてください。

ここで出てくるRangeというものは、「セル範囲」という意味だと思ってください。
このプログラムを実行すると、C3のセルが選択されます。

次に、複数のセル範囲を選択してみましょう。

Sub セルの選択2()
Range("C3:E8").Select
End Sub

このプログラムを実行すると、C3からE8までのセルの範囲が選択状態となります。
つまり、Rangeを用いると、複数のセル範囲を一度に選択できるようになります。

このRangeとは別に、セルを選択する方法にはもう1つあります。

Sub セルの選択3()
Cells(2,3).Select
End Sub

このCellsを用いると1つのセルを数字を使って選択することが可能になります。
Cells([行の値],[列の値])
というように書きます。

Cells(2,3)のセルは、2行目の3列目のセルとなって、C2のセルが選択されます。

このCellsを使うと、数字でセルを指定できるので、プログラムの応用性が上がって、複雑なプログラムを書くことができるようになります。

ただし、CellsはRangeと違って、複数のセルの範囲を選択することができません。
1つのセルだけの選択の時のみと考えてください。

一方、複数のセル範囲を選択するときに、RangeとCellsを一緒に使って選択する方法があります。

Sub セルの選択4()
Range(Cells(2, 3), Cells(4, 6)).Select
End Sub

この方法では、Rangeの中にCellsを2つ入れることで、セルの範囲を指定しています。応用的な使い方ですが、数字を使ってセル範囲を選択できる方法として覚えておいてください。

それと、注意点ですが、Selectというコマンドは、「選択する」という意味なんですが、基本的にマウスでクリックするとか、マウスで範囲を選択するという意味だと解釈してください。

たとえば、別のシートの範囲を選択するためには、シートを切り替えてから、セルを選択するという順番になります。いきなり別のシートの範囲をマウスで選択することができないように、RangeやCellsを使ってSelectする場合は今表示されているシートの中でしか有効になりません。

 

 

3.シートを移動する

それでは、シートを切り替える時はどうすればいいのでしょうか。
実は、これもSelectを使うことで切替が可能になります。

新しいシートを何個か作成してから、「Sheet1」を表示させた状態で、以下のマクロを実行してみましょう。

Sub シートの切替1()
Worksheets("Sheet2").Select
end Sub

このマクロを実行すると、シートは「Sheet2」に切り替わります。

この「Worksheets」というのは、Worksheetクラスというのがあって、たくさんあるシートのことを指していると考えてください。その中の「Sheet2」を指定して選択しますよという意味なんです。

この「Worksheets」は、単に「Sheets」と書いても大丈夫です。

Sub シートの切替1()
Sheets("Sheet2").Select
End Sub

「Sheet2」という名前を「データ」という名前のシート名に変えた場合は、以下のようになります。

Sub シートの切替1()
Sheets("データ").Select
End Sub

さらに、シートを数字で指定する方法もあります。

Sub シートの切替2()
Sheets(2).select
End Sub

「Sheet(2)」というのは、左から数えて2番目のシートという意味です。

この場合、注意していただきたいのは、シートを非表示にしても、非表示にしたシートも含んで何番目のシートかを指定する必要があるということです。

なので、非表示にしたシートがあるような場合は、シート名で指定する方が安全だと思います。

 

 

4.シートを追加して名前を変更する

シートを追加して、シート名をマクロで変更することができます。

例えば、新しいシートを追加して、そのシートの名前を「データ」と設定するというマクロを考えてみましょう。

まずは、シートの追加ですが、とても簡単です。

Sub シートの追加1()
Sheets.Add
End Sub

もちろん、Worksheets.addでも大丈夫です。

この場合、現在選択されているシートの1つ前に新しいシートが生まれます。

次に、追加したシートのシート名をつけてみましょう。

Sub シートの追加2()
ActiveSheet.Name = "データ"
End Sub

ここで出てくる「ActiveSheet」というのは、現在表示されているシートという意味です。シートを追加すると、追加されたシートがその時点で表示されているので、その表示されているシートの名前が、「ActiveSheet.Name」となります。

ActiveSheet.Name = “データ”

この行にあるイコールという意味は、「等しい」という意味ではなくて、「代入する」という意味だと考えてください。右側のものを左側に代入するという意味です。

そこで、上記のマクロを合体させると、

Sub シートの追加3()
Sheets.Add
ActiveSheet.Name = "データ"
End Sub

となります。

ここで注意していただきたいのは、同じシート名を複数のシートにつけることができないということです。もし、マクロ上で別のシートに同一名を指定した場合は、エラーとなります。

また、シート名には以下のような制約があります。

・全角、半角文字に関わらず「最大31文字」
・シート名を空欄(0文字)で設定することはできない
・「:」、「\」、「/」、「?」、「*」、「[」、「]」は使用できません。
・シングルクォーテーション、円マークも使用できません。

次に、少し難しくなるのですが、シートの位置を指定してシートを追加する方法についても書いておきます。

Sub シートの追加4()
Sheets.Add before:=Sheets(1)
End Sub

これは、シートの先頭にシートを追加する方法です。

Sheets.Addの後ろに半角スペースを入れてから、「before:=Sheets(1)」と書きます。
ここで出てくる「:=」という表記は、エクセルマクロでよく出てくるのですが、条件を書くときに使われる記号だと考えてください。Sheet(1)は先頭のシートを指しますので、そのシートの前にという意味になります。

逆に、シートの最後にシートを追加する方法も覚えておきましょう。

Sub シートの追加5()
Sheets.Add after:=Sheets(Sheets.Count)
End Sub

ここで出てくるSheets.Countはよく使われるフレーズです。Sheets.Countで現在存在しているすべてのシートの数を意味しています。

Sheets(Sheets.count)で、最後のシートを意味しており、その後ろということで、「after:=」という書き方になります。

 

 

5.セル範囲を相対的に移動させる

RangeやCellsを使うと、絶対的な位置でセルを選択することができますが、現在選択されているセルを基準として、相対的にセルを移動する方法についても書いておきます。

以下のプロシージャを書いてみてください。

Sub セルの相対的移動()
Range("C3").Select
ActiveCell.Offset(2, 1).Activate
End Sub

このマクロは、まずC3のセルを選択して、それから、現在選択されているセル(ActiveCell)を基準として行方向で2つ、列方向で1つ移動したセルを選択するというプログラムになっています。

ここで、「ActiveCell」は現在選択されているセルを表しています。
「ActiveCell.Offset」というのは、「ActiveCellを基準として」という意味です。
Offset([行方向での移動個数],[列方向での移動個数])と考えてください。

なお、ActiveCellで指定できるのは、1つのセルだけです。
Activateも1つのセルに対して使われるコマンドです。

以下にOffsetの具体例を書いておきます。

Offset(0,0)・・・移動しない
Offset(1,0)・・・下に1つ移動
Offset(0,1)・・・右に1つ移動
Offset(1,1)・・・下に1つ、右に1つ移動
Offset(-1,0)・・・上に1つ移動
Offset(0,-0)・・・左に1つ移動
Offset(-1,-1)・・・上に1つ、左に1つ移動

イメージは、上の図のようになります。

さらに、選択された複数のセルの範囲を相対的に移動することもできます。

Sub セル範囲の相対的移動()
Range("C3:E5").Select
Selection.Offset(3, 3).Select
end sub

最初に、C3からE5のセル範囲を選択しています。
そのセル範囲のことは、次の行では「Selection」として扱います。
Selectionというのは、現在選択されている範囲という意味です。

このSelectionを基準として、Offsetで行で3つ、列で3つ移動を行っています。

エクセル マクロ Selection

このように、Offsetは、セル範囲に対しても移動を行うことができます。

ここで、出てきた「Activate」と「Select」の違いについてですが、Activateという場合は、1つのセルのみの選択になります。一方、「Select」は、1つ以上のセルを選択する場合に使用すると考えてください。

 

 

6.セルの選択範囲を変更する

現在選択されているセルを基準として、セルの選択範囲を変更するコマンドがあります。

Sub セルの選択範囲の変更()
Range("C3:D4").Select
Selection.Resize(3, 4).Select
End Sub

この場合のSelectionはC3~D4のセル範囲になります。
ここで使われている「Resize」はセル範囲を変更するという意味で、
Resize([行の個数],[列の個数])
という範囲に変更するという意味になります。

ここでの注意点は、
[行の個数]は1以上、[列の個数]も1以上の値を取るということです。
また、セル範囲の基準となるのは、一番左上のセルとなります。

イメージは以下のようになります。

エクセル マクロ Selection

この場合、resizeに指定する値は、行と列のセルの数であるということを覚えておいてください。

次に、上記の範囲が選択された状態で、ActiveCellの位置を変更するようにしてみましょう。

Sub アクティブセルの移動()
Range("C3:D4").Select
Selection.Resize(3, 4).Select
ActiveCell.Offset(2, 3).Activate
End Sub

このプログラムのポイントは、選択範囲をそのままにして、ActiveCellの位置だけを変更しているという点です。

Activateを使うことで、選択範囲の中でActiveCellの位置を変更することができます。

エクセル マクロ ActiveCell

実際には、このようなプログラムは稀だと思うのですが、セルを選択する場合のSelectとActivateの違いがよくわかる例として覚えていただくのがいいと思います。

 

 

7.シート全体のセルを選択する

シート全体の値を消去したい場合などに、シート全体を選択する必要があります。

この場合は、以下のようなマクロプログラムになります。

Sub シート全体を選択()
Cells.Select
End Sub

Cellsだけでシート全部のセルなので、覚えやすいと思います。

 

 

8.行や列を選択する

行全体、列全体を選択する場合について、いくつかの方法があります。

(1)3行目を選択する

Sub 行を選択1()
Rows(3).Select
End Sub

Rows(3)で3行目という意味です。

(2)3行目から5行目までを選択する

Sub 行を選択2()
Range("3:5").Select
End Sub

Rangeを使って、行3~5を選択しています。

(3)3行目から5行目までを選択する(その2)

Sub 行を選択3()
Range(Rows(3), Rows(5)).Select
End Sub

Rangeの中に、Rowsで指定して選択するやり方です。

(4)C列を選択する

Sub 列を選択1()
Range("C:C").Select
End Sub

C列だけを選択する場合は、Range(“C:C”)とします。

(5)C列を選択する(その2)

Sub 列を選択2()
Columns(3).Select
End Sub

Columnsを使うと、数字で列を選択できます。Columns(3)はC列になります。

(6)C列からE列までを選択する

Sub 列を選択3()
Range("C:E").Select
End Sub

Rangeで列番号の範囲を指定する方法です。

(7)C列からE列までを選択する(その2)

Sub 列を選択4()
Range(Columns(3), Columns(5)).Select
End Sub

Rangeの中にColumnsを使って指定する方法です。

(8)セルを基準にして2行目を選択する

Sub セル基準選択1()
Range("B2").EntireRow.Select
End Sub

1つのセルが属している行を指定する方法です。

1つのセルだけでなく、Rangeで複数のセルの範囲を指定することもできます。
Range(“B2:B4”).EntireRow.Select
と書くと2~4行をまとめて選択できます。

(9)セルを基準にして2列目を選択する

Sub セル基準選択2()
Range("B2").EntireColumn.Select
End Sub

1つのセルが属している列を指定する方法です。

1つのセルだけでなく、Rangeで複数のセルの範囲を指定することもできます。
Range(“B2:D2”).EntireColumn.Select
と書くとB~D列をまとめて選択できます。

 

 

9.まとめ

今回は、セルを様々な方法で選択する方法について書いてみました。
SelectやActivateの違いについても理解しておいてください。

エクセルの場合、分類すると
・ブック
・シート
・行
・列
・セル
という構造になっています。

これらの階層構造をどのように指定して選択していくかということが、プログラムを作る上で大切になります。

セルの指定は、RangeとCellsの2つの方法があります。
行の場合は、RangeとRows、列の場合は、RangeとColumnsとなります。
シートは、Worksheets(シート名)、もしくはWorksheets(番号)で指定します。
「Worksheets」は、「Sheets」と書いても同じことになります。

次回以降で、ブックについても選択の方法を学んでいきます。