カテゴリー名: [ExcelVBAとOLE 基本概念とセル操作]
Excelをプログラムから動かすときに必要となる基本概念 = オブジェクト、プロパティ、メソッドについて解説。
Excelにおけるオブジェクトと、そのプロパティおよびメソッドが主題です。
オブジェクトは、何らかの「もの」のことです。プロパティ(属性)と、メソッド(属性またはオブジェクト自身に変更を加える手続き)がオブジェクトに所属しています。
Excelに即していえば、ワークブック、ワークシート、セルなどがオブジェクトです。
更にいえば、Excelというアプリそのものもオブジェクトです。VBAでは Application という名前で表現されます。
Excelは複数のワークブックを開くことができます。なので、アプリケーションに複数のワークブックオブジェクトをぶら下げることができます。
また、ワークブックには複数のワークシートオブジェクトが含まれるのが一般的です。
このように、オブジェクトを枠組みとして捕らえると、「あれがこれを含む」という階層構造になっています。
プロパティは属性のことです。
Range("A1")
は、A1という番地のセルを示すオブジェクトですが、そのセルに書き込まれている値を示すValueはプロパティの一種です。
Worksheets(1)
は、第1ワークシート(オブジェクト)を指しますが、これにはNameというプロパティがあります。ワークシート名を示します。
プロパティには一般に文字や数値が代入されています。
第1ワークシートには通常、Sheet1 という名前がついているので、Worksheets(1).Name
には "Sheet1"
という文字列が代入されています。
そして、第1ワークシートオブジェクトを指し示すのに Worksheets("Sheet1")
という書き方もできます。
プロパティに、新たに文字や数値を代入することもできます。たとえば下のとおり。
Range("A1").Value = "test"
Worksheets(1).Name = "第1の集計表"
メソッドは、オブジェクトに対して何らかの処理を施す手続きです。
オブジェクトそのものに処理を施すこともあれば、属性(プロパティ)に変更を加える場合もあります。
Range("A1").Clear
とすれば、A1セルに書き込まれている内容が消去されます。
Clearが「消去する」という処理を施すためのメソッドです。
Clearが適用されると、Valueプロパティが Empty(未初期化)という値になります。厳密には ""
の空文字列と違いますが、同じと考えてもそれほど不都合はないと思います。
プログラムを書くとき、オブジェクト、プロパティ、メソッドの識別をそれほど意識しなくても大丈夫です。こんなことを書くと専門家に怒られるかもしれませんが……
たとえば、A1セルのフォントの大きさを設定する場合は
Range("A1").Font.Size = 12.0
のように書きます。12ポイントにするための記述です。
フォントの書体を設定するなら
Range("A1").Font.Name = "MS 明朝"
のように記述します。
この場合、SizeやNameはプロパティでしょうが、Fontは何に当たるのでしょうか。
何に当たるかが分からなくても、ともあれプログラムは書けます。
セルオブジェクトのValueプロパティは、セルに書き込まれているデータを取り出したり、逆に書き込んだりするのに用います。
その使用例を2種類の形で示します。
まずマクロを掲げます。下の3行です。
A1セルに test の4文字を書き込みます。
Sub SetValue()
Range("A1").Value = "test"
End Sub
アプリケーション、ワークブック、ワークシートの記述は見当たりませんが、VBAでは、暗黙のうちに選択されているものを省略できるので、「わざわざ書かなくても大丈夫」ということです。
ちなみに、省略しないでマクロを書くと、2行目が下のようになります。
Application.ActiveWorkbook.ActiveSheet.Range("A1").Value = "test"
今度は同じことをVBScriptで行います。
ワークブックにマクロを組み込む方式ではなく、WindowsのOLEという仕組みを利用してExcelを外部から操作します。
スクリプトは下のとおり。test.vbsといった名前で保存すれば実行できます。
1Option Explicit 2Dim FSO, BookPath 3Dim EXLapp, WBobj, WSobj 4Const xlWorkbookNormal = -4143 5 6Set FSO = CreateObject("Scripting.FileSystemObject") 7BookPath = FSO.GetAbsolutePathName("Book1.xls") 8If (FSO.FileExists(BookPath) = True) Then FSO.DeleteFile(BookPath) 9Set EXLapp = CreateObject("Excel.Application") ' Excelの起動 10EXLapp.Visible = True ' Excelを見える状態に 11Set WBobj = EXLapp.Workbooks.Add() ' Workbookの新規作成 12Set WSobj = WBobj.Worksheets(1) 13WSobj.Range("A1").Value = "test" 14WBobj.SaveAs BookPath, xlWorkbookNormal 15EXLapp.quit
上のスクリプトにより作成される Book1.xls をExcelで開くと、A1セルに test
が書き込まれているはずです。
本項のテーマであるオブジェクトについてみると、アプリケーションオブジェクトを変数EXLappに、ワークブックをWBobjに、ワークシートをWSobjに代入しています。
VBAのマクロのように、アプリケーションやワークブックに関する記述を省略することはできません。
とはいえ、VBAのマクロ記述と類似の部分が少なくないのも分かっていただけると思います。
サンプルプログラムでのExcelのワークブック名(ファイル名)は Book1.xls です。ワークブックをこの名前で保存します。
これを単2 “Book1.xls” とすると、ユーザーのドキュメントフォルダ(マイドキュメント)に保存されます。カレントフォルダには保存されません。
そこで FSO.GetAbsolutePathName を適用しています。これは、指定されたファイル名の絶対パスを返します。
Book1.xlsの絶対パスを変数 BookPath に代入して、
Excelを起動する前に、そのファイルが既に存在するなら削除します。
ワークブックの新規作成は、VBAで書けば Application.Workbooks.Add()
で行います。
このAddメソッドは、新しいワークブックオブジェクトを返します。
その新しいワークブックが ActiveWorkbook になります。
全自動の一括処理であるため、ワークブックを保存し、Excelアプリケーションの終了処理も行っています。
SaveAsというのはワークブックのメソッドで、「名前を付けて保存」に相当します。
その第1パラメータはファイル名(ワークブックの名前)です。
第2パラメータはワークブックの種類です。Excel2003の形式(xls)、Excel2007以降の形式(xlsx)、マクロ有効の形式(xlsm)などのどれにするかを指定します。整数値で指定します。
-4143は、Excel2003形式を指定する値です。
xlsx形式にしたい時は 51 に、
xlsm形式なら 52 にします。
サンプルプログラムでは、定数xlWorkbookNormalに-4143を代入して、定数名を用いていますが、SaveAsの第2パラメータに -4143 の整数値を指定してもかまいません。
メソッドの例を示します。
Range("A1").Clear
とすると、A1セルの中身が消去されてまっさらになります。
Range("A1").Select
とすれば、A1セルに焦点が当たります。カーソルがA1セルのところにきます。
A1〜C1の三つのセルにデータを書き込み、B1をClearして、C1をSelectするサンプルを示します。
セル一つずつに逐一 書き込むのは面倒なので、配列(Array)を使います。
配列は、複数の値をまとめて扱うための整理箱のようなものです。
Sub Macro1()
Range("A1:C1").Value = Array("アップル", "オレンジ", "メロン")
Range("B1").Clear
Range("C1").Select
End Sub
上のマクロを実行すると、三つのセルのうち「オレンジ」が消去されて、「メロン」のところにカーソルがいきます。
VBScriptは次のようになります。要所は先のマクロと同じです。
1Option Explicit 2Dim FSO, BookPath 3Dim EXLapp, WBobj, WSobj 4Const xlWorkbookNormal = -4143 5 6Set FSO = CreateObject("Scripting.FileSystemObject") 7BookPath = FSO.GetAbsolutePathName("Book1.xls") 8If (FSO.FileExists(BookPath) = True) Then FSO.DeleteFile(BookPath) 9Set EXLapp = CreateObject("Excel.Application") ' Excelの起動 10EXLapp.Visible = True ' Excelを見える状態に 11Set WBobj = EXLapp.Workbooks.Add() ' Workbookの新規作成 12Set WSobj = WBobj.Worksheets(1) 13WSobj.Range("A1:C1").Value = Array("アップル", "オレンジ", "メロン") 14WSobj.Range("B1").Clear 15WSobj.Range("C1").Select 16WBobj.SaveAs BookPath, xlWorkbookNormal 17EXLapp.quit
上のスクリプトにより作成される Book1.xls をExcelで開くと、カーソルは C1セルのところにあります。Selectしたセルです。
SaveAsでワークブックを保存するとき、カーソルがどの位置にあったかもちゃんと記録・保存されるようです。
VBAのマクロで Selection を見かけることがあります。これは、現在 選択されているオブジェクトを指します。
新規のワークブックを開いたばかりの状態だと、通常、第1ワークシートのA1セルに焦点が当たっています。
なので、Selection.Value = "test"
とすれば A1セルに test の4文字が書き込まれます。
マクロとして示すと次のとおり。
Sub Macro1()
Selection.Value = "test"
End Sub
上のマクロが常に「A1セルへの書き込み」になるわけではありません。
ユーザーがカーソルをB1セルに移動した状態で上のマクロを実行すると、B1セルに書き込みが行われます。
要するに、Selectメソッドで焦点が当てられたオブジェクトがSelectionです。
Selectionは、Applicationに所属します。WorkbookやWorksheetには所属しません。
VBScriptでSelectionを使うときは、このことに留意しなければなりません。柔軟に変化するSelectionをVBScriptで使いたいと思うかどうかは別ですが……
VBScriptのサンプルを掲げておきます。
1Option Explicit 2Dim FSO, BookPath 3Dim EXLapp 4Const xlWorkbookNormal = -4143 5 6Set FSO = CreateObject("Scripting.FileSystemObject") 7BookPath = FSO.GetAbsolutePathName("Book1.xls") 8If (FSO.FileExists(BookPath) = True) Then FSO.DeleteFile(BookPath) 9Set EXLapp = CreateObject("Excel.Application") ' Excelの起動 10EXLapp.Visible = True ' Excelを見える状態に 11EXLapp.Workbooks.Add() ' Workbookの新規作成 12EXLapp.ActiveWorkbook.ActiveSheet.Range("B1").Select 13EXLapp.Selection.Value = "test" 14EXLapp.ActiveWorkbook.SaveAs BookPath, xlWorkbookNormal 15EXLapp.quit
〜 以上 〜