StarSuite 8 Basic プログラミングガイド
  Buscar sólo este libro
Descargar este libro en PDF (1383 KB)

第 3 章 StarSuite Basic の実行時ライブラリ

以降の節では、実行時ライブラリの主要な関数について説明します。

変換関数

プログラムを構築する場合、ある変数の変数型を他の種類に変換する必要がよくあります。

変数型の暗黙的変換と明示的変換

変数型を変換する一番簡単な方法は、代入処理を利用することです。

Dim A As String
Dim B As Integer

B = 101 
A = B

このサンプルコードでは、変数 A は文字列型、変数 B は整数型として宣言しています。 そしてこのような状況で変数 A に変数 B を代入すると、自動的に StarSuite Basic が変数 B の変数型を文字列型に変換します。 このような変換では、見た目よりも複雑な処理が行われており、まず変数 B の整数値が、2 バイト長のデータとして作業用メモリに格納されます。 一方の変数 A は文字列型であるので、各文字 (文字や数字) ごとに 1 または 2 バイト長のデータとしてメモリ内に格納されています。 このため変数 A に変数 B を代入する際には、変数 A 側の内部フォーマットに一致するよう、変数 B のデータを変換しておく必要があります。

他の多くのプログラミング言語とは異なり、Basic の場合、変数型の変換は自動的に実行されます。 ただし、予想外の結果が生じることがあります。 ここで、どのような問題が生じるかについて、以下のサンプルコードを使って検討をしてみます。

Dim A As String
Dim B As Integer
Dim C As Integer

B = 1 
C = 1
A = B + C

一見するとこのコードに特に問題はなさそうですが、目に見えない形で落とし穴が潜んでいます。 Basic インタプリタは、最初に加算演算を行なってから、その結果を文字列変数に代入するので、ここで得られる結果は 2 という文字列になります。

逆に、Basic インタプリタが、最初に変数 B と変数 C の値を文字列に変換し、その結果に対してプラス記号による演算を適用するのであれば、得られる結果は 11 という文字列になります。

同様の問題は、バリアント型変数を使用する際にも生じます。

Dim A 
Dim B 
Dim C 

B = 1 
C = "1"
A = B + C

バリアント型変数には数値と文字列の両方のデータを格納できるため、この変数 A に代入されるのが数値 2 なのか文字列 11 なのかは不明です。

このような変数型の暗黙的変換に起因するエラーを回避するには、プログラム内にバリアント型変数を使用しないなどの点に注意して、プログラミングを行う必要があります。

変数型の暗黙的変換に起因するエラーを防止する観点から、StarSuite Basic には各種の変換関数が用意されており、様々なデータ型に対する変換操作を行えるようになっています。

  • CStr(Var) - 任意の型のデータを文字列に変換します。

  • CInt(Var) - 任意の型のデータを整数値に変換します。

  • CLng(Var) - 任意の型のデータをロング整数値に変換します。

  • CSng(Var) - 任意の型のデータを単精度値に変換します。

  • CDbl(Var) - 任意の型のデータを倍精度値に変換します。

  • CBool(Var) - 任意の型のデータをブール値に変換します。

  • CDate(Var) - 任意の型のデータを日付データに変換します。

これらの変換関数を使用することで、StarSuite Basic による型変換を明示的に実施することができます。

Dim A As String
Dim B As Integer
Dim C As Integer

B = 1 
C = 1

A = CStr(B + C)      ' B と C がまず足され、それから変換されます (2 になります)
A = CStr(B) + CStr(C)   ' B とC がそれぞれ文字列に変換され、
                        ' それから結合されます (文字列「11」になります)

このサンプルコードの最初の変換操作では、StarSuite Basic に整数値の加算を行わせてから、その結果を文字列に変換しています。 変数 A に代入される値は、文字列の 2 となります。 2 番目の変換操作では、整数変数の値を文字列に変換してから、代入時に結合処理を行なっています。 変数 A に代入される値は、文字列の 11 となります。

数値変換用の CSng および CDbl 関数は、小数を扱うこともできます。 ただしこの場合の小数点には、各地域ごとの各ロケール設定で指定されている小数点記号を使用する必要があります。 また逆に、CStr メソッドで数値、日付、時刻のデータを変換する際には、各ロケール設定による書式が適用されます。

Val 関数は、Csng、Cdbl 、Cstr メソッドとは使用法が少し異なります。 この関数は文字列を数値に変換しますが、小数点として使える記号はピリオドに固定されています。

Dim A As String
Dim B As Double

A = "2.22"
B = Val(A)      ' この場合、ロケール設定にかかわらず 
                ' 正しく変換されます

変数の内容の確認

場合によってはデータの変換ができないことがあります。

Dim A As String
Dim B As Date

A = "test"
B = A            ' エラーメッセージを表示

このサンプルコードからも分かるように、日付変数に test という文字列は代入できないので、このような場合 Basic インタプリタはエラーメッセージを表示します。 同様のことは、ブール型変数に文字列を代入するような場合にも当てはまります。

Dim A As String
Dim B As Boolean

A = "test"
B = A            ' エラーメッセージを表示

上記のサンプルコードでも、Basic インタプリタはエラーメッセージを表示します。

このようなエラーは、代入を行う前のプログラム行で、代入させるデータ型が変数型と一致するかをチェックさせることで回避できます。 StarSuite Basic にはこのような処理を行うために、以下のテスト関数が用意されています。

  • IsNumeric(Value) - Value の値が数値であるかチェックします。

  • IsDate(Value) - Value の値が日付であるかチェックします。

  • IsArray(Value) - Value の値が配列であるかチェックします。

これらの関数は、ユーザーからの入力を受け取る際に有用です。 たとえば数値や日付などの、想定される形式のデータをユーザーが入力したかをチェックできます。

If IsNumeric(UserInput) Then
   ValidInput = UserInput
Else
   ValidInput = 0
   MsgBox "Error message."
End If

上記のサンプルコードでは、変数 UserInput の値が数値であれば、その値を変数 ValidInput に代入しています。 変数 UserInput の値が数値でなければ、変数 ValidInput には 0 を代入して、エラーメッセージを表示します。

StarSuite Basic の組み込み関数には、このような数値、日付、配列に対するテスト関数は用意されていますが、ブール値に対するテスト関数は用意されていません。 このようなチェック機能が必要であれば、以下の関数 IsBoolean のような関数を記述することで実装できます。

Function IsBoolean(Value As Variant) As Boolean
   On Error Goto ErrorIsBoolean:
   Dim Dummy As Boolean

   Dummy = Value

   IsBoolean = True
   On Error Goto 0
Exit Sub

ErrorIsBoolean:
   IsBoolean = False
   On Error Goto 0
End Function

上記の関数 IsBoolean では、ブール型の局所変数 Dummy を用意して、与えられたデータをその中に代入させています。 この代入が問題なく実行できれば、関数の戻り値として True を返します。 そして代入に失敗した場合は、実行時エラーが発生するので、このテスト関数の実行は中断され、エラー処理を行います。


注 –

StarSuite Basic では、数値以外の文字列を数値として代入しようとしても、エラーメッセージは表示されませんが、実際には 0 という値が代入されます。 VBA の場合は、これとは異なる処理が行われます。 VBA でこのような代入を行おうとすると、エラーが発生し、処理が中断されます。


文字列

文字コードの操作

StarSuite Basic の文字列操作では、文字コードとして Unicode が使用されます。 Asc および Chr 関数は、Unicode のコード番号と該当する文字との間の変換を行います。 以下のサンプルコードでは、各種の Unicode 記号を該当するコード番号に変換します。

Code = Asc("A")		' アルファベットの A (Unicode 値 65) 
Code = Asc("£")		' ユーロ通貨記号 (Unicode 値 8364) 
Code = Asc("??")		 ' キリル文字の ?? (Unicode 値 1083)

以下のサンプルコードは、これらと逆方向の変換を実行します。

MyString = Chr(13)

ここでは、コード番号 13 が割り当てられている文字 (改行コード) を、文字列変数 MyString に代入しています。

このように Chr 関数は、Basic プログラミング内で制御コードを文字列変数に代入する際によく使われます。 たとえば、以下のサンプルコードのように使用します。

MyString = Chr(9) + "This is a test" + Chr(13)

ここでは、文字列の前にタブコード (Unicode 値 9) を、後ろに改行コード (Unicode 値 13) を付けています。

文字列の一部の取得

StarSuite Basic には、文字列の一部の取得用に、以下の 4 つの関数が用意されています。

  • Left(MyString, Length) - 文字列 MyString の左端から Length 分の文字を取得します。

  • Right(MyString, Length) - 文字列 MyString の右端から Length 分の文字を取得します。

  • Mid(MyString, Start, Length) - 文字列 MyString の左端 Start 文字目から Length 分の文字を取得します。

  • Len(MyString) - 文字列 MyString の文字数を返します。

以下のサンプルコードは、これらの使用例です。

Dim MyString As String 
Dim MyResult As String 
Dim MyLen As Integer

MyString = "This is a small test"

MyResult = Left(MyString,5)      ' 得られる文字列は "This " 
MyResult = Right(MyString, 5)    ' 得られる文字列は " test" 
MyResult = Mid(MyString, 8, 5)   ' 得られる文字列は " a sm" 
MyLen = Len(MyString)            ' 得られる値は 20

検索と置換

StarSuite Basic には、文字列内の部分文字列の検索用に、InStr 関数が用意されています。

ResultString = InStr (SearchString, MyString)

この関数は、文字列変数 SearchString 内に文字列変数 MyString と一致する部分があるかを調べます。 関数の戻り値としては、文字列変数 MyString 内で最初に文字列変数 SearchString が現れる位置を、数値で返します。 また、該当する部分文字列が何カ所もあるような場合は、何文字目から検索を始めるかをオプション指定できます。 このオプションは、以下の形式で記述します。

ResultString = InStr(StartPosition, MyString, SearchString)

また上記のいずれの場合も、InStr 関数は文字列の大文字と小文字を無視します。 InStr 関数で大文字と小文字を区別させるには、以下のように最終パラメータとして 0 を追加します。

ResultString = InStr(MyString, SearchString, 0)

これまでに説明した文字列操作用の関数を組み合わせると、以下のような文字列の置換関数を作成できます。

Function Replace(Source As String, Search As String, NewPart As String)
 Dim Result As String
 Dim StartPos As Long
 Dim CurrentPos As Long
 
 Result = ""
 StartPos = 1
 CurrentPos = 1
 
 If Search = "" Then
       Result = Source
   Else 
       Do While CurrentPos <> 0
           CurrentPos = InStr(StartPos, Search, Source)
           If CurrentPos <> 0 Then
               Result = Result + Mid(Source, StartPos, _
                   CurrentPos - StartPos)
               Result = Result + NewPart
               StartPos = CurrentPos + Len(Search)
           Else
               Result = Result + Mid(Source, StartPos, Len(Source))
           End If ' Position <> 0
       Loop 
   End If 
   Replace = Result
End Function

この関数は、ループ内に InStr 関数を配置して、文字列パラメータ Source 内にある文字列パラメータ Search の該当位置を検索します。 検索がヒットしたら、該当位置より前の部分を取得して、バッファ用の文字列変数 Result に格納します。 そして、文字列パラメータ Search の該当位置を置き換えるよう、文字列パラメータ NewPart を挿入します。 上記の手順を繰り返し、検索する文字列の残りの部分に該当位置がなくなった段階で、この部分をバッファ用文字列の末尾に追加します。 こうして得られた文字列を関数の戻り値として返しますが、これが該当箇所を置換した文字列となります。

このような文字列の一部を置換するという作業は使用頻度が高いため、StarSuite Basic の Mid 関数には、これを行うための拡張機能が用意されています。 この機能は、以下のサンプルコードのようにして使用します。

Dim MyString As String

MyString  = "This was my text"
Mid(MyString, 6, 3, "is")

この例では、文字列 MyString の 6 文字目から 3 文字分を is という文字列に置き換えています。

文字列の書式設定

Format 関数は、数値に書式設定を施した上で文字列に変換します。 このような処理を行う際には、数値の書式設定用テンプレートを指定する必要がありますが、この関数ではパラメータ Format として指定します。 テンプレートは、最終的に出力する文字種に対応したプレースホルダを並べて指定します。 使用頻度の高いプレースホルダは、ゼロ (0)、ナンバー記号 (#)、ピリオド記号 (.)、コンマ記号 (,) ドル記号 ($) の 5 種類です。

ゼロ は、該当桁に数字を表示させるための記号です。 該当桁に数値が来ない場合は、0 が表示されます。

ピリオド記号 は、小数点の位置を指定するための記号で、小数点はオペレーティングシステムのロケール設定に応じたものが使用されます。

以下のサンプルコードは、ゼロピリオド による書式指定により数値の小数部が処理される例を示します。


MyFormat = "0.00"

MyString = Format(-1579.8, MyFormat)     ' 結果は "-1579.80" 
MyString = Format(1579.8, MyFormat)      ' 結果は "1579.80" 
MyString = Format(0.4, MyFormat)         ' 結果は "0.40" 
MyString = Format(0.434, MyFormat)       ' 結果は "0.43"

また、数値の整数部の桁数がテンプレートよりも小さい場合、該当桁には 0 が表示されます。

MyFormat = "0000.00"

MyString = Format(-1579.8, MyFormat)     ' 結果は "-1579.80" 
MyString = Format(1579.8, MyFormat)      ' 結果は "1579.80" 
MyString = Format(0.4, MyFormat)         ' 結果は "0000.40" 
MyString = Format(0.434, MyFormat)       ' 結果は "0000.43"

カンマ記号 は、千単位の桁区切り位置を指定するための記号で、オペレーティングシステムのロケール設定に応じた桁区切り記号を表示させます。ナンバー記号 は、該当桁の数字を表示させるよう指定する記号ですが、該当桁に数値が無い場合は何も表示させません。

MyFormat = "#,##0.00"

MyString = Format(-1579.8, MyFormat)     ' 結果は "-1,579.80" 
MyString = Format(1579.8, MyFormat)      ' 結果は "1,579.80" 
MyString = Format(0.4, MyFormat)         ' 結果は "0.40" 
MyString = Format(0.434, MyFormat)       ' 結果は "0.43"

ドル記号 は通貨記号を表示させるための記号で、Format 関数で表示される通貨記号は、オペレーティングシステムのロケール設定に応じたものが使用されます。

MyFormat = "#,##0.00 $"   
         
MyString = Format(-1579.8, MyFormat)     ' 結果は "-1,579.80—" 
MyString = Format(1579.8, MyFormat)      ' 結果は "1,579.80—" 
MyString = Format(0.4, MyFormat)         ' 結果は "0.40—" 
MyString = Format(0.434, MyFormat)       ' 結果は "0.43—"

注 –

VBA で用意されている日付および時刻の書式設定用プレースホルダは、StarSuite Basic ではサポートされていません。


日付および時刻

StarSuite Basic に用意されている Date 型データは、日付および時刻の情報をバイナリ形式で格納しています。

プログラムコード内での日付と時刻の指定

日付変数へ代入する日付データは、文字列として指定します。

Dim MyDate As Date

MyDate = "1.1.2002"

このような文字列形式の日付変数へ代入した場合、StarSuite Basic は自動的に必要なデータ変換を実行します。 ただし、日付や時刻の表示形式は地域ごとに異なる場合があるので、このような差異に起因したエラーの発生する危険性があります。

StarSuite Basic はオペレーティングシステムのロケール設定に応じて日付データを変換するため、上記のサンプルコードはこの書式の該当する地域でしか正常に動作しません。

このような問題を回避するには、DateSerial 関数を使用して日付データを指定するようにします。

Dim MyVar As Date
MyDate = DateSerial (2001, 1, 1)

この関数に与えるパラメータは、年、月、日の順番で指定するよう固定されています。 そのためこの関数を使用することで、ロケール設定に影響されることなく、一定の形式で日付データの指定が行えます。

時刻の場合は TimeSerial 関数を用いることで、DateSerial 関数と同様の処理が行えます。

Dim MyVar As Date

MyDate =  TimeSerial(11, 23, 45)

この関数に与えるパラメータは、時、分、秒の順番で指定します。

日付および時刻の取得

以下の関数は、DateSerial 関数および TimeSerial 関数と逆方向の操作を行うためのものです。

  • Day(MyDate) - MyDate に該当する日を返します。

  • Month(MyDate) - MyDate に該当する月を返します。

  • Year(MyDate) - MyDate に該当する年を返します。

  • Weekday(MyDate) - MyDate に該当する曜日を示す数値を返します。

  • Hour(MyTime) - MyTime に該当する時刻の時を返します。

  • Minute(MyTime) - MyTime に該当する時刻の分を返します。

  • Second(MyTime) - MyTime に該当する時刻の秒を返します。

これらの関数は、指定した日付データに該当する、日付や時刻の情報を取得します。 以下のサンプルコードは、これらの使用例です。

Dim MyDate As Date
' ... 変数 MyDate を初期化

If Year(MyDate) = 2003 Then

   ' ... 該当年が 2003 年の場合

End If

上記の例では、変数 MyDate の日付データが 2003 年に該当するかをチェックしています。 以下のサンプルコードも同様です。

Dim MyTime As Date
' ... 変数 MyTime を初期化

If Hour(MyTime) >= 12 And Hour(MyTime) < 14 Then

   ' ... 該当時刻が 12 時から 14 時の間の場合

End If

上記の例では、変数 MyDate の該当時刻が 12 時から 14 時の間にあるかをチェックしています。

Weekday 関数は、与えられた日付データを基に、該当する曜日を示す数値を返します。

Dim MyDate As Date 
Dim MyWeekday As String

' ... 変数 MyDate を初期化

Select Case WeekDay(MyDate)
case 1
   MyWeekday = "Sunday"
case 2
   MyWeekday = "Monday"
case 3
   MyWeekday = "Tuesday"
case 4
   MyWeekday = "Wednesday"
case 5
   MyWeekday = "Thursday"
case 6
   MyWeekday = "Friday"
case 7
   MyWeekday = "Saturday"
End Select

注 –

ここでは、週の第 1 曜日は日曜日 (Sunday) と仮定しています。


システム日付と時刻の取得

StarSuite Basic には、システム日付と時刻の取得用に、以下の関数が用意されています。

  • Date - 現在の日付を取得して返します。

  • Time - 現在の時刻を取得して返します。

  • Now - 現在の日付と時刻を取得して返します (日付と時刻を 1 つに合わせたデータ)。

ファイルおよびディレクトリの操作

ファイル操作は、アプリケーションの基本機能の 1 つです。 StarSuite API には、StarSuite ドキュメントの作成、オープン、編集用に必要となる、各種のオブジェクトが用意されています。 詳細情報については、第 4 章「StarSuite API について」を参照してください。 また状況によっては、ファイルシステムの直接アクセス、ディレクトリの検索、テキストファイルの編集などを行う必要もあります。 StarSuite Basic の実行時ライブラリには、このような処理を行うための各種の関数が用意されています。


注 –

ファイルおよびディレクトリ関係の機能のうち DOS 固有のものは、StarSuite 8 でサポートされなくなったか、使用に制限が付くようになりました。 たとえば、ChDir 関数、ChDrive 関数、CurDir 関数は現行バージョンでは使用できません。 また DOS 固有の属性についても、ファイル属性をパラメータとする関数での使用が行えなくなっています (たとえば、隠しファイルとシステムファイルの区別など)。 これらは、StarSuite のプラットフォーム独立性を確保するために必要な措置の一環です。


ファイル操作

ディレクトリ内のファイル検索

StarSuite Basic でディレクトリシステム内でのファイルやサブディレクトリの検索を行うには、Dir 関数を使用します。 Dir 関数を最初に使用する際には、検索するディレクトリのパスを第 1 パラメータとして指定する必要があります。 Dir 関数の第 2 パラメータには、検索するファイルやディレクトリの名前を指定します。 この関数の戻り値としては、最初にヒットしたディレクトリエントリが StarSuite Basic に返されます。 次の該当エントリを取得するには、パラメータを付けずに再度 Dir 関数を呼び出します。 該当するエントリが存在しなかった場合、Dir 関数は空白文字列を返します。

以下のサンプルコードでは、Dir 関数を使って、指定ディレクトリ内に存在するすべてのファイルを一覧表示します。 この手続きでは、個々のファイル名を変数 AllFiles に記録してゆき、最後の段階でメッセージボックスに一括表示させています。

Sub ShowFiles
   Dim NextFile As String
   Dim AllFiles As String

   AllFiles = ""
   NextFile = Dir("C:\", 0)

   While NextFile  <> ""
      AllFiles = AllFiles & Chr(13) &  NextFile 
      NextFile  = Dir
   Wend

   MsgBox AllFiles
End Sub

Dir 関数の第 2 パラメータに 0 を指定しているのは、ディレクトリを無視してファイル名のみを Dir 関数の戻り値に返させるためです。 このようなパラメータ値としては、以下のものを指定できます。

  • 0 : 通常のファイルのみを対象とする。

  • 16 : サブディレクトリのみを対象とする。

以下のサンプルコードでは、基本的に上記のものと同じ処理を行なっていますが、こちらは Dir 関数の第 2 パラメータに 16 を指定しているので、ファイルではなくサブディレクトリを対象にしています。

Sub ShowDirs
   Dim NextDir As String
   Dim AllDirs As String
   AllDirs = ""
   NextDir = Dir("C:\", 16)
   While NextDir <> ""
      AllDirs = AllDirs & Chr(13) &  NextDir
      NextDir  = Dir
   Wend
   MsgBox AllDirs
End Sub

注 –

StarSuite Basic の Dir 関数にパラメータ値 16 を指定すると、該当ディレクトリ内のサブディレクトリのみが返されます。 VBA で同様の処理を行うと、サブディレクトリだけでなく通常のファイルも返されるので、ディレクトリ名のみを取得するには追加の操作が必要です。 CompatibilityMode ( true ) 関数を使用すると、StarSuite Basic は VBA と同様に動作します。つまり、Dir 関数のパラメータに 16 を指定すると、サブディレクトリだけでなく通常のファイルも返されます。



注 –

VBA では、隠しファイルシステムファイルアーカイブファイルボリューム名などの属性に基づいた検索オプションを利用できます。StarSuite Basic の場合、このようなファイル機能の存在しないオペレーティングシステム上での操作も前提としているため、該当するオプションは用意されていません。



注 –

Dir 関数のパス指定において、* および ? のプレースホルダは VBA および StarSuite Basic の双方で利用できます。 ただし VBA とは異なり、StarSuite Basic で * プレースホルダを使用すると、ファイル拡張子かファイル名の最後の文字のみが一致する場合があります。


ディレクトリの作成および削除

StarSuite Basic でディレクトリを作成するには、MkDir 関数を使用します。

    
MkDir ("C:\SubDir1")

この関数は、ディレクトリおよびサブディレクトリを作成します。 また必要であれば、指定ディレクトリに対する下層ディレクトリも作成できます。 たとえば C:\SubDir1 ディレクトリのみが存在する状況で以下のコードを実行したとします。

MkDir ("C:\SubDir1\SubDir2\SubDir3\")

これにより、C:\SubDir1\SubDir2 ディレクトリおよび C:\SubDir1\SubDir2\SubDir3 ディレクトリが作成されます。

ディレクトリを削除するには、RmDir 関数を使用します。

    
RmDir ("C:\SubDir1\SubDir2\SubDir3\")

指定ディレクトリ内にサブディレクトリやファイルが存在する場合、これらも 削除 されます。 このため、RmDir 関数を使用する際には注意が必要です。


注 –

VBA の MkDir 関数および RmDir 関数は、現在のディレクトリのみを操作対象とします。 これに対して StarSuite Basic の MkDir 関数および RmDir 関数では、複数階層を対象とした操作が行えます。



注 –

VBA の RmDir 関数で、ファイルを含むディレクトリを削除しようとするとエラーメッセージが表示されます。 StarSuite Basic の場合は、指定ディレクトリ およびその中のすべてのファイル が削除されます。 CompatibilityMode ( true ) 関数を使用すると、StarSuite Basic は、VBA と同じように動作します。


ファイルのコピー、名前変更、削除および存在確認

ファイルのコピーは、以下のようにして実行します。

FileCopy(Source, Destination)

この場合は Source という名前のファイルを、Destination という名前でコピーします。

ファイルの名前変更は、以下のようにして実行します。

Name OldName As NewName

この場合は、OldName というファイルの名前を NewName に変更します。 このようにコンマを使わずキーワード As を使用するのが、Basic 言語の基本形です。

ファイルの削除は、以下のようにして実行します。

Kill(Filename)

この場合は、Filename という名前のファイルを削除します。 ディレクトリ (およびその中のファイル) を削除するには、RmDir 関数を使用してください。

特定のファイルが存在するかを確認するには、FileExists 関数を使用します。

If FileExists(Filename) Then 
   MsgBox "file exists."
End If

ファイル属性の取得と変更

ファイル関連の処理を行う際には、ファイル属性の変更、最終変更日の取得、ファイルサイズの確認などの操作が必要となる場合があります。

このような情報を取得するには、たとえば以下のようなコードを記述します。

Dim Attr As Integer
Attr = GetAttr(Filename)

この場合は、指定ファイルの属性を取得しています。 戻り値はビットマスクの形式で返され、その中には以下のような情報が含まれています。

  • 1 : 読み取り専用のファイル

  • 16 : ディレクトリ名

以下のサンプルコードでは、この情報を利用しています。

Dim FileMask As Integer
Dim FileDescription As String
   
FileMask = GetAttr("test.txt")
If (FileMask AND 1) > 0 Then
   FileDescription = FileDescription & " read-only "
End IF

If (FileMask AND 16) > 0 Then
   FileDescription = FileDescription & " directory "
End IF

If FileDescription = "" Then
   FileDescription = " normal "
End IF

MsgBox FileDescription

ここでは、test.txt という名前のファイルのビットマスクを取得して、その情報を基に、読み取り専用であるかどうか、またディレクトリであるかどうかを調べています。 どちらにも該当しなかった場合は、変数 FileDescription に「normal」という文字列を代入させています。


注 –

VBA では、隠しファイルシステムファイル、アーカイブファイルボリューム名のファイル属性を示すフラグを利用できますが、これらは Windows 固有の機能であり、StarSuite Basic の場合は、このような機能の存在しないオペレーティングシステム上での操作も前提としているため、これらのフラグはサポートされていません。


ファイル属性を変更するには、SetAttr 関数を使用します。 この関数は、たとえば以下のように使用します。

SetAttr("test.txt", 1)

この場合は、指定ファイルに読み取り専用の属性を設定しています。 逆に、ファイルの読み取り専用属性を解除するには、以下のように指定します。

SetAttr("test.txt", 0)

ファイルを最後に変更した日付と時刻を調べるには、FileDateTime 関数を使用します。 このようにして得られる日付の書式は、システムのロケール設定に従います。

FileDateTime("test.txt")   ' ファイルを最後に変更した日付と時刻を取得。

ファイルサイズを調べるには、FileLen 関数を使用します (戻り値はロング整数のバイト値)。

FileLen("test.txt")      ' ファイルサイズをバイト値で取得。

テキストファイルの書き込みと読み取り

StarSuite Basic には、ファイルの書き込みおよび読み取り用の各種メソッドが用意されています。 以下の説明は、テキストファイル関係の機能をまとめたものです (注意: StarSuite の文書ドキュメントに関するものでは ありません)。

テキストファイルへの書き込み

テキストファイルにアクセスするには、該当ファイルを事前にオープンしておく必要があります。 その際には、フリーの ファイルハンドル を使って、アクセスするファイルを特定します。

フリーのファイルハンドルの取得には、FreeFile 関数を使用します。 このハンドルは、Open 命令によるファイルオープン時にパラメータとして指定します。 テキストファイルとしてファイルをオープンするには、以下のように Open 命令を記述します。

Open Filename For Output As #FileNo

ここで Filename には、ファイル名を文字列の形で指定します。 同じく FileNo には、FreeFile 関数で取得しておいたファイルハンドルを指定します。

オープンしたファイルに対しては、Print 命令により、1 行単位の書き込みが行えます。

Print #FileNo, "This is a test line."

ここでも FileNo はファイルハンドルを示します。 第 2 パラメータのテキストは、テキストファイルへ書き込む行の内容を示します。

書き込みの終了したファイルに対しては、Close によるクローズ処理が必要です。

    
Close #FileNo

この場合も、ファイルハンドルを指定する必要があります。

以下のサンプルコードは、ファイルのオープンから、書き込み、クローズまでの流れを示します。

Dim FileNo As Integer 
Dim CurrentLine As String 
Dim Filename As String

Filename = "c:\data.txt"            ' ファイル名の指定 
FileNo = Freefile               ' フリーのファイルハンドルの取得

Open Filename For Output As #FileNo         ' ファイルのオープン (書き込みモード) 
Print #FileNo, "This is a line of text"      ' 行単位で書き込み 
Print #FileNo, "This is another line of text"   ' 行単位で書き込み 
Close #FileNo                  ' ファイルのクローズ

テキストファイルの読み取り

テキストファイルの読み取りは、書き込みと同様の手順で行います。 ただし Open 命令によるファイルのオープン時には For Output の代わりに For Input を指定し、Print 命令によるデータの書き込みではなく Line Input 命令によるデータの読み込みを行う点が異なります。

また、テキストファイルの最後まで読み込んだかは、以下のようにして確認します。

eof(FileNo)

これは、ファイルの末尾 (eof) に到達したかを判定します。

以下のサンプルコードは、テキストファイルからのデータの読み取り手順を示します。

Dim FileNo As Integer
Dim CurrentLine As String
Dim File As String
Dim Msg as String

' Define filename 
Filename = "c:\data.txt"

' Establish free file handle
FileNo = Freefile

' Open file (reading mode)
Open Filename For Input As FileNo

' Check whether file end has been reached

Do While not eof(FileNo)
   ' 行単位で読み込み
   Line Input #FileNo, CurrentLine   
   If CurrentLine <>"" then
      Msg = Msg & CurrentLine & Chr(13)
   end if
Loop

' ファイルのクローズ
Close #FileNo               

Msgbox Msg

ここでは、Do While ループを使ってデータを 1 行ずつ読み出しては、変数 Msg に追加することにより格納してゆき、最後にまとめてメッセージボックスに出力させています。

メッセージボックスとインプットボックス

StarSuite Basic には、ユーザーへの入出力用に、MsgBox および InputBox 関数が用意されています。

メッセージの出力

MsgBox を使うと、簡単なメッセージ表示用のダイアログを表示できるだけでなく、その中に 1つまたは複数のボタンを配置できます。 以下のサンプルコードを実行すると、最も単純な形のダイアログが表示されます。

MsgBox "This is a piece of information!"

この場合の MsgBox は、メッセージテキストと OK ボタンのみを表示します。

メッセージボックスの表示形態は、パラメータ指定により変更できます。 ここでは、ボタンの種類、標準ボタン、追加表示するアイコンをパラメータ指定により設定できます。 ボタンの指定は、以下の数値を通じて行います。

  • 0 - OK ボタンのみを表示します。

  • 1 - OK およびキャンセルの各ボタンを表示します。

  • 2 - キャンセルおよびやり直しの各ボタンを表示します。

  • 3 - はい、いいえ、キャンセルの各ボタンを表示します。

  • 4 - はい、いいえの各ボタンを表示します。

  • 5 - やり直しおよびキャンセルの各ボタンを表示します。

なお、表示ボタンの指定用パラメータ値に以下の値を加えることで、いずれか 1 つのボタンを標準ボタンに設定できます。 たとえば、はい、いいえ、キャンセルの各ボタンを表示させ (指定値 3)、キャンセルを標準ボタンに設定する (指定値 512) には、両者の値を加えた 3 + 512 = 515 を指定します。

  • 0 - 1 番目のボタンを標準ボタンに設定します。

  • 256 - 2 番目のボタンを標準ボタンに設定します。

  • 512 - 3 番目のボタンを標準ボタンに設定します。

また、以下の値をパラメータ値に加えることで、該当するアイコンを追加表示できます。

  • 16 -ストップ記号のアイコンを表示します。

  • 32 - 疑問符アイコンを表示します。

  • 48 - 感嘆符アイコンを表示します。

  • 64 - ヒント記号のアイコンを表示します。

このようなパラメータ値は、以下のように指定します。

MsgBox "Do you want to continue?",  292

この場合は、はいといいえのボタンを表示させて (指定値 4)、2 番目のボタン (いいえ) を標準ボタンに設定し (指定値 256)、疑問符アイコンを表示させる (指定値 32) ので、パラメータ値として 4 + 256 + 32 = 292 を指定します。

メッセージボックスに複数のボタンを表示した場合、通常は、どのボタンをユーザーが押したかを確認する処理が必要となります。 このような処理には、以下の戻り値を利用します。

  • 1 - OK

  • 2 - キャンセル

  • 4 - やり直し

  • 5 - 無視

  • 6 - はい

  • 7 - いいえ

たとえば先のサンプルコードの場合、戻り値の判定は以下のようにして行えます。

If MsgBox ("Do you want to continue?",  292) = 6 Then 
   ' はいのボタンが押された場合 
Else 
   ' いいえのボタンが押された場合 
End IF

MsgBox では、メッセージとして表示するテキストおよび表示ボタンの指定用パラメータの他に、第 3 のパラメータとしてメッセージボックスのタイトルを設定できます。

MsgBox "Do you want to continue?",  292, "Box Title"

このメッセージボックスのタイトル指定を省略した場合、「soffice」が標準タイトルとして使用されます。

インプットボックスと簡単な文字列入力

ユーザーからの簡単な文字列入力を受け付けるには、InputBox 関数を使用します。 このような処理に関しては、ダイアログを構築するよりも、この関数を利用する方が簡単です。 InputBox 関数には、以下の 3 つのパラメータを指定します。

  • 説明用のテキスト

  • インプットボックスのタイトル

  • 入力フィールドに表示しておく標準値

InputVal = InputBox("Please enter value:", "Test", "default value")

InputBox 関数の戻り値には、ユーザーの入力した文字列が返されます。

その他の関数

Beep

不正な操作が行われた場合に警告音を鳴らすには、Beep 関数を使ってシステムのビープ音を発生させます。 Beep 関数に指定するパラメータは存在しません。

Beep   ' 警告音を鳴らします

Shell

外部プログラムを起動させるには、Shell関数を使用します。

Shell(Pathname, Windowstyle, Param)

ここで Pathname には、実行する外部プログラムのパス名を指定します。 Windowstyle には、プログラム起動時のウィンドウのスタイルを指定します。 ここには、以下のいずれかの値を指定できます。

  • 0 - プログラムウィンドウを非表示にして、フォーカスを移動します。

  • 1 - プログラムウィンドウを標準サイズにして、フォーカスを移動します。

  • 2 - プログラムウィンドウを最小化 (アイコン化) して、フォーカスを移動します。

  • 3 - プログラムウィンドウを最大表示にして、フォーカスを移動します。

  • 4 - プログラムウィンドウを標準サイズにしますが、フォーカスは移動しません。

  • 6 - プログラムウィンドウを最小化しますが、フォーカスは現在のウィンドウにとどめておきます。

  • 10 - プログラムウィンドウを全画面表示にします。

第 3 パラメータ Param には、実行するプログラムに渡すコマンド行パラメータを指定できます。

Wait

プログラムの実行を特定の時間中断させるには、Wait 関数を使用します。 待機させる時間は、ミリ秒単位で指定します。 これは、以下のサンプルコードのように記述します。

Wait 2000

この場合の待機時間は、2 秒 (2000 ミリ秒) です。

Environ

オペレーティングシステムの環境変数を取得するには、Environ 関数を使用します。 こうして得られる情報は、使用するシステムや環境ごとに異なります。 この関数は、以下のように使用します。

Dim TempDir

TempDir=Environ ("TEMP")

この場合は、オペレーティングシステムの一時ディレクトリに関する環境変数を取得しています。