セルの指定とプロパティセット

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

2016/08/13

セルの番地を指定する方法と、同一のセルの複数のプロパティ(プロパティセット)を設定するのに便利なWithステートメントを取り上げます。

△ 関連の Program Page


《このページの目次》


    

1. 概要

 主な内容は次のとおり。

    

(1) 特定のセルを指定するためのRangeとCells

 A1セルを指定するのに次の二つの方法があります。セルに「test」と書き込む例で示します。

  Range("A1").Value = "test"
  Cells(1,1).Value = "test"

 Cellsでは行番号と列番号を指定します。

 B1なら Cells(1,2) となり、A4なら Cells(4,1) です。

   

(2) セル指定の前提となるアクティブシート

 セルはワークシートに所属します。なので、セルを指定する場合は、どのワークシートが注目のワークシートになっているかが大事です。

 注目のワークシートのことをアクティブシートといいます。

 新規のワークブックを開いた時は、三つのワークシートが用意され、そのうちの第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

    

(3) セルの高さと幅を設定

 セルには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ポイント。

    

(4) 同一オブジェクトに複数のプロパティを設定する際のWithステートメント

 同じセルオブジェクトに 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

目次に戻る


    

2. マクロ

 既に「概要」でマクロをあれこれ掲げましたが、改めてマクロを示します。

 次の処理を行います。

 マクロは下のとおり。

    

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 を使うのが正式なやり方のようです。

目次に戻る


    

3. OLEを利用するVBScript

 先のマクロと同じ処理を行うVBScriptを掲げます。

△ vovXL02.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(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では通用しない、ということだけ記しておきます。

〜 以上 〜