セル範囲の指定

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

2016/08/13

セル範囲(一連の複数のセル)を指定する方法を取り上げます。

関連して、セル結合、罫線の簡単な引き方、配列を使ったセルへの書き込みに触れます。

△ 関連の Program Page


《このページの目次》


    

1. 概要

 セル範囲(一連の複数のセル)を指定する方法には、いくつか種類があります。

 下は、いずれも同じ7行・5列の範囲(7×5=35個のセル)を指定する例です。

 35個のセルのどれにも同じ test の4文字が書き込まれます。

 実践でセル範囲を使うケースはいろいろあると思いますが、たとえば、
範囲のセルを同じフォントサイズにするとか、
該当のセル全部の内容を消去するとか、
あるいはセル結合するといった場合でしょうか。

 罫線の太さや色は Excelにお任せにして、とりあえず格子罫線を引くというのもよくやる処理かもしれません。

 例を上げると下のとおり。

  Range("A1:E1").Font.Size = 14.0
  Range(Cells(1,1), Cells(2,2)).Clear
  Range("A1", "D1").MergeCells = True
  Range("A3:C4").Borders.LineStyle = True

    

(1) セル結合

 セル結合には MergeCells を使います。

 これをTrueにすると、指定範囲のセルが結合されます。

 Falseにすれば、結合が解除されます。

 セル結合を行うときは、指定した複数セルの左上端のセルにだけデータを書き込み、それ以外は空欄にしておきます。

    

(2) 罫線を引く簡単な方法

 罫線を引くのに Borders.LineStyle を使います。

 これをTrueにすると、指定範囲のセル各々が標準の罫線で囲まれます。

 Falseにすれば、罫線が消去されます。

    

(3) 配列を使ったセルへの書き込み

 セル範囲に同じ文字ではなく、それぞれ異なる文字を書き込む場合は配列(Array)というのを使います。

 同一の行のセル範囲に書き込むなら下のようにします。

  Range("A1:C1").Value = Array("東京都", "愛知県", "大阪府")

 複数の行にわたるセルへの書き込みを一括して行うのは、VBAではちょっと面倒そうなのでここでは省略します。

目次に戻る


    

2. マクロ

 セル範囲を指定するマクロの例を掲げます。

Sub Macro1()
    Range("A1:E1").Value = "test"
    Range(Cells(1,1), Cells(1,5)).Font.Size = 14.0
    Range("A2").Value = "VBA, OLE, VBScript"
    Range("A2", "C2").MergeCells = True
    Range("A3:C3").Value = Array("牡羊座", "牡牛座", "双子座")
    Range("A4:C4").Value = Array("蟹座", "獅子座", "乙女座")
    Range("A3:C4").Borders.LineStyle = True
End Sub

    

 上は、いずれも「概要」で触れたノウハウを用いています。

 マクロ中にワークシートの指定はないので、アクティブシートのセルが対象ということになります。

 このマクロを第2ワークシートで実行すれば、そのシートの上でセルへの書き込みなどが行われます。

目次に戻る


    

3. OLEを利用するVBScript

 先のマクロと同じ処理をするVBScriptは次のとおり。

 ワークシートは、アクティブシートを指定しています。今回は第1ワークシートになります。

△ vovXL03.vbs

 1Option Explicit
 2Dim FSO, BookPath
 3Dim EXLapp, WBobj
 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の新規作成
12With WBobj.ActiveSheet
13    .Range("A1:E1").Value = "test"
14    .Range(.Cells(1,1), .Cells(1,5)).Font.Size = 14.0
15    .Range("A2").Value = "VBA, OLE, VBScript"
16    .Range("A2", "C2").MergeCells = True
17    .Range("A3:C3").Value = Array("牡羊座", "牡牛座", "双子座")
18    .Range("A4:C4").Value = Array("蟹座", "獅子座", "乙女座")
19    .Range("A3:C4").Borders.LineStyle = True
20End With
21WBobj.SaveAs BookPath, xlWorkbookNormal
22EXLapp.quit

    

 上のプログラムの中核部分は、前述のマクロ記述とほとんど同じですが、
Range と Cells の前にピリオドが逐一 置いてある点が違います。

 Withステートメントの中で前触れなくピリオドが出てきたときは、その前にWithの後に書かれているオブジェクト(上の例では WBobj.ActiveSheet)が省略されているものとみなされます。

 つまり、省略しないで書くと WBobj.ActiveSheet.Range とか
WBobj.ActiveSheet.Cells となるものです。

 マクロでは、いきなり Range とか Cells と書くと、アクティブシートに所属するものと見なされます。

 しかし、VBScriptでは、いきなり Range, Cells が出てくると一般的な変数と見なされてしまいます。セルオブジェクトを示すものとは見なされません。「暗黙の前提」が通用しません。

 そして、「そのような変数名は宣言されていない」というエラーになってしまいます。

 プログラムの冒頭に Option Explicit を書いてあるので、宣言なしでは変数を使えません。

 ということで、VBScriptでは Range, Cells の前にピリオドを置きます。

〜 以上 〜