カテゴリー名: [ExcelVBAとOLE 基本概念とセル操作]
セル範囲(一連の複数のセル)を指定する方法を取り上げます。
関連して、セル結合、罫線の簡単な引き方、配列を使ったセルへの書き込みに触れます。
セル範囲(一連の複数のセル)を指定する方法には、いくつか種類があります。
下は、いずれも同じ7行・5列の範囲(7×5=35個のセル)を指定する例です。
35個のセルのどれにも同じ test の4文字が書き込まれます。
Range("A1:E7").Value = "test"
Range("A1", "E7").Value = "test"
Range(Cells(1,1), Cells(7,5)).Value = "test"
実践でセル範囲を使うケースはいろいろあると思いますが、たとえば、
範囲のセルを同じフォントサイズにするとか、
該当のセル全部の内容を消去するとか、
あるいはセル結合するといった場合でしょうか。
罫線の太さや色は 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
セル結合には MergeCells を使います。
これをTrueにすると、指定範囲のセルが結合されます。
Falseにすれば、結合が解除されます。
セル結合を行うときは、指定した複数セルの左上端のセルにだけデータを書き込み、それ以外は空欄にしておきます。
罫線を引くのに Borders.LineStyle を使います。
これをTrueにすると、指定範囲のセル各々が標準の罫線で囲まれます。
Falseにすれば、罫線が消去されます。
セル範囲に同じ文字ではなく、それぞれ異なる文字を書き込む場合は配列(Array)というのを使います。
同一の行のセル範囲に書き込むなら下のようにします。
Range("A1:C1").Value = Array("東京都", "愛知県", "大阪府")
複数の行にわたるセルへの書き込みを一括して行うのは、VBAではちょっと面倒そうなのでここでは省略します。
セル範囲を指定するマクロの例を掲げます。
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ワークシートで実行すれば、そのシートの上でセルへの書き込みなどが行われます。
先のマクロと同じ処理をするVBScriptは次のとおり。
ワークシートは、アクティブシートを指定しています。今回は第1ワークシートになります。
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 の前にピリオドを置きます。
〜 以上 〜