カテゴリー名: [ExcelVBAとOLE 基本概念とセル操作]
今回は、セル内で文字の配置を指定する方法を取り上げます。
横方向(水平方向)の配置を HorizontalAlignment
縦方向(垂直方向)の配置を VerticalAlignment で行います。
A1セルに何か文字が書かれている場合、
Range("A1").HorizontalAlignment = xlRight
とすれば右詰めになります。
つまり、横方向で見たときに右寄せの状態になります。
Range("A1").VerticalAlignment = xlBottom
とすれば下詰めになります。
つまり、縦方向で見たときに下寄せの状態になります。
配置に関する定数は下のとおり。
VBScript で使えるように、定数を定義する形で掲げます。
-------- ここから
' 横方向(水平方向)
Const xlGeneral = 1 ' 標準
Const xlLeft = -4131 ' 左詰め
Const xlCenter = -4108 ' 中央揃え
Const xlRight = -4152 ' 右詰め
Const xlFill = 5 ' 繰り返し
Const xlJustify = -4130 ' 両端揃え
Const xlCenterAcrossSelection = 7 ' 選択範囲内で中央
Const xlDistributed = -4117 ' 均等割り付け
' 縦方向(垂直方向)
Const xlTop = -4160 ' 上詰め
Const xlCenter = -4108 ' 中央揃え
Const xlBottom = -4107 ' 下詰め
Const xlJustify = -4130 ' 両端揃え
Const xlDistributed = -4117 ' 均等割り付け
-------- ここまで
VBAのマクロでは、上の定数定義がなくても、いきなり xlTop などと記述して大丈夫です。
VBScriptの場合はそういう訳にいかないので、必要な定数をスクリプトの前の方で定義しなければなりません。
文字の配置を指定するマクロの例を掲げます。
第1行目の B1:G1 では、横方向の配置を指定しています。
第1列目の A2:A7 では、縦方向の配置を指定しています。
最後に、セルの幅と高さを拡げています。
-------- ここから
Sub Macro1()
Range("B1").Value = "標準"
Range("B1").HorizontalAlignment = xlGeneral
Range("C1").Value = "左詰"
Range("C1").HorizontalAlignment = xlLeft
Range("D1").Value = "中央"
Range("D1").HorizontalAlignment = xlCenter
Range("E1").Value = "右詰"
Range("E1").HorizontalAlignment = xlRight
Range("F1").Value = "両端"
Range("F1").HorizontalAlignment = xlJustify
Range("G1").Value = "均等"
Range("G1").HorizontalAlignment = xlDistributed
Range("A2").Value = "標準"
Range("A2").VerticalAlignment = xlGeneral
Range("A3").Value = "上詰"
Range("A3").VerticalAlignment = xlTop
Range("A4").Value = "中央"
Range("A4").VerticalAlignment = xlCenter
Range("A5").Value = "下詰"
Range("A5").VerticalAlignment = xlBottom
Range("A6").Value = "両端"
Range("A6").VerticalAlignment = xlJustify
Range("A7").Value = "均等"
Range("A7").VerticalAlignment = xlDistributed
With Range("A1:G7")
.ColumnWidth = 20 ' セルの幅を半角20文字分に
.RowHeight = 33 ' セルの高さを33ポイントに
End With
End Sub
-------- ここまで
先のマクロと同じ操作を行うVBScriptを掲げます。
今回、定数がいろいろ出てくるので、定数の定義を別ファイル constants_xl.txt に書いておいて、それを読み込むようにします。
読み込むためのサブプロシージャ Include を最後の方で定義しています。
1Option Explicit 2Dim FSO, BookPath 3Dim EXLapp, WBobj 4Include "constants_xl.txt" 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("B1").Value = "標準" 14 .Range("B1").HorizontalAlignment = xlGeneral 15 .Range("C1").Value = "左詰" 16 .Range("C1").HorizontalAlignment = xlLeft 17 .Range("D1").Value = "中央" 18 .Range("D1").HorizontalAlignment = xlCenter 19 .Range("E1").Value = "右詰" 20 .Range("E1").HorizontalAlignment = xlRight 21 .Range("F1").Value = "両端" 22 .Range("F1").HorizontalAlignment = xlJustify 23 .Range("G1").Value = "均等" 24 .Range("G1").HorizontalAlignment = xlDistributed 25 26 .Range("A2").Value = "上詰" 27 .Range("A2").VerticalAlignment = xlTop 28 .Range("A3").Value = "中央" 29 .Range("A3").VerticalAlignment = xlCenter 30 .Range("A4").Value = "下詰" 31 .Range("A4").VerticalAlignment = xlBottom 32 .Range("A5").Value = "両端" 33 .Range("A5").VerticalAlignment = xlJustify 34 .Range("A6").Value = "均等" 35 .Range("A6").VerticalAlignment = xlDistributed 36 37 With .Range("A1:G6") 38 .ColumnWidth = 20 ' セルの幅を半角20文字分に 39 .RowHeight = 33 ' セルの高さを33ポイントに 40 End With 41End With 42WBobj.SaveAs BookPath, xlWorkbookNormal 43EXLapp.quit 44 45Sub Include(ByVal FileName) 46 Dim FSO, FileObj, MyStr 47 Set FSO = CreateObject("Scripting.FileSystemObject") 48 Set FileObj = FSO.OpenTextFile(FSO.GetAbsolutePathName(FileName)) 49 MyStr = FileObj.ReadAll() 50 FileObj.Close 51 Set FSO = Nothing 52 Set FileObj = Nothing 53 ExecuteGlobal MyStr 54End Sub
文字の配置については、マクロとほぼ同様の記述なので説明を加える必要はないと思います。
定数を定義したファイル constants_xl.txt には2031行の定義が書かれています。
Excel2010で定義されている定数で、xlで始まるものは全部書かれているはずです。
別のバージョンのExcelだと定義に異なるところがあるかもしれませんが、概ね共通しているものと思います。
サブプロシージャの Include については次の項で述べます。
多くのプログラミング言語では、別のファイルに書かれたプログラムを取り込んで利用できるようになっています。それができないと、少しプログラムの規模が大きくなってくると対応困難です。
しかし、残念ながら VBScript には「別ファイルを取り込む」機能が備わっていないようです。
ただ、プログラムが記述された文字列を渡してやると、それを実行する関数があります。ExecuteGlobalがそれです。
そこで、ファイルに書かれている内容を文字列に代入して、ExecuteGlobal に引き渡してやれば、類似の機能が実現できます。
それをおこなうのが Include です。改めて下に掲げます。
-------- ここから
Sub Include(ByVal FileName)
Dim FSO, FileObj, MyStr
Set FSO = CreateObject("Scripting.FileSystemObject")
Set FileObj = FSO.OpenTextFile(FSO.GetAbsolutePathName(FileName))
MyStr = FileObj.ReadAll()
FileObj.Close
Set FSO = Nothing
Set FileObj = Nothing
ExecuteGlobal MyStr
End Sub
-------- ここまで
上は、VBScriptで悩んだことメモ - Qiitaで紹介されているものを少しだけ変更したものです。
今回は定数の定義を取り込むのに使いましたが、よく使うサブプロシージャや関数を別のファイルに書いておいて、必要になったら取り込むというのが一般的かもしれません。
なお、文字列に書かれているものをプログラムとして実行する関数として、
ExecuteGlobal のほかに Execute とか Eval というのもあります。
それぞれ仕様に違いがあるようです。
〜 以上 〜