ユーザー定義のデータ型

ユーザー定義のデータ型は BASIC プログラミングでは一般的な機能で、データベース、ファイルの読み込みと書き込み、印刷操作などをサポートするために使用されています。ユーザー定義のデータ型を使用すると、異なるデータ型のデータを 1 つの変数にグループ化できます。このユーザー定義のデータ型には、人事情報、企業の財務情報、在庫情報、顧客、販売レコードなど一緒に格納して使用する性質の情報を含めることができます。ユーザー定義のデータ型の変数は、データへのポインタではなく、実際のデータを保持します。

構文は次のとおりです。

[ Public | Private ] Type typeName

メンバー変数宣言

End Type

要素

説明

Public、Private

Public を指定すると、このデータ型は定義されたモジュールの外でも使用できます。Private (既定) を指定すると、データ型は定義されたモジュール内のみで使用できます。

typeName

データ型の名前。

メンバー変数宣言

型のメンバを宣言します。メンバ変数はスカラー値、Variant 型、固定長配列、またはその他のユーザー定義のデータ型を保持できます。Variant 型として宣言されたメンバ変数は、任意のスカラー値の他にも固定長配列、動的配列、リスト、またはオブジェクト参照を保持できます。宣言には Const ステートメントを定義することはできません。

メンバ変数宣言は関数内で宣言されたローカル変数の宣言と似ていますが、アプリケーションがユーザー定義のデータ型を作成したときにのみ、スペースが割り当てられます。この場合、すべてのメンバ変数にスペースが同時に割り当てられます。

ユーザー定義のデータ型にはプロシージャ (プロパティとメソッド) を含めることはできません。また、ユーザー定義のデータ型は拡張することもできません。

次の例は、従業員情報についてのデータベースレコードを保持するために、3 つのメンバ変数 (ID、lastName、firstName) を含む Employee データ型を作成する方法を示しています。

Employee table containing ID, Last, and First variables

ユーザー定義のデータ型の変数を宣言する

ユーザー定義のデータ型を定義した後、メンバ変数を宣言できます。

以下に例を示します。

Dim President As Employee ' Create a single employee record.

多くのデータベースレコードからのデータを入れる場合、メンバ変数の配列を宣言できます。

以下に例を示します。

Dim Staff(10) As Employee ' Create an array of ten employee    ' records.

メンバ変数を参照する

メンバ変数を参照するには、ドット表記法 (object.memberVariable) を使用します。値を割り当てるには、代入ステートメントを使用します。

President.ID = 42
President.lastName = "Wilkinson"
President.firstName = "May"

配列またはリストのメンバ変数の要素を参照することもできます。

Staff(1).ID = 1134
Staff(1).lastName = "Robinson"
Staff(1).firstName = "Bill"

Staff(2).ID = 2297
Staff(2).lastName = "Perez"
Staff(2).firstName = "Anna"

メンバ変数の値を変数に代入するかメンバ変数の値を出力することにより、メンバ変数からデータを取り出すことができます。

Dim X As String
X$ = Staff(2).lastName
Print X$              ' Prints Perez.

メンバ変数の宣言時にメモリを節約する

ユーザー定義のデータ型のメンバは、必ずしも連続したメモリ領域に格納されるとは限りません。最初は最も大きい境界を持つメンバを宣言し、最後に最も小さい境界を持つメンバを宣言することにより、データスペースを効率的に使用できます。定義で無駄になったスペースは、そのユーザー定義のデータ型を持つすべての変数でも無駄なスペースになります。

次の例は、適切に位置合わせされた変数を示しています。

Type T1
  m1 As Variant     ' 16 bytes
  m2 As Double      '  8 bytes
  m3 As Long        '  4 bytes
  m4 As String      '  4 bytes
  m5 As Integer     '  2 bytes
  m6(10) As Integer '  2 bytes
  m7 As String * 30 '  1 byte
End Type

ユーザー定義のデータ型の変数は、その変数の中で最大メンバのサイズと等しい境界で格納されます。

次の例は上の例の続きであり、ユーザー定義のデータ型 T1 の各変数がどのように 16 バイト境界で整列されるかを示しています。

Type T2
  m1 As T1'16-byte boundary;T1's largest member boundary is 16.
  m2(3) As Long     ' 4 bytes.
End Type

メンバ変数を宣言する場合、次のことを考慮してください。

ファイルに格納されたデータを操作する

ファイルに格納されたデータを扱うために、ユーザー定義のデータ型を作成することがあります。例えば、次のスクリプトは、ユーザー定義のデータ型の配列に、従業員の駐車スペース情報を含んだサンプル ASCII ファイルを読み込みます。

Comma-delimited text file containing employee ids, names, etc.

Type RecType
  empID As Double                ' Employee ID
  employee As String             ' Employee name 
  theSection As Integer          ' Car parking section
  theSpace As Integer            ' Designated parking space
  theFloor As Integer            ' Car parking level
  

End Type
       
' Dynamic array sizes to fit the lines in the file.
Dim arrayOfRecs() As RecType 
  
Dim txt As String
Dim fileNum As Integer
Dim counter As Integer
Dim countRec As Integer
Dim found As Boolean

fileNum% = FreeFile        ' Get a file number to open a file.
counter% = 0
Open "c:¥myfile.txt" For Input As fileNum%
Do While Not EOF(fileNum%)
    Line Input #fileNum%, txt$  ' Read each line of the file.
    counter% = counter% + 1     ' Increment the line count.
Loop
Seek fileNum%, 1                ' Pointer to beginning of file
' Since file has counter% number of lines, define arrayOfRecs  ' to have that number of elements.
ReDim arrayOfRecs(1 To counter%)
' Read the file contents into arrayOfRecs.
For countRec% = 1 to counter%    
   Input #fileNum%, arrayOfRecs(countrec%).empID, _  
     arrayOfRecs(countRec%).employee, _
     arrayOfRecs(countrec%).theSection, _
     arrayOfRecs(countrec%).theSpace, _ 
     arrayOfRecs(countrec%).theFloor
Next
Close fileNum%
' Elicit an employee's name and look for it in arrayOfRecs.
ans$ = InputBox$("What's your name?")
found = False
For x% = 1 To counter%
   If arrayOfRecs(x%).employee = ans$ Then
       found = True
       Print "Greetings, " & ans$ & "."
       Exit For
   End If
Next
If found = False Then Print "No such employee.