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

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

初心者のためのExcel(エクセル)マクロVBA入門-ブックを開く:その1(Openメソッド)

f:id:drumer2sh:20130925133428j:plain

ファイルを開く要件は多い


とあるエクセルファイルから他のエクセルファイル(ブック)を開きたいなんてことありませんか?例えば、データ処理のエクセルファイルで処理したデータをエクセルで作ったテンプレートに自動的に入力して別名で保存してくれる・・・なんてことできたら素敵ですよね?帳票なんかも簡単にできちゃいます。その基本となるのがファイルを開くためのメソッドOpenメソッドです。プログラミング基礎でやりましたが、メソッドは「開く」とか「コピーする」とか主にアプリケーションの動作を担当しているものでしたね。

Openにも色々ある・・・


実は一言にファイルを開くと言っても、ブックなのか?ただのテキストファイルなのか?はたまた他の種類のファイルなのか?で使うOpenは異なります。

  • Workbooks.Openメソッド:ブックを開く
  • Openステートメント:ファイルを開く

です。今回はエクセルファイルを開くつまりブックを開くのでWorkbooks.Openメソッドについて説明します。正しくいうとWorkbooksコレクションのOpenメソッドです。コレクションについてはまたおいおい説明しますが、コレクションも要はオブジェクトです。(ニヤリ)

ブックを開く時ってどうしてる?


単純に考えると2つくらいありまして・・・

  • エクセルファイルをダブルクリックして開く
  • エクセルの[ファイル]メニューから開く

の2つです。この2つですが、やっぱりVBAで書くと違う書き方をします。前者はいきなりファイルを開くのでOpenメソッドを使いますし、後者は最初に開くファイルを選択するためのダイアログが開くのでGetOpenFilenameメソッドを使います。

はて?ダイアログ?


このブログではいきなり出しましたが、ダイアログとは一言で言えば小さなウィンドウで、一時的に開いてすぐに消えるようなものを言います。ファイルを開くときに出てくるファイルを選択するウィンドウとか、フォルダを選択するために出てくるウィンドウとかそういうヤツです。この際言葉として覚えておきましょう。この辺も「超初心者」にはわからないもんです。きっと。

Openメソッドの使い方。


すでに開くブックがこちらでわかっている場合にはこのメソッドがいいと思います。前置きが長くてすいません。とっととコードを書いていきましょう。次の例は「C:\Test.xls」ファイルを開きます。

Sub Sample()

    Workbooks.Open "C:\Test.xls"

End Sub

いじょ。簡単です。引数は1つなのでFilename:="C:\Test.xls"としても勿論親切な書き方でいいですが、これでも十分です。ファイルは当然「フルパス」を指定していますが、「相対パス」でも構いません。その場合はこのマクロファイルの場所を基準として相対パスを記述します。これで目的のファイルを開くことができました。

読み取り専用で開きたい!


簡単です。ちゃんと読み取り専用で開くための引数が用意されています。Openメソッド便利ですね。

Sub Sample()

    Workbooks.Open Filename:="C:\Test.xls", ReadOnly:=True

End Sub


これでOKです。引数が複数になるのでちゃんと「何が、どれ」とわかるように記述しましょう。何?パスワード保護されたファイルも自動で開きたい?大丈夫だぜ!ステファニー!ちゃんとPasswordっていう引数があるんだ!これを指定すればばっちりだ!

っというようにOpenメソッドには必要なものはちゃんとそろっているわけです。詳しくはヘルプをきちんと読んでみましょう。

開いたファイルをちゃんと操作したいんだけど・・・


さて、開いたファイルを操作したい場合はどうしたらいいでしょうか?今のままだと、WorkBooksコレクションオブジェクトからインデックスとかそのあたりを指定したり、Workbooks("Test.xls")なんてすればいいでしょうが、私の考えでは違います。

「ちゃんとオブジェクトを指定することができればマクロは簡単!」

というのをちゃんと伝えたいので、ちょっと違うことをします。

Openメソッドには戻り値がある!!


ちゃんとヘルプを読むとわかるのですが。Openメソッドには戻り値があります。ヘルプを引用すると・・

戻り値
開いているブックを表す Workbook オブジェクト。

・・・そう!オブジェクトですよ!つまりOpenメソッドは開いたファイルのWorkbookオブジェクトを戻り値として返してくれるわけです。これなら・・・変数を使ってそのオブジェクトを格納してあげましょう。関数と同じですね。

Sub Sample()
    
    '開いたファイルのオブジェクトを格納する変数を作成
    Dim workBk As WorkBook
    
    ' 開いたファイルを格納する
    workBk = Workbooks.Open "C:\Test.xls"
    
    ' 開いたファイルのSheet1をコピーする
    workBk.Sheet1.Cells.Copy

End Sub


このように、変数として格納しておくことで、いつでもオブジェクトを操作することができます。しかも、変数には自由に名前を付けることができるのでわかりやすい名前にすることで可読性も向上します。これは非常に有効な手段で、たとえばマクロ全体で使える変数として用意しておくことで、どのプロシージャでも使用できますし、予測変換も行ってくれるようになるので、コードを記述するのも非常に楽なのでお勧めです。

WorkBooksオブジェクトから指定してはいけないのか?


もちろん、単にWorkBooks("ファイル名").Sheet1なんたらと書いても問題はないのですが、私は変数を利用する方が良いと考えます。なぜなら自分で名前を付ける変数の方が覚えやすく、扱いやすいからです。

これが「正しくオブジェクトを指定するための処理」というわけです。

※メモリが圧迫されるし変数はあまり使わない方がパフォーマンス的にも良いのでは?という意見も無論あり、それは正しいと思いますがマクロと呼ばれる小規模のツールおよびアプリにおいて、このような変数をいくら使ってもそこまで大きな影響はありませんし、むしろメモリ上に格納することでより参照を早く行うことができるというメリットもあります。

今日はここまで!


かしこ。