VARTYPEバータイプ関数

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

第一引数に指定した変数の型を示す数値を返す、もしくは第ニ引数に指定した型に変換します。

VARTYPE関数は、VAR_ARRAY(8192)を単独で返すことはありません。この値は常にデータ型を表す他の値との和で返され、そのデータ型の要素を持つ配列であることを示します。

例えば4バイト整数を配列の持つ場合、VAR_INTEGER(3) + VAR_ARRAY(8192) = 8195を返します。

それぞれの型が取りうる範囲については変数を確認してください。

構文
VARTYPE( 変数, 変換タイプ )
引数
変数 (#vartype必須
型を調べる変数
変換タイプ (#vartype省略可
型を変換する場合にタイプ指定
戻り値
VAR_EMPTY (0)
Empty
VAR_NULL (1)
Null
VAR_SMALLINT (2)
2バイト整数(符号付)
VAR_INTEGER (3)
4バイト整数(符号付)
VAR_SINGLE (4)
単精度浮動小数点値
VAR_DOUBLE (5)
倍精度浮動小数点値
VAR_CURRENCY (6)
通貨型
VAR_DATE (7)
日付型
VAR_DISPATCH (9)
オブジェクト
VAR_ERROR (10)
エラー値
VAR_BOOLEAN (11)
ブール型
VAR_VARIANT (12)
バリアント
VAR_UNKNOWN (13)
未定義のオブジェクト
VAR_SBYTE (16)
1バイト整数(符号付)
VAR_BYTE (17)
1バイト整数(符号なし)
VAR_WORD (18)
2バイト整数(符号なし)
VAR_DWORD (19)
4バイト整数(符号なし)
VAR_INT64 (20)
8バイト整数(符号付)
VAR_ASTR (256)
ANSI文字列
VAR_USTR (258)
UNICODE文字列
VAR_ARRAY (8192[$2000])
配列
変換タイプが指定された場合には、変換されて値を返す

型変換

明示的な型変換

明示的にデータ型を変換することを明示的な型変換(explicit type conversion)と呼びます。

UWSCでは以下のようにVARTYPE関数を使うことで型を強制的に変換することができます。

UWSC
VARTYPE(12.3, VAR_INTEGER)      // Double型→Integer型

浮動小数点型を整数型にする関数はCEIL関数(切り上げ)があります。

UWSC
PRINT CEIL(2.5)      // Double型→Integer型
結果
プレーンテキスト
3

暗黙の型変換

演算子などを使って異なるデータ型同士を扱う場合、一方のデータ型を他方のデータ型に自動的に変換することがあります。このような自動的なデータ型変換のことを、暗黙の型変換(implicit type conversion)と呼びます。

浮動数点型⇒整数型

浮動小数点型から整数型に変換するときは一般的に小数点以下が切り捨てられます。

例えば、STATUS関数の第一引数にはWindowを識別するID(整数型の値)を指定しますが、浮動小数点型の値を指定しても関数内部で自動的に整数に変換してから処理を行うためエラーにはなりません。

以下はIDに1.5を指定していますが小数点以下を切り捨て1として処理が行われます。このように関数の内部で行われる型変換を暗黙の型変換と言います。

UWSC
PRINT STATUS(1.5, ST_TITLE)   // 1.5(Double型)⇒1(Integer型)に暗黙の型変換
UWSC
PRINT STATUS(1, ST_TITLE)

以下はオフセットしたセルを選択するスクリプト関数.VARTYPE (Excel)です。Offsetの引数に1.5を指定しています。Offsetの引数型は整数なので暗黙の型変換が行われます。STATUS関数では切り捨て処理が行われ整数にしていましたが、Offfsetメソッドでは偶数丸めで整数型に変換されます。

UWSC
DIM Range = Excel.Range("A1")
Range.Offset(1.5, 0).Select     // A3セル
Range.Offset(2.5, 0).Select     // A3セル

このように同じ整数型に変換する処理でも関数やメソッドによって丸め方が異なります。意図しない結果を招くことがあるので、暗黙の型変換は注意が必要です。

以下のように引数に指定する前に型変換をすることで、意図しない結果を防ぐことができます。

UWSC
DIM Range = Excel.Range("A1")
DIM RowOffset = INT(1.5)                // Offset = 1
Range.Offset(RowOffset, 0).Select       // Offset(1, 0)

使い方

2バイト整数(符号付)

Double型の数値をSmallInt型(範囲:-32,768~32,767)に変換します。32767はSmallInt型に変換できますが、32768はオーバーフローとなるためエラーが発生します。

UWSC
PRINT VARTYPE(32767, VAR_SMALLINT)      // Double型→SmallInt型
PRINT VARTYPE(32768, VAR_SMALLINT)      // Double型→SmallInt型(Overflow)

4バイト整数(符号付)

Double型の数値をInteger型に変換します。数値に変化はありませんが、VARTYPE関数で型を調べると変更されていることがわかります。

5は倍精度浮動小数点値、3は4バイト整数(符号付)です。

UWSC
DIM n = 32767
PRINT VARTYPE(n)
n = VARTYPE(32767, VAR_INTEGER)
PRINT VARTYPE(n)
結果
プレーンテキスト
5
3

通貨型

小数第5位で四捨五入され、小数点以下は4桁となります。

UWSC
DIM n = 123456789.123456
PRINT VARTYPE(n, VAR_CURRENCY)
結果
プレーンテキスト
123456789.1235

文字列を指定するとエラーになります。内容は「UnicodeString型からCurrency型への変換でエラーが発生しました。」という意味です。

UWSC
DIM str = "abc"
PRINT VARTYPE(str, VAR_CURRENCY)
結果
プレーンテキスト
KansuCall:Could not convert variant of type (UnicodeString) into type (Currency)

日付型

シリアル値を日付文字列に変換することができます。

UWSC
DIM n = now()                 // Double型
PRINT VARTYPE(n, VAR_DATE)    // Double型→Date型

//////////////////////////////////////////////////
// 【引数】
//   
// 【戻り値】
//   
//////////////////////////////////////////////////
結果
プレーンテキスト
2021/10/01 18:15:00

以下は日付型で指定できる形式です。

  • 年/月/日
  • 月/日
  • 月/日/年
  • 時:分:秒
  • 時:分
  • 年:yyyyyyy
  • 月:mmm
  • 日:ddd

yy=50〜99は1950〜1999年、y=0〜9は2000〜2009年、yy=00〜49は2000〜2049年、年は省略した場合は今年になります。

UWSC
DIM date = "10/01"
PRINT VARTYPE(date, VAR_DATE)

2021年に実行したときの結果。

結果
プレーンテキスト
2021/10/01
UWSC
DIM date = "21/10/01"
PRINT VARTYPE(date, VAR_DATE)
結果
プレーンテキスト
2021/10/01

日付文字列をシリアル値に変換します。

UWSC
DIM date = VARTYPE("2023/04/14 1:05:53", VAR_DATE)    // String型→Date型
PRINT VARTYPE(date, VAR_DOUBLE)                       // Date型→Double型
結果
プレーンテキスト
45030.0457523148

ブール型

0はFalse、0以外はTrueになります。

UWSC
DIM n = 1                      // Double型
n = VARTYPE(n, VAR_BOOLEAN)    // Double型→Boolean型
PRINT n
結果
プレーンテキスト
True

数値に変換できるものであれば、文字列でも大丈夫です。

UWSC
PRINT VARTYPE("1", VAR_BOOLEAN)
PRINT VARTYPE("0", VAR_BOOLEAN)
PRINT VARTYPE("1E5", VAR_BOOLEAN)
結果
プレーンテキスト
True
False
True

小数型⇒整数型

小数型から整数型に変換するときは、 偶数丸め によって丸められます。

UWSC
PRINT VARTYPE(1.5, VAR_INTEGER)
PRINT VARTYPE(2.5, VAR_INTEGER)
結果
プレーンテキスト
2
2

文字列

文字列を数値に変換するにはVARTYPE関数の第二引数にVAR_INTEGERを指定します。VAL関数と同じ結果を返します。

UWSC
DIM str = "1E4"
PRINT VARTYPE(str, VAR_INTEGER)
PRINT VAL(str)
結果
プレーンテキスト
10000
10000

プログラム実行例

変数のデータ型の値を文字で取得

VARTYPE関数で取得したデータ型の値を、連想配列で文字に変換します。

UWSC
HASHTBL type

type[VAR_EMPTY] = "Empty"
type[VAR_NULL] = "Null"
type[VAR_SMALLINT] = "2バイト整数"
type[VAR_INTEGER] = "4バイト整数"
type[VAR_SINGLE] = "単精度浮動小数点値"
type[VAR_DOUBLE] = "倍精度浮動小数点値"
type[VAR_CURRENCY] = "通貨型"
type[VAR_DATE] = "日付型"
type[VAR_DISPATCH] = "オブジェクト"
type[VAR_ERROR] = "エラー値"
type[VAR_BOOLEAN] = "ブール型"
type[VAR_VARIANT] = "バリアント"
type[VAR_UNKNOWN] = "未定義のオブジェクト"
type[VAR_SBYTE] = "1バイト整数"
type[VAR_BYTE] = "1バイト整数"
type[VAR_WORD] = "2バイト整数"
type[VAR_DWORD] = "4バイト整数"
type[VAR_INT64] = "8バイト整数"
type[VAR_ASTR] = "ANSI文字列"
type[VAR_USTR] = "UNICODE文字列"
type[VAR_ARRAY] = "配列"

DIM n = 123

PRINT type[VARTYPE(n)]
結果
プレーンテキスト
倍精度浮動小数点値
使用関数

型を取得

UWSC
DIM variable

variable = EMPTY
PRINT VARTYPE(variable)	// 0(Empty)

variable = NULL
PRINT VARTYPE(variable)	// 1(Null)

variable = 1 + 2
PRINT VARTYPE(variable)	// 5(倍精度浮動小数点値)

variable = "あいうえお"
PRINT VARTYPE(variable)	// 258(UNICODE文字列)
結果
プレーンテキスト
0
1
5
258
使用関数

配列と格納されている値のデータ型を取得

配列のデータ型を取得します。

UWSC
DIM path = "image.bmp"

DIM Stream = CREATEOLEOBJ("ADODB.Stream")
Stream.Open()
Stream.Type = 1
Stream.LoadFromFile(path)
DIM tmp = Stream.Read()
Stream.Close()

PRINT VARTYPE(tmp)		// 8209(配列(1バイト整数(符号なし)))
PRINT VARTYPE(tmp[0])	// 17(1バイト整数(符号なし))
結果
プレーンテキスト
8209
17
使用関数

セーフ配列かどうか調べるには

VARTYPE関数の戻り値からセーフ配列の場合データ型を表す他の値との和で返されるので、戻り値が「8192」よりも大きい値になります。そのため戻り値が8192よりも大きければセーフ配列と判断することができます。

UWSC
IF VARTYPE(array) > 8192 THEN

またはビット演算子のANDを使っても調べることができます。

UWSC
PRINT IIF(VARTYPE(array) AND 8192, TRUE, FALSE)

\[8192 = 2^{13}\]

自作関数での型チェック

自作関数で引数の型をチェックするときに使います。

UWSC
PRINT func(12)
PRINT func(1.5)

FUNCTION func(n)
	IFB VARTYPE(n, VAR_INTEGER) = n THEN    // 引数nが整数ならば
		RESULT = TRUE
	ELSE
		RESULT = FALSE
	ENDIF
FEND
結果
プレーンテキスト
True
False

関連記事

isString関数 (自作関数)
与えられた変数の型が文字列型か調べる。
isObject関数 (自作関数)
与えられた変数の型がオブジェクト型か調べる。
isEmpty関数 (自作関数)
与えられた変数の型がEmpty型か調べる。
isFloat関数 (自作関数)
与えられた変数の型が小数型か調べる。
isArray関数 (自作関数)
与えられた変数の型が配列型か調べる。
isAssociative関数 (自作関数)
与えられた変数の型が連想配列型か調べる。