WITH文

本ページには広告が含まれています。

COMオブジェクト・モジュール表記にてオブジェクト・モジュール名を省略して書くことができます。省略したオブジェクト・モジュールを使用するには、.(ピリオド)以降を記述します。

構文
WITH 省略部
.変数
.関数名( )
ENDWITH
引数
戻り値

WITH文とは

プログラムを書いていると一つのオブジェクトに対して複数の処理を行うことがあります。そのようなときWITH文を使うとオブジェクトを省略して書くことができます。

UWSC
WITH オブジェクト名
	.処理1
	.処理2
	...
ENDWITH

WITH文内では.(ピリオド)から始めたものはオブジェクト名を省略したことになります。

WITH文の使い方

例えば以下のようにExcelでセルA1に対して複数の処理を記述したとき、Excel.Range("A1")というのが何度も出てくることになります。

UWSC
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内では省略することができ簡潔に書くことができるようになります。

UWSC
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文を書く(入れ子にする)ことで簡潔に表すことができます。

UWSC
WITH オブジェクト名1
	.処理1
	.処理2
	.オブジェクト名2.処理3
	.オブジェクト名2.処理4
ENDWITH

.オブジェクト2をWITH文の省略部に出すことで、以下のように記述することができます。

UWSC
WITH オブジェクト名1
	.処理1
	.処理2
	WITH .オブジェクト名2
		.処理3
		.処理4
	ENDWITH
ENDWITH

以下はWITH文の使い方でWITH文を使う例として書きましたが、WITH文の中に.Fontが何度も出てきてます。この場合は、WITH文を入れ子にすることで更にオブジェクトを省略することができます。

UWSC
CONST vbRed = 255

WITH Excel.Range("A1")
	.Value = "123"
	.Font.Name = "MS P明朝"
	.Font.Color = vbRed
	.Font.Size = 12
	.Font.Bold = TRUE
ENDWITH

以下はWITH文を入れ子にした書き方です。

UWSC
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への代入、フォントの変更で全部同じです。

UWSC
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で括った書き方。

UWSC
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)に書き換えることができます。

UWSC
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")で括った書き方。

UWSC
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も括ると以下のようになります。

UWSC
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個以上はやり過ぎな気がします。

UWSC
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に統一するなら、入れ子し過ぎなければまだ見やすいし理解もしやすい気がする。

UWSC
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文を使わずに書いた場合。

UWSC
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文を使って書いた場合。

UWSC
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