Excelのオブジェクト、プロパティ、メソッド

カテゴリー名: [ExcelVBAとOLE 基本概念とセル操作

2016/08/13

Excelをプログラムから動かすときに必要となる基本概念 = オブジェクト、プロパティ、メソッドについて解説。

△ 関連の Program Page


《このページの目次》


    

1. 概要

 Excelにおけるオブジェクトと、そのプロパティおよびメソッドが主題です。

(1) オブジェクト

 オブジェクトは、何らかの「もの」のことです。プロパティ(属性)と、メソッド(属性またはオブジェクト自身に変更を加える手続き)がオブジェクトに所属しています。

 Excelに即していえば、ワークブック、ワークシート、セルなどがオブジェクトです。

 更にいえば、Excelというアプリそのものもオブジェクトです。VBAでは Application という名前で表現されます。

 Excelは複数のワークブックを開くことができます。なので、アプリケーションに複数のワークブックオブジェクトをぶら下げることができます。

 また、ワークブックには複数のワークシートオブジェクトが含まれるのが一般的です。

 このように、オブジェクトを枠組みとして捕らえると、「あれがこれを含む」という階層構造になっています。

    

(2) プロパティ

 プロパティは属性のことです。

 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の集計表"

    

(3) メソッド

 メソッドは、オブジェクトに対して何らかの処理を施す手続きです。

 オブジェクトそのものに処理を施すこともあれば、属性(プロパティ)に変更を加える場合もあります。

 Range("A1").Clear とすれば、A1セルに書き込まれている内容が消去されます。

 Clearが「消去する」という処理を施すためのメソッドです。

 Clearが適用されると、Valueプロパティが Empty(未初期化)という値になります。厳密には "" の空文字列と違いますが、同じと考えてもそれほど不都合はないと思います。

    

(コメント) あまり区別を意識しなくても大丈夫

 プログラムを書くとき、オブジェクト、プロパティ、メソッドの識別をそれほど意識しなくても大丈夫です。こんなことを書くと専門家に怒られるかもしれませんが……

 たとえば、A1セルのフォントの大きさを設定する場合は
Range("A1").Font.Size = 12.0 のように書きます。12ポイントにするための記述です。

 フォントの書体を設定するなら
Range("A1").Font.Name = "MS 明朝" のように記述します。

 この場合、SizeやNameはプロパティでしょうが、Fontは何に当たるのでしょうか。

 何に当たるかが分からなくても、ともあれプログラムは書けます。

目次に戻る


    

2. セルオブジェクトのValueプロパティ

 セルオブジェクトのValueプロパティは、セルに書き込まれているデータを取り出したり、逆に書き込んだりするのに用います。

 その使用例を2種類の形で示します。

(1) マクロ

 まずマクロを掲げます。下の3行です。
A1セルに test の4文字を書き込みます。

Sub SetValue()
    Range("A1").Value = "test"
End Sub

    

 アプリケーション、ワークブック、ワークシートの記述は見当たりませんが、VBAでは、暗黙のうちに選択されているものを省略できるので、「わざわざ書かなくても大丈夫」ということです。

 ちなみに、省略しないでマクロを書くと、2行目が下のようになります。

Application.ActiveWorkbook.ActiveSheet.Range("A1").Value = "test"

    

(2) OLEを利用したVBScript

 今度は同じことを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のマクロ記述と類似の部分が少なくないのも分かっていただけると思います。

    

(a) ファイル名の絶対パス

 サンプルプログラムでのExcelのワークブック名(ファイル名)は Book1.xls です。ワークブックをこの名前で保存します。

 これを単2 “Book1.xls” とすると、ユーザーのドキュメントフォルダ(マイドキュメント)に保存されます。カレントフォルダには保存されません。

 そこで FSO.GetAbsolutePathName を適用しています。これは、指定されたファイル名の絶対パスを返します。

 Book1.xlsの絶対パスを変数 BookPath に代入して、
Excelを起動する前に、そのファイルが既に存在するなら削除します。

    

(b) ワークブックの新規作成

 ワークブックの新規作成は、VBAで書けば Application.Workbooks.Add() で行います。

 このAddメソッドは、新しいワークブックオブジェクトを返します。

 その新しいワークブックが ActiveWorkbook になります。

    

(c) ワークブックの保存

 全自動の一括処理であるため、ワークブックを保存し、Excelアプリケーションの終了処理も行っています。

 SaveAsというのはワークブックのメソッドで、「名前を付けて保存」に相当します。

 その第1パラメータはファイル名(ワークブックの名前)です。

 第2パラメータはワークブックの種類です。Excel2003の形式(xls)、Excel2007以降の形式(xlsx)、マクロ有効の形式(xlsm)などのどれにするかを指定します。整数値で指定します。

 -4143は、Excel2003形式を指定する値です。
 xlsx形式にしたい時は 51 に、
 xlsm形式なら 52 にします。

 サンプルプログラムでは、定数xlWorkbookNormalに-4143を代入して、定数名を用いていますが、SaveAsの第2パラメータに -4143 の整数値を指定してもかまいません。

目次に戻る


    

3. ClearおよびSelectメソッド

 メソッドの例を示します。

 Range("A1").Clear とすると、A1セルの中身が消去されてまっさらになります。

 Range("A1").Select とすれば、A1セルに焦点が当たります。カーソルがA1セルのところにきます。

    

(1) マクロ

 A1〜C1の三つのセルにデータを書き込み、B1をClearして、C1をSelectするサンプルを示します。

 セル一つずつに逐一 書き込むのは面倒なので、配列(Array)を使います。
配列は、複数の値をまとめて扱うための整理箱のようなものです。

Sub Macro1()
    Range("A1:C1").Value = Array("アップル", "オレンジ", "メロン")
    Range("B1").Clear
    Range("C1").Select
End Sub

 上のマクロを実行すると、三つのセルのうち「オレンジ」が消去されて、「メロン」のところにカーソルがいきます。

    

(2) OLEを利用したVBScript

 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でワークブックを保存するとき、カーソルがどの位置にあったかもちゃんと記録・保存されるようです。

目次に戻る


    

4. [補足] SelectとSelection

 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

〜 以上 〜