COMオブジェクト・モジュール表記にてオブジェクト・モジュール名を省略して書くことができます。省略したオブジェクト・モジュールを使用するには、.(ピリオド)以降を記述します。
- 構文
- WITH 省略部
.変数.関数名( )ENDWITH
- 引数
- 戻り値
WITH文とは
プログラムを書いていると一つのオブジェクトに対して複数の処理を行うことがあります。そのようなときWITH文を使うとオブジェクトを省略して書くことができます。
WITH オブジェクト名
.処理1
.処理2
...
ENDWITH
WITH文内では.(ピリオド)から始めたものはオブジェクト名を省略したことになります。
WITH文の使い方
例えば以下のようにExcelでセルA1に対して複数の処理を記述したとき、Excel.Range("A1")というのが何度も出てくることになります。
CONST vbRed = 255
Excel.Range("A1").Value = "123"
Excel.Range("A1").Font.Name = "MS P明朝"
Excel.Range("A1").Font.Color = vbRed
Excel.Range("A1").Font.Size = 12
Excel.Range("A1").Font.Bold = TRUE
この共通しているオブジェクトExcel.Range("A1")をWITH直後に書くことで、WITH内では省略することができ簡潔に書くことができるようになります。
CONST vbRed = 255
WITH Excel.Range("A1")
.Value = "123"
.Font.Name = "MS P明朝"
.Font.Color = vbRed
.Font.Size = 12
.Font.Bold = TRUE
ENDWITH
WITH文の入れ子
WITH文は入れ子にして使うこともできます。以下のようにWITH文の中で共通するオブジェクトがある場合、WITH文の中にさらにWITH文を書く(入れ子にする)ことで簡潔に表すことができます。
WITH オブジェクト名1
.処理1
.処理2
.オブジェクト名2.処理3
.オブジェクト名2.処理4
ENDWITH
.オブジェクト2をWITH文の省略部に出すことで、以下のように記述することができます。
WITH オブジェクト名1
.処理1
.処理2
WITH .オブジェクト名2
.処理3
.処理4
ENDWITH
ENDWITH
以下はWITH文の使い方でWITH文を使う例として書きましたが、WITH文の中に.Fontが何度も出てきてます。この場合は、WITH文を入れ子にすることで更にオブジェクトを省略することができます。
CONST vbRed = 255
WITH Excel.Range("A1")
.Value = "123"
.Font.Name = "MS P明朝"
.Font.Color = vbRed
.Font.Size = 12
.Font.Bold = TRUE
ENDWITH
以下はWITH文を入れ子にした書き方です。
CONST vbRed = 255
WITH Excel.Range("A1")
.Value = "123"
WITH .Font
.Name = "MS P明朝"
.Color = vbRed
.Size = 12
.Bold = TRUE
ENDWITH
ENDWITH
以下のプログラムはWITH文の省略部の括り方の違いによる比較です。行われる処理はセルA1、B1への代入、フォントの変更で全部同じです。
CONST vbRed = 255
CONST vbGreen = 65280
Excel.Range("A1").Value = "123"
Excel.Range("A1").Font.Name = "MS P明朝"
Excel.Range("A1").Font.Color = vbRed
Excel.Range("A1").Font.Size = 12
Excel.Range("A1").Font.Bold = TRUE
Excel.Range("B1").Value = "456"
Excel.Range("B1").Font.Name = "メイリオ"
Excel.Range("B1").Font.Color = vbGreen
Excel.Range("B1").Font.Size = 14
Excel.Range("B1").Font.Italic = TRUE
Excelオブジェクト、セルA1とセルB1、Fontで括った書き方。
CONST vbRed = 255
CONST vbGreen = 65280
WITH Excel
WITH .Range("A1")
.Value = "123"
WITH .Font
.Name = "MS P明朝"
.Color = vbRed
.Size = 12
.Bold = TRUE
ENDWITH
ENDWITH
WITH .Range("B1")
.Value = "456"
WITH .Font
.Name = "メイリオ"
.Color = vbGreen
.Size = 14
.Italic = TRUE
ENDWITH
ENDWITH
ENDWITH
Range("B1") をRange("A1")から行方向に0、列方向に+1のセルと考えれば、Range("A1").Offset(0 ,1)に書き換えることができます。
CONST vbRed = 255
CONST vbGreen = 65280
Excel.Range("A1").Value = "123"
Excel.Range("A1").Font.Name = "MS P明朝"
Excel.Range("A1").Font.Color = vbRed
Excel.Range("A1").Font.Size = 12
Excel.Range("A1").Font.Bold = TRUE
Excel.Range("A1").Offset(0, 1).Value = "456"
Excel.Range("A1").Offset(0, 1).Font.Name = "メイリオ"
Excel.Range("A1").Offset(0, 1).Font.Color = vbGreen
Excel.Range("A1").Offset(0, 1).Font.Size = 14
Excel.Range("A1").Offset(0, 1).Font.Italic = TRUE
Excel.Range("B1")をExcel.Range("A1").Offset(0, 1)に書き換え、Excel.Range("A1")で括った書き方。
CONST vbRed = 255
CONST vbGreen = 65280
WITH Excel.Range("A1")
.Value = "123"
.Font.Name = "MS P明朝"
.Font.Color = vbRed
.Font.Size = 12
.Font.Bold = TRUE
.Offset(0, 1).Value = "456"
.Offset(0, 1).Font.Name = "メイリオ"
.Offset(0, 1).Font.Color = vbGreen
.Offset(0, 1).Font.Size = 14
.Offset(0, 1).Font.Italic = TRUE
ENDWITH
Font、Offsetも括ると以下のようになります。
CONST vbRed = 255
CONST vbGreen = 65280
WITH Excel.Range("A1")
.Value = "123"
WITH .Font
.Name = "MS P明朝"
.Color = vbRed
.Size = 12
.Bold = TRUE
ENDWITH
WITH .Offset(0, 1)
.Value = "456"
WITH .Font
.Name = "メイリオ"
.Color = vbGreen
.Size = 14
.Italic = TRUE
ENDWITH
ENDWITH
ENDWITH
ここまでしてWITH文で括るとさすがに見づらいですが、一応こういう書き方もできるんだなって参考程度にしてください。今回のプログラムの場合、以下のようにExcelオブジェクトとRangeオブジェクトを括るまでが限界かなって思います。WITH文を入れ子にし過ぎるくらいなら敢えて括らない方が良いと思います。WITHの入れ子もやって2つまでかなと。3個以上はやり過ぎな気がします。
CONST vbRed = 255
CONST vbGreen = 65280
WITH Excel
WITH .Range("A1")
.Value = "123"
.Font.Name = "MS P明朝"
.Font.Color = vbRed
.Font.Size = 12
.Font.Bold = TRUE
ENDWITH
WITH .Range("B1")
.Value = "456"
.Font.Name = "メイリオ"
.Font.Color = vbGreen
.Font.Size = 14
.Font.Italic = TRUE
ENDWITH
ENDWITH
Offset使ってセルA1に統一するなら、入れ子し過ぎなければまだ見やすいし理解もしやすい気がする。
CONST vbRed = 255
CONST vbGreen = 65280
WITH Excel.Range("A1")
.Value = "123"
.Font.Name = "MS P明朝"
.Font.Color = vbRed
.Font.Size = 12
.Font.Bold = TRUE
WITH .Offset(0, 1)
.Value = "456"
.Font.Name = "メイリオ"
.Font.Color = vbGreen
.Font.Size = 14
.Font.Italic = TRUE
ENDWITH
ENDWITH
モジュールでの使い方
自作のmathモジュールでmathを省略部に書く例。
WITH内で省略した変数・関数を使うにはドット以降から書き始めます。
WITH文を使わずに書いた場合。
PRINT math.pi // 円周率
PRINT math.e // ネイピア数
PRINT math.tau // τ
PRINT math.fabs(-4) // 引数の絶対値
PRINT math.factorial(5) // 引数の階乗
MODULE math
CONST pi = 3.14159265358979323846 // 円周率π
CONST e = 2.71828182845904523536 // 自然対数e
CONST tau = THIS.pi * 2 // τ(τ=2π)
FUNCTION fabs(x)
RESULT = ABS(x)
FEND
FUNCTION factorial(x)
IF x <> ABS(INT(x)) THEN RESULT = ERR_VALUE
IFB x = 0 OR x = 1 THEN
RESULT = 1
ELSE
RESULT = x * factorial(x – 1)
ENDIF
FEND
ENDMODULE
WITH文を使って書いた場合。
WITH math // 省略部
PRINT .pi // 変数
PRINT .e // 変数
PRINT .tau // 変数
PRINT .fabs(4) // 関数名()
PRINT .factorial(5) // 関数名()
ENDWITH
MODULE math
CONST pi = 3.14159265358979323846 // 円周率π
CONST e = 2.71828182845904523536 // 自然対数e
CONST tau = THIS.pi * 2 // τ(τ=2π)
FUNCTION fabs(x)
RESULT = ABS(x)
FEND
FUNCTION factorial(x)
IF x <> ABS(INT(x)) THEN RESULT = ERR_VALUE
IFB x = 0 OR x = 1 THEN
RESULT = 1
ELSE
RESULT = x * factorial(x – 1)
ENDIF
FEND
ENDMODULE