初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

初心者のためのExcel(エクセル)マクロVBA入門-プログラミングの基礎12~オブジェクトその4

オブジェクトを指定してみよう。

ここまで、読んでいただいてありがとうございます。オブジェクトの概念はとても大事です。これだけわかればほとんどExcelマクロはマスターしたも同然なのでしっかり理解してほしいです。

では、いよいよ実際にオブジェクトを操作してExcelマクロを作りましょう。オブジェクトの指定の仕方や、操作する感覚をつかんでもらいたいと思います。だいぶ前に見た「Visual Basic Editor」略してVBEを見てます。VisualBasicツールバーのVBEアイコンをクリックしてください。2007以降で開発タブが出てない人は開発タブを表示させてください。

f:id:drumer2sh:20130807144919p:plain

どんどん、具体的にいきますね。図の左側の部分を「プロジェクトエクスプローラ」という名前が付いています。さらにその下を「プロパティウィンドウ」と呼びます。VBEのメニューの[表示]からこのプロジェクトエクスプローラを表示させたり消したりできます。デフォルト(初期段階)では表示されています。

VBE(Visual Basic Editor)では1つのエクセルファイルを「プロジェクト」として管理しています。他のExcelファイルを開くとプロジェクトが1つ増えます。そして、このプロジェクトがオブジェクトの一番根っこ(これをルートって呼びます)の部分です。このルートから階層が始まって、いろんなオブジェクトがくっついてます。見るとわかりますが・・・


f:id:drumer2sh:20130807144922p:plain

  • Sheet1(Sheet1)
  • Sheet2(Sheet2)
  • Sheet3(Sheet3)
  • ThisWorkBook

とか書いてありますよね?これこそまさに「オブジェクト」です。ルートを基本として今現時点でオブジェクトが4つくっついてると思ってください。くっついてるオブジェクトは現時点では2種類ですね。シートオブジェクトとWorkBookオブジェクトです。アイコンが2種類なのでわかると思います。

さて、VBEではほかにもとても便利なものがあります。それが「プロパティウィンドウ」です。これを使うとあるオブジェクトに属するプロパティの一覧と現在の値を見ることができ、さらに変更することも可能です。さっそく表示してみましょう!(すでに表示されているかもですが念のため)VBEのメニューの[表示]からプロパティウィンドウを選択してください。プロパティウィンドウが表示されます。

では早速見てみましょう。プロジェクトウィンドウのSheet2を選択してください。
プロパティウィンドウにSheet2のプロパティが表示されましたでしょうか?

見てみると・・・

f:id:drumer2sh:20130807144923p:plain

  • (オブジェクト名)
  • DisyplayPageBreaks
  • DisplayRightToLeft
  • EnableAutoFilter
  • EnableCalculation
  • EnableFormatConditionsCalculation
  • EnableOutlining
  • EnablePivotTable
  • EnableSelection
  • Name
  • ScrollArea
  • StandardWidth
  • Visible

以上のようなプロパティがあるということですね。右側にそのプロパティの値が入っています。一番上の「オブジェクト名」はまさにこのオブジェクトの名前を表しています。デフォルトでのオブジェクト名は決まっています。オブジェクト名以外の部分がこのオブジェクト(図で言うとSheet2)のプロパティとなります。例えばNameプロパティにはShee21と入っているはずです。これはシートの名前を表すプロパティです。ためしにここの値を「サンプル2」と変更してみます。
すると・・・・

f:id:drumer2sh:20130807144926p:plain

シート名が「サンプル2」に変化しました!!これが、「オブジェクトのプロパティを変更する」という感覚です。今は直接プロパティウィンドウに設定しましたが、本来はプログラムでオブジェクトとプロパティを指定して、値を設定するわけです。となります。これが「オブジェクト」を動的に操作する感覚です。

さまざまなオブジェクトの指定方法

先ほどはプロパティウィンドウに直接設定しました。では直接プログラムに書いたらどうなるでしょう?VBEのプロジェクトエクスプローラでSheet2オブジェクトをダブルクリックします。すると・・・


f:id:drumer2sh:20130807144920p:plain


VBEの右側に白いウィンドウが出ます。このウィンドウを「コードウィンドウ」と呼びます。このコードウィンドウに以下のコードを実際に書いてみましょう。

Sub Sample1()
	
	Sheet2.Name = "サンプルシート2"

End Sub

さて、F5キーを押して実行しましょう。シート名が変わったことを確認できるでしょうか。これも「Sheet2の名前をサンプルシート2」に変更しただけです。「の」を「.」に「を」を「=」にするとそのままプログラムになります。今までは・・・

  • シート名を右クリックしてシート名の変更を選択またはシート名をダブルクリック
  • シート名を変更してリターン

していた作業をプログラムなら1秒かからず実行できます。

オブジェクトに名前を付けて、指定する

では、エクセルファイルが2つある場合を考えます。この場合だと、Sheetオブジェクトは全部で6つあるはずです。大本のプロジェクトが違いますが、VBE上には6つ並んでいるはずです。


f:id:drumer2sh:20130807144917p:plain

したがって、このままではSheet2と書いてもPCはわかりますが、人が分かりにくいということになります。(Sheet2は2つ存在しています)なぜSheet2でもPCは理解してくれるのか?についてはおいおい説明しますが、人がこれを見てもなかなか理解するのは難しいわけです。これを回避するためにもシートオブジェクトに固有の名前を付けて管理します。簡単です。先ほどのプロパティウィンドウの「オブジェクト名」という所の値を変更するだけです。では名前を「shtSample2」としてみましょう。

すると、プロジェクトエクスプローラにあった

Sheet2(Sheet2)

shtSample2(サンプル2)

となったはずです。(かっこの中はシート名を表しています。)これで、操作するシートを明確に分けることができました。このようにshtSample2としておけば、どのファイルを開いても

shtSample2.Range("A1").Value = "ほげほげ"

と書けば、今どのシートがアクティブになっていようが、どのブックが開かれていようが、関係なくきちんとshtSample2オブジェクトのシートのA1セルに値を出力することができるわけです。
上の例のプログラムを書き換えると・・・

Sub Sample1()
	
	shtSample2.Name = "サンプルシート2"

End Sub

となります。

オブジェクトを変数に入れて指定する

しかし、オブジェクトに名前を付けられない場合もきっと存在すると思います。そんな時はあらかじめシートオブジェクトを「変数」に入れることができます。先ほどのコードウィンドウに・・・

Sub Sample1()
	
	Dim worksheetObj As WorkSheet

	Set worksheetObj = Sheets("サンプルシート2")
	
	worksheetObj.Name = "サンプルシート2"

End Sub

とすることで、マクロ実行の間はworksheetObjをシートオブジェクトとして使えます。変数にはオブジェクトを入れることもできるのです。変数覚えてますか?上のコードでは

  • worksheetObjという名前でワークシートオブジェクトが入る変数を作る
  • 作ったworksheetObj変数にシート名が「サンプルシート2」であるシートオブジェクトを格納する
  • シートオブジェクトが入った変数を使って操作する

ということをしています。

変数を使うメリット

先ほど書いた、すべてのオブジェクトを指定したものには「変数」は使われていません。上のちょっと長い指定は変数を使うことで一気にすっきりできるんです!例で考えましょう。ファイルA、B、Cにはまったく同じシート名のシートがあります。
これを・・・・

' シートオブジェクトを入れる変数を宣言(作成)
Dim shtFileBSheet1 As WorkSheet

' 変数に実際のシートオブジェクトを入れる
Set shtFileBShee1 = Application.WorkBooks("ファイルB.xls").Sheets("Sheet1")

こうすれば、あとは

shtFileBSheet1.Range("A1").Value

だけで、オブジェクトの指定が可能です。これ以降、当然メソッドの実行もできますね。

shtFileBSheet1.Range("A1").Copy

と書いても、コンピュータはもともと、最初にファイルBのシート1のオブジェクトが入っている変数なので、ちゃんとわかっていますし、人も変数の名前にFileBSheet1と付けているのでこれはファイルBのSheet1のシートだということがわかります。

変数の接頭辞(プリフィクス)

余談ですが、この最初のshtを接頭辞と言って変数の名前を付ける時にはよく使います。これは何の種類の変数か?を表すものです。他にも

  • String型変数には「str」
  • Long型変数には「lng」
  • オブジェクト型には「obj」
  • Double型には「dbl」

などでこれは何型の変数なのかを変数名で判別できるようにしています。その後に変数名をわかりやすい名前にしています。今回であれば、シートオブジェクトが入ってるファイルBのSheet1のシートオブジェクトを入れるわけですから「shtFileBSheet1」となっているわけです。変数の名前をプログラミングではとても重要なので、きちんとつけられるようになってくださいね。

指定方法の一長一短

これでオブジェクトの指定には

  • 既存オブジェクト名を指定する
  • 独自のオブジェクト名を付けて指定する
  • 変数にオブジェクトを格納して指定する

を説明しましたが、1つ目の既存オブジェクト名を指定する方法はあまり良くありません。一言で言うとわかりにくいからです。できるだけ2番目、3番目の方法を使うようにしましょう。そしてシートオブジェクトに関してだけは、圧倒的に2番をお勧めします。理由はプロジェクトエクスプローラが表示されていれば常にオブジェクト名がわかるからです。それ以外はできるだけ変数にわかりやすい名前を付けて管理するようにしましょう。一気に具体的な感じになって難しいでしょうか?わからない場合はコメントください。


今日は長かった・・・汗


かしこ