先日、LotusScript でプログラムを組んでいてヘルプを参照した関数 TypeName を紹介します。せっかく調べたので忘れる前にまとめておきます。
TypeName の機能
この関数は引数に指定した変数が持つ値の型を取得することができます。例えば、次のプログラムでは、文字列変数 s の値は "INTEGER" となります。すべて大文字で返される点に注意が必要です。
Dim i As Integer Dim s As String s = TypeName(i) |
単一の値を格納するスカラー型(Boolean、Byte、Integer、Long、String など)では、変数宣言時の型をそのまま返すだけです。
配列とリストの場合
スカラー型で配列やリストの場合は次のような結果になります。配列では後ろに "( )" が付加されます(括弧の中は半角スペースが 1 つ)。リストの場合は、後ろに "LIST" が付加されます。
変数宣言 | TypeName(n) の戻り値 |
Dim n(5) As Long | LONG( ) |
Dim n(5) As String | STRING( ) |
Dim n List As Integer | INTEGER LIST |
クラスの場合
TypeName 関数は、Notes クラスのオブジェクトにも対応しています。動作はこれまでと同様で、クラス名大文字で出力されます。
変数宣言 | TypeName(n) の戻り値 |
Dim n As NotesSession | NOTESSESSION |
Dim n As NotesDatabase | NOTESDATABASE |
Dim n(5) As NotesDocument | NOTESDOCUMENT( ) |
この動作はユーザ定義クラスでも同様です。例えば以下のようなエージェントを実行した場合、”TESTCLASS” と出力されます。
Option Declare Class TestClass ・・・(省略)・・・ End Class Sub Initialize Dim n As TestClass MsgBox TypeName(n) End Sub |
Variant 型変数と TypeName
LotusScript には Variant という型があり、変数内にさまざまな値を代入できます。TypeName は Variant 変数内にどのような値が入っているか確認することができます。
次のプログラムは変数 v にさまざまな値をセットして、その型を出力しています。どれも VARIANT ではなく、セットされている値の型を出力します。
Dim ns As New NotesSession Dim v As Variant v = "TestText" Print TypeName(v) ' STRING と出力 v = 123 Print TypeName(v) ' INTEGER と出力 Set v = ns Print TypeName(v) ' NOTESSESSION と出力 |
TypeName の活用
私は、汎用的な関数を作成するときに TypeName をよく使用します。
例えばリッチテキストに引数で指定したコンテンツを出力する関数を考えます。出力する値は、文字列だけでなく、数値や日付値などが考えられます。また、DB リンクを追加するために NotesDatabase オブジェクトを指定する可能性もあります。
この要件を満たすため、引数は Variant 型となります。関数内では値に応じた処理が必要になり TypeName が活躍します。
サンプルの関数は次の通りです(構造を表す部分のみ抜粋、配列の考慮も省略)。出力する値 vvContent の型を判定し、適切な処理を行うイメージです。
Sub AppendContent(vnrti As NotesRichTextItem, vvContent As Variant) Dim s As String s = TypeName(vvContent) If s = "NOTESDATABASE" Then ' DB リンクを追加 ElseIf s = "NOTESVIEW" Then ' View リンクを追加 ElseIf s = "NOTESDOCUMENT" Then ' 文書リンクを追加 Else If IsObject(vvContent) Then 'その他のオブジェクト(名称を出力) s = "(" & s & ")" Else 'リテラル値なので文字列に変換 s = CStr(vvContent) End If 's をリッチテキストに追加 End If |
Excel オブジェクト名は未対応
残念ながら OLE オブジェクトの場合 "OBJECT" という値を返します。例えば、次のように Excel と連携するプログラムがあったとします。oXls と oSheet は VBA 的には別のクラスのオブジェクトになりますが、TypeName の戻り値はどちらも "OBJECT" となります。
Excel のクラス名が取得できればすごく便利になるんですけどね...。
Dim oXls As Variant Dim oSheet As Variant 'Excel の準備 Set oXls = CreateObject("Excel.Application") Call oXls.Workbooks.Add Set oSheet = oXls.Workbooks(1).WorkSheets(1) |
0 件のコメント:
コメントを投稿