カテゴリー名: [ExcelVBAとOLE 基本概念とセル操作]
セルの番地を指定する方法と、同一のセルの複数のプロパティ(プロパティセット)を設定するのに便利なWithステートメントを取り上げます。
主な内容は次のとおり。
A1セルを指定するのに次の二つの方法があります。セルに「test」と書き込む例で示します。
Range("A1").Value = "test"
Cells(1,1).Value = "test"
Cellsでは行番号と列番号を指定します。
B1なら Cells(1,2)
となり、A4なら Cells(4,1)
です。
セルはワークシートに所属します。なので、セルを指定する場合は、どのワークシートが注目のワークシートになっているかが大事です。
注目のワークシートのことをアクティブシートといいます。
新規のワークブックを開いた時は、三つのワークシートが用意され、そのうちの第1ワークシートがアクティブシートになっています。
なので、VBAのマクロでいきなり Range("A1")
と書けば、そのセルは第1ワークシートのA1セルということになります。
第2ワークシートをアクティブシートにしたい場合は下のように書きます。
Worksheets(2).Activate
上のようにした後で Range("A1")
とすれば、第2ワークシートのA1セルということになります。
ひとまとまりのマクロの形で書くと次のとおり。
Sub Macro1()
Worksheets(2).Activate
Range("B1").Value = "B1・B1"
Cells(4,1).Value = "A4・A4"
End Sub
セルにはValue以外にもいろいろなプロパティがあります。
セルの高さは RowHeightプロパティ、幅は ColumnWidthプロパティで設定します。
日付と時刻は、セル幅を拡げないとシャープ記号になるので、ここで取り上げてみます。現在日時を得るための NOW() 関数を使います。
Range("A1").Value = "=NOW()"
Range("A1").RowHeight = 20
Range("A1").ColumnWidth = 20
セルの高さのデフォルト値は 13.5 です。この数値の単位はポイント。
13.5ポイント = 約4.7628ミリ
ちなみに、1ポイント = 1/72インチ = 約0.3528ミリ
一方、セルの幅のデフォルト値は 8.38 です。これは、標準フォントの半角文字で 8.38文字分ということらしいです。
なお、Excelの標準フォントのサイズは 11.0ポイント。
同じセルオブジェクトに Value, RowHeight, ColumnWidth の三つのプロパティを設定する場合、同一オブジェクトの記述を何度もするのは面倒です。
Range("A1").Value = "=NOW()"
Range("A1").RowHeight = 20
Range("A1").ColumnWidth = 20
上は Range("A1")
が3回出てきます。
このような時にWithステートメントを用いると簡潔に書けます。次のように書きます。
With Range("A1")
.Value = "=NOW()"
.RowHeight = 20
.ColumnWidth = 20
End With
Withステートメントの中に、またWithステートメントを入れ込むこともできます。たとえば次のように書きます。
With Worksheets(2)
.Activate
With .Range("A1")
.Value = "=NOW()"
.RowHeight = 20
.ColumnWidth = 20
End With
End With
既に「概要」でマクロをあれこれ掲げましたが、改めてマクロを示します。
次の処理を行います。
マクロは下のとおり。
Sub Macro1()
With Worksheets(2)
.Name = "第2シート"
.Activate
With .Range("A1")
.Formula = "=NOW()"
.RowHeight = 20
.ColumnWidth = 20
End With
End With
End Sub
A1セルに “=NOW()” を書き込むのに Value でなく Formula を用いました。
Valueでもいいのですが、数式や関数の呼び出しを書き込むときは Formula を使うのが正式なやり方のようです。
先のマクロと同じ処理を行う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(2) 13With WSobj 14 .Name = "第2シート" 15 .Activate 16 With .Range("A1") 17 .Formula = "=NOW()" 18 .RowHeight = 20 19 .ColumnWidth = 20 20 End With 21End With 22WBobj.SaveAs BookPath, xlWorkbookNormal 23EXLapp.quit
中核部分は、前述のマクロと同じです。
ここで、ちょっとクイズ。
マクロにもVBScriptにも、With .Range("A1")
という行があります。
マクロの方では、ピリオドを取り除いて With Range("A1")
としても同じように動作します。
ですが、VBScriptの方ではピリオドをとるとエラーが発生します。
なぜだと思いますか。
説明は省略しますが、マクロで通用する「暗黙の前提は省略してもいい」がOLEのVBScriptでは通用しない、ということだけ記しておきます。
〜 以上 〜