変換関数 (Apache OpenOffice 実行時ライブラリ)

From Apache OpenOffice Wiki
Jump to: navigation, search
doc OOo
Book.png

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

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

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

Dim A As String
Dim B As Integer
 
B = 101 
A = B

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

他の多くのプログラミング言語とは異なり、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 なのかは不明です。

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

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

CStr(Var)
任意の型のデータを文字列に変換します。
CInt(Var)
任意の型のデータを整数値に変換します。
CLng(Var)
任意の型のデータをロング整数値に変換します。
CSng(Var)
任意の型のデータを単精度値に変換します。
CDbl(Var)
任意の型のデータを倍精度値に変換します。
CBool(Var)
任意の型のデータをブール値に変換します。
CDate(Var)
任意の型のデータを日付データに変換します。

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

Dim A As String
Dim B As Integer
Dim C As Integer
 
B = 1 
C = 1
A = CStr(B + C)         ' B and C are added together first, then
                        ' converted to the string "2"
A = CStr(B) + CStr(C)   ' B and C are converted into a string,then
                        ' combined to produce the string "11"

このサンプルコードの最初の変換操作では、Apache OpenOffice 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)      ' Is converted correctly regardless of the
                ' country-specific settings

変数の内容の確認

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

Dim A As String
Dim B As Date
 
A = "test"
B = A            ' Creates error message

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

Dim A As String
Dim B As Boolean
 
A = "test"
B = A            ' Creates error message

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

このようなエラーは、代入を行う前のプログラム行で、代入させるデータ型が変数型と一致するかをチェックさせることで回避できます。Apache OpenOffice 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 を代入して、エラーメッセージを表示します。

Apache OpenOffice 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 を返します。そして代入に失敗した場合は、実行時エラーが発生するので、このテスト関数の実行は中断され、エラー処理を行います。

Documentation note.png Apache OpenOffice Basic の文字列に含まれている数値以外の値が数字に割り当てられていると、Apache OpenOffice Basic はエラーメッセージを表示せず、最初の無効な文字で文字列の変換を停止します。VBA の場合は、これとは異なる処理が行われます。VBA でこのような代入を行おうとすると、エラーが発生し、処理が中断されます。


Content on this page is licensed under the Public Documentation License (PDL).
Personal tools