2024/12/16

TypeName 関数

先日、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 件のコメント:

コメントを投稿