Contained WithinFind More DocumentationFeatured Support Resources | Download this book in PDF (1383 KB)
第 2 章 StarSuite Basic のプログラミング言語StarSuite Basic は、いわゆる Basic プログラミング言語の一種です。 また StarSuite Basic には、Microsoft Visual Basic for Applications および Microsoft Visual Basic と共通する部分が多くあります。 これらの言語を扱った経験があれば、StarSuite Basic は簡単にマスターできるでしょう。 また Java 、C++ 、Delphi など、他のプログラミング言語のプログラマにとっても、StarSuite Basic は簡単にマスターできるはずです。 StarSuite Basic は、完全な手続き型のプログラミング言語であり、従来使われていた GoTo や GoSub などを必要としません。 また StarSuite Basic はオブジェクト指向型のプログラミング言語でもあり、外部オブジェクトライブラリを使用するためのインターフェースも用意されています。 StarSuite API のインターフェースの詳細については、後述します。 本章では、StarSuite Basic プログラミング言語の主要コンポーネント、および StarSuite Basic を用いたアプリケーションやライブラリの概要について説明します。 StarSuite Basic プログラムの概要StarSuite Basic はインタプリタ型の言語です。 StarSuite のコンパイラでは、C++ や Turbo Pascal とは異なり、自動実行型の実行可能ファイル (EXE ファイル) を作成することはできません。 StarSuite Basic のプログラムは、ボタンをクリックして実行します。 これらのコードは、事前に文法的なチェックが行われてから、1 行ずつ実行されます。 プログラム行Basic インタプリタには、コードを 1 行ずつ実行していくという点で、他のプログラミング言語と大きく異なる点があります。 たとえばソースコード内に改行記号がある場合、Java 、C++ 、Delphi などのプログラミング言語では、このような改行記号は無視されますが、Basic 言語の場合は、改行コードまでの 1 行が 1 つのプログラミングコードとして完結している必要があります。 同様に、関数呼び出しや数値演算および、関数やループのヘッダ部なども、1 行の中に収まっている必要があります。 ただし、コードを記入する表示スペースが足りなかったり、極端に長い行になるような場合は、下線記号 (_) を末尾に追加することで、複数の行を 1 行と認識させることができます。 以下のサンプルコードでは、実質的に 1 行の数値演算行を、見かけ上 4 行に分割しています。 LongExpression = (Expression1 * Expression2) + _ (Expression3 * Expression4) + _ (Expression5 * Expression6) + _ (Expression7 * Expression8) 注 – 下線記号は、行の末尾に記入する必要があり、スペース記号やタブ記号を続けることはできず、そのような場合はエラーが発生します。 このような行の分割機能に加えて StarSuite Basic では、コロン記号を挿入することで、1 行を複数のセクションに分割することができます。この機能はコードの表示スペースを整える場合に有用です。 たとえば以下のコードは、 a = 1 a = a + 1 a = a + 1 次のように 1 行にまとめることができます。 a = 1 : a = a + 1 : a = a + 1 コメントStarSuite Basic のプログラムコード内には、通常の実行行以外にコメント行を記述することができ、プログラム各部の説明および、各種の参考情報などを記入しておくことができます。 StarSuite Basic の場合、プログラムコード内へのコメント行の記述は、以下の 2 通りの方法が可能です。
Dim A ' これは変数 A に関するコメントです。
Rem キーワード Rem に続けた部分もコメントとみなされます。 通常これらのコメントは、該当行の末尾までがコメントの内容となります。 それ以降の行は、StarSuite Basic により通常の実行行として解釈されます。 複数行にわたるコメントを記述する場合は、各行ごとにコメント指定記号を付ける必要があります。 Dim B ' これは変数 B に関するコメントですが、複数行
' にわたる長めの文章となっています。そのよう
' な場合は、コメント指定記号を各行に付ける必
' 要があります。
マーカーStarSuite Basic のプログラム内には、数十から数千個の マーカー (変数、定数、関数などの名前) を設定することができます。 マーカーの名前は、以下の命名規則に従う必要があります。
注 – StarSuite Basic と VBA では、マーカーの記述規則が異なります。 たとえば StarSuite Basic では、Option Compatible を指定した場合のみ、マーカーに特殊文字が使えるようになっていますが、これは多言語プロジェクトを扱う際に問題を生じる可能性があるためです。 次に、使用できるマーカーと使用できないマーカーの例をいくつか示します。 Surname ' 有効 Surname5 ' 有効 (数字の 5 が先頭に来ていないので有効) First Name ' 無効 (スペース記号は使えない) DéjàVu ' 無効 (éやàなどの欧文特殊文字は使えない) 5Surnames ' 無効 (数字は先頭に使えない) First,Name ' 無効 (コンマやピリオド記号は使えない) 変数の使用法変数の暗黙的宣言一般に Basic 言語は、簡易的な記法を許可するように設計されています。 このような流れを受けて、StarSuite Basic でも変数の使用法が簡易化されており、明示的な宣言をすることなく変数を使用できます。 このためコード内に使われる変数名は、最初に記述された段階で実態として存在するようになります。 既にどのような変数が存在するかにもよりますが、以下のサンプルコードを記述するだけで、最大 3 つの変数が宣言されたことになります。 a = b + c ただし、このような暗黙的な変数宣言は、タイプミスなどによる混乱を招く場合もあるため、推奨されるプログラミングスタイルではありません。 たとえば、間違った変数名を入力しても、エラーメッセージは出力されません。インタプリタは、新しい変数名が宣言されたと判断して、初期値として 0 を割り当てて処理を継続します。 このようなバグは、コード内の該当箇所を特定するのが困難です。 変数の明示的宣言変数の暗黙的宣言に伴うエラーを防止する観点から、StarSuite Basic には以下のような機能が用意されています。 Option Explicit このコードは、各モジュールのプログラム先頭行に記述する必要があります。この機能を使用することで、明示的に宣言されていない変数があった場合にエラーメッセージが表示されるようになります。 また、この Option Explicit は、すべての Basic モジュールに記述する必要があります。 変数の明示的な宣言方法として、以下のようなコマンドを記述するのが最も簡単です。 Dim MyVar このサンプルコードでは、MyVar という名前の変数を宣言し、その変数型をバリアント型としています。 バリアント型の変数とは、文字列型、整数型、浮動小数点型、ブール型など、使用可能なすべての変数型データを格納できる変数のことです。 以下は、各種のバリアント型変数の例です。 MyVar = "Hello World" ' 文字列型データを割り当て MyVar = 1 ' 整数型データを割り当て MyVar = 1.0 ' 浮動小数点型データを割り当て MyVar = True ' ブール型データを割り当て 上記のようにして宣言された変数には、同一プログラム内でほかの変数型のデータを割り当てることもできます。 ただし、バリアント型変数を使うと柔軟な操作が行えますが、変数は特定の変数型に固定して使用する方が賢明です。 また、変数型の一致しないデータ操作が行われると、StarSuite Basic はエラーメッセージを表示します。 特定の変数型に固定して変数宣言を行うには、以下のようにします。 Dim MyVar As Integer ' 数値型の変数を宣言 この変数は整数型として宣言され、整数型データを格納することができます。 数値型の変数宣言は、以下のようにしても行えます。 Dim MyVar% ' 数値型の変数を宣言 Dim による変数宣言では、複数の変数宣言を一度に行えます。 Dim MyVar1, MyVar2 特定の変数型を指定して変数宣言する場合は、各変数に変数型を指定する必要があります。 Dim MyVar1 As Integer, MyVar2 As Integer 変数型を指定しないと、StarSuite Basic はバリアント型として変数宣言を行います。 たとえば、以下のサンプルコードでは、MyVar1 はバリアント型、MyVar2 は整数型として宣言しています。 Dim MyVar1, MyVar2 As Integer 以降の節では、StarSuite Basic で使用可能な変数型を示し、それらの使用法および宣言法を説明します。 文字列型文字列型は、数値型とあわせて、StarSuite Basic で最も多用される変数型です。 文字列とは、一連の文字を並べた形で構成されるデータです。 コンピュータ内の処理において文字列は、個々の文字を示す固有の数値として記録されます。 ASCII コードから Unicode コードまで文字コードセットとは、文字列を構成する各文字とそのコード番号の対応関係を示すもので、コンピュータによる画面への文字出力も、この文字コードセットに応じて処理されます。 ASCII 文字コードセットASCII 文字コードセットとは、数字、アルファベット、特殊記号に 1 バイトのコード番号を割り当てたものです。 ASCII コードでは 0 から 127 までのコード番号がアルファベットおよびその他の記号 (ピリオド、カッコ、コンマなど) に割り当てられており、その中には画面およびプリンタ制御用の特殊コードなども定義されています。 通常、コンピュータ間でテキストデータを交換する際には、この ASCII 文字コードセットが標準的なフォーマットとして利用されています。 ただし、この文字コードセットでは、â、ä、î などの欧文特殊文字や、キリル文字などは含まれていません。 ANSI 文字コードセットMicrosoft 社の Windows 製品では、American National Standards Institute (ANSI) 文字コードセットが採用されていますが、この中には ASCII 文字コードセット内に存在しない文字も含めるよう拡張されています。 コードページISO 8859 文字コードセットは、国際標準となるコードセットを取り決めたものです。 この ISO 文字コードセットの最初の 128 文字は、ASCII 文字コードセットと同じものです。 ISO 標準による新規文字コードセット (コードページ) の登場により、さまざまな言語をより正しく表示できるようになりました。 ただし、この場合、特定の文字コードが、使用する言語ごとに異なる文字を示すという欠点があります。 UnicodeUnicode は、文字コードを 4 バイトに拡張して複数の文字コードセットを組み合わせることで、可能な限り広範な言語に対応した標準を規定しています。 現在 Unicode の Version 2.0 は、StarSuite および StarSuite Basic をはじめとする多数のソフトウェアでサポートされています。 文字列変数StarSuite Basic では、文字列変数を Unicode で保存します。 1 つの文字列変数には、最大 65535 文字を格納できます。 StarSuite Basic はこれらの個々の文字を、該当する Unicode 値として内部に格納しています。 そのときに使用する作業用メモリ量は、扱う文字列の長さに依存します。 文字列変数の宣言は、以下の形式で行います。 Dim Variable As String この変数宣言は、以下のように記述することもできます。 Dim Variable$ 注 – VBA アプリケーションを移植するときは、StarSuite Basic での最大文字数 (65535 文字) を超過しないよう確認する必要があります 文字列の明示的指定文字列変数に対して明示的に文字列を代入する際には、文字列を引用符 (") で囲みます。 Dim MyString As String MyString = " This is a test" 文字列を 2 行にわたって記述する場合は、1 行目の最後にプラス記号を付けます。 Dim MyString As String
MyString = "This string is so long that it" + _
"has been split over two lines."
文字列中に引用符 (") そのものを含めたい場合は、該当する位置に引用符を 2 個続けて記述します。 Dim MyString As String MyString = "a ""-quotation mark." ' 格納される文字列は a "-quotation mark 数値型StarSuite Basic では、基本的な 5 種類の数値型が用意されています。
整数変数整数変数には -32768 から 32767 までの整数を収めることができます。 1 つの整数変数が消費するメモリ量は、2 バイトです。 整数変数の型宣言子は % です。 整数変数には、非常に高速に計算できるというメリットがあり、ループカウンタ用の変数として適しています。 整数変数に浮動小数点型の数値を代入すると、小数点以下を丸めた整数値が収められます。 整数変数の宣言は、以下の形式で行います。 Dim Variable As Integer Dim Variable% ロング整数変数ロング整数変数には –2147483648 から 2147483647 までの整数を収めることができます。 1 つのロング整数変数が消費するメモリ量は、4 バイトです。 ロング整数変数の型宣言子は & です。 ロング整数変数には、非常に高速に計算できるというメリットがあり、ループカウンタ用の変数として適しています。 ロング整数変数に浮動小数点型の数値を代入すると、小数点以下を丸めた整数値が収められます。 ロング整数変数の宣言は、以下の形式で行います。 Dim Variable as Long Dim Variable& 単精度変数単精度変数には 3.402823 × 10 38から 1.401298 × 10 -45 までの正および負の浮動点小数を収めることができます。 1 つの単精度変数が消費するメモリ量は、4 バイトです。 単精度変数の型宣言子は ! です。 従来このような単精度変数は、より精度の高い倍精度変数に対して、必要な計算処理時間を短縮するために使われてきました。 ただし近年は計算時間がさほど大きな要素にならなくなってきたため、単精度変数の必要性も低くなっています。 単精度変数の宣言は、以下の形式で行います。 Dim Variable as Single Dim Variable! 倍精度変数倍精度変数には 1.79769313486232 × 10 308から 4.94065645841247 × 10 -324 までの正および負の浮動点小数を収めることができます。 倍精度変数が消費するメモリ量は、最大で 8 バイトです。 倍精度変数は、高い精度を必要とする計算処理に適しています。 倍精度変数の型宣言子は # です。 倍精度変数の宣言は、以下の形式で行います。 Dim Variable As Double Dim Variable# 通貨変数通貨変数では、ほかの変数型と異なる方式で値が格納されます。 この場合の数値は、小数部 4 桁の固定小数点方式として扱われます。 整数部は最大 15 桁までが格納できます。 通貨変数には —922337203685477.5808 から +922337203685477.5807までの数値を収めることができ、1 つの通貨変数が消費するメモリ量は、8 バイトです。 通貨変数の型宣言子は @ です。 主として通貨変数は、金銭計算などを行う際に、浮動小数点に起因する丸め誤差を避ける場合に使用されます。 通貨変数の宣言は、以下の形式で行います。 Dim Variable As Currency Dim Variable@ 数値の明示的指定数値の表示方式には、小数点表示や指数表示などの各種の方式があり、その他に 10 進数以外の表示を行うことも可能です。 StarSuite Basic で扱う数値には、以下の規則が適用されます。 整数数値としての扱い方が最も簡単なのが整数です。 なおソースコード内にこれら数値を記述する際には、千単位の桁区切りを示すコンマを付ける必要はありません。 Dim A As Integer Dim B As Float A = 1210 B = 2438 数値の前にはプラス記号 (+) またはマイナス記号 (-) を指定できます (これらの記号と数値の間にスペース記号を付けても付けなくても同じ)。 Dim A As Integer Dim B As Float A = + 121 B = - 243 小数小数点にはピリオド記号を使用します。 これは、ほかの記号を小数点として使用している地域においても、ソースコードをそのまま使用するための規則です。 Dim A As Integer Dim B As Integer Dim C As Float A = 1223.53 ' 値は整数に丸められます B = - 23446.46 ' 値は整数に丸められます C = + 3532.76323 小数値の前にはプラス記号 (+) またはマイナス記号 (-) を指定できます (この場合も記号と数値の間にスペース記号を付けても付けなくても同じ)。 整数変数に小数値を代入すると、StarSuite Basic は小数点以下を丸めて整数化します。 指数表示StarSuite Basic では、数値を指数 (累乗、べき乗) 形式で指定することができ、たとえば 1.5 × 10-10 (0.00000000015) という値は 1.5e-10 と表記できます。 この場合の「e」は大文字でも小文字でもよく、先頭にプラス記号 (+) を付けても付けなくても同じです。 ここでは、正しい指数表記と正しくない指数表記の例をいくつか見てみます。 Dim A As Double A = 1.43E2 ' 有効 A = + 1.43E2 ' 有効 (プラス記号と数値の間のスペース記号の有無) A = - 1.43E2 ' 有効 (マイナス記号と数値の間のスペース記号の有無) A = 1.43E-2 ' 有効 (負の指数) A = 1.43E -2 ' 無効 (数値内にスペース記号は使用不可) A = 1,43E-2 ' 無効 (小数点としてコンマ記号は使用不可) A = 1.43E2.2 ' 無効 (指数部の数値は整数のみ使用可能) 上記の無効な例のうち 1 番目と 3 番目のものでは、エラーメッセージは表示されませんが、結果として間違った値が返されるので注意が必要です。 たとえば最初の例では、次のように解釈されます。 A = 1.43E -2 これは 1.43 マイナス 2 と見なされるので、結果として -0.57 という値が返されま す。 この場合、本来意図していた数値表式に該当すべき値は 1.43 * 10 -2 (つまり 0.0143) です。 また最後の例では、次のように解釈されます。 A = 1.43E2.2 StarSuite Basic は指数部の数値の小数点以下を無視するので、この数式は以下のものとして処理されます。 A = 1.43E2 16 進数16 進数による数値表記では、2 桁の数値が 1 バイトの値と正確に対応します。 この表記法は、コンピュータ内部で直接処理されるデータ値を扱う際に有用です。 数値の 16 進数表記では、0 から 9 までの数字と A から F までのアルファベットの組合せで個々の値を表現します。 この場合の A は 10 進数の 10 に該当し、F は 10 進数の 15 に該当します。 StarSuite Basic では、&H を数値の先頭に付けることで、16 進数であることを指定します。 Dim A As Long A = &HFF ' 16 進数の FF は 10 進数の 255 に該当 A = &H10 ' 16 進数の 10 は 10 進数の 16 に該当 8 進数StarSuite Basic では、0 から 7 までの数字の組合せで数値を表現する 8 進数表記を扱うことも可能で、8 進数であることを指定するには &O を数値の先頭に付けます。 Dim A As Long A = &O77 ' 8 進数の 77 は 10 進数の 63 に該当 A = &O10 ' 8 進数の 10 は 10 進数の 8 に該当 True と False を取る変数ブール型変数ブール型変数には、True (真) および False (偽) という 2 つの値の一方を収めることができます。 この変数型は、2 つの状態の一方のみを取る情報を扱う場合に適しています。 ブール型の値は、内部的には 2 バイトの整数値として格納され、0 が False に該当し、その他すべての値は True として扱われます。 ブール型変数には、型宣言子は存在しません。 この場合は、As Boolean による型宣言のみが行えます。 ブール型変数の宣言は、以下の形式で行います。 Dim Variable As Boolean 日付および時刻変数日付変数日付変数には、日付と時刻を示す値のみを収めることができます。 StarSuite Basic では日付変数の値を格納する際に、時刻間の比較や計算処理を行えるよう、これらの値を内部形式に変換します。 日付変数には、型宣言子は存在しません。 この場合は、As Date による型宣言のみが行えます。 日付変数の宣言は、以下の形式で行います。 Dim Variable As Date データフィールドStarSuite Basic では、通常の変数 (スカラー値) の他に、データフィールド (配列) をサポートしています。 1 つのデータフィールド内には複数の値を格納することが可能で、これらの各要素に対してはインデックス指定によりアクセスします。 1 次元配列配列の宣言法は、通常の変数と基本的には同じです。 ただし、配列名に続けて、配列の要素数をかっこで囲んで指定する点が異なります。 配列は以下のようにして宣言します。 Dim MyArray(3) この場合の配列は、MyArray(0)、MyArray(1)、MyArray(2)、MyArray(3) という 4 つの要素を持つ、バリアント型変数として宣言されます。 また配列を宣言する際には、特定の変数型を指定することも可能です。 たとえば以下の例では 4 つの整数変数をとるよう配列を宣言しています。 Dim MyInteger(3) As Integer これまでに説明した配列宣言の例では、インデックスの開始値として、標準値である 0 が使われています。 このようなインデックスの開始および終了値は、配列 (データフィールド) の宣言時に指定することができます。 以下の例は 6 つの整数値を取るデータフィールドを作成するものですが、宣言をする際にインデックス範囲を 5 から 10 とするよう指定しています。 Dim MyInteger(5 To 10) インデックス値には、正の値以外を使うことも可能です。 以下の例では、インデックス範囲に負の値を指定していますが、これも有効な宣言として処理されます。 Dim MyInteger(-10 To -5) この場合、データフィールド (配列) のインデックス値は -10 から -5 までの整数値を取り、合計 6 つの要素を持つことになります。 データフィールド (配列) のインデックスについては、以下の 3 つの制限があります。
注 – VBA のデータフィールドでは、これ以外の制限が課されている場合もあります。 次元ごとに取りうる最大の要素数についても、同様の制限が当てはまります。 実際に有効とされる値については、VBA の関連マニュアルを参照してください。 インデックスの開始値に関する設定通常、データフィールド (配列) のインデックスには、0 から始まる値が割り当てられます。 この開始値については、以下のように指定することにより、すべてのデータフィールド宣言において 1 とするよう変更できます。 Option Base 1 この変更をモジュール内のすべての配列宣言に対して適用させるには、モジュールのヘッダ部で指定する必要があります。 ただしこの変更は、StarSuite API で指定する UNO シーケンスに対しては無効で、これらのインデックスは常に 0 から始められます。 このため Option Base 1 を指定すると、インデックスの開始値が混在する危険性があります。 Option Base 1 による設定は、インデックスの開始値を変更するだけであり、配列の要素数には影響しません。 たとえば、以下のサンプルコードのようにして配列を宣言したとします。 Option Base 1 ' ... Dim MyInteger(3) この場合、MyInteger(1) 、MyInteger(2) 、MyInteger(3) 、MyInteger(4) という 4 つの要素を持つ配列が作成されます。 注 – VBA の場合とは異なり、StarSuite Basic での Option Base 1 による設定は、配列の要素数には影響しません。 StarSuite Basic の場合、この設定は単にインデックスの開始値を変更するだけです。 たとえば MyInteger(3) と宣言すると、VBA では 1 から 3 のインデックス値を取る 3 つの要素が確保されますが、StarSuite Basic では 1 から 4 のインデックス値を取る 4 つの要素が確保されます。 StarSuite BasicでVBAと同様の動作をさせるには、Option Compatible を指定します。 多次元データフィールドStarSuite Basic では 1 次元データフィールド (配列) の他に、多次元データフィールドもサポートしています。 個々の次元の指定は、コンマ記号で区切ります。 たとえば、以下のサンプルコードでは、多次元データフィールドを宣言しています。 Dim MyIntArray(5, 5) ここでは 2 次元の配列を作成し、個々の次元に 6 つの要素 (インデックス値の 0 から 5) を確保しています。 この配列全体としては 6 × 6 = 36 個の値を格納することができます。 StarSuite Basic では、数百次元にも及ぶ多次元配列を宣言することも可能ですが、実際には使用可能なメモリ量により、次元数に制限が課されることになります。 データフィールドのサイズの動的変更これまでに説明した例では、特定のサイズを持つデータフィールド (配列) を扱ってきました。 このような配列以外にも、データフィールドのサイズを動的に変更させることが可能です。 たとえば、配列を 1 つ作成して、ある文章内に存在する A という文字で始まるすべての単語をその中に格納するとしましょう。 このようなケースでは、該当する単語がいくつあるのか最初の段階では分からないので、配列のサイズを随時変更する必要があります。 このような配列を作成するには、StarSuite Basic では以下のように宣言します。 ReDim MyArray(10) 注 – VBA の場合は Dim MyArray() による動的配列のサイズ変更のみが行えますが、StarSuite Basic の場合は ReDim により動的および静的配列のサイズを変更できます。 以下のサンプルコードでは、最初に作成した配列のサイズを何度か変更して、それぞれ 11 個および 21 個の値を格納できるようにします。 Dim MyArray(4) As Integer ' 要素数 5 として配列を宣言 ' ... ReDim MyArray(10) As Integer ' 要素数を 11 に変更 ' ... ReDim MyArray(20) As Integer ' 要素数を 21 に変更 配列のサイズを変更する際には、これまでの節で説明したすべてのオプションを指定できます。 これには、多次元データフィールド化するための指定や、インデックスの開始および終了値の指定などが該当します。 なお、データフィールドのサイズを変更すると、格納していたすべてのデータが消失されます。 変更前の値を保持させるには、Preserve コマンドを使用します。 Dim MyArray(10) As Integer ' 最初のサイズ
' を指定
' ...
ReDim Preserve MyArray(20) As Integer ' 代入値を保持しつつ
' データフィールドの
' サイズを拡張
Preserve コマンドを使用する場合は、配列の次元数および変数型が、サイズ変更の前後で同じになっている必要があります。 注 – VBA で Preserve コマンドを使用すると、データフィールドの最終次元の上限値だけしか変更できませんが、StarSuite Basic では他の次元も変更できます。 ReDim と Preserve を併用する場合、データフィールドのデータ型はオリジナルのものから変更することはできません。 変数の有効範囲と寿命StarSuite Basic で確保される個々の変数は、プログラムのすべての領域で使用可能というわけではなく、それぞれ有効となる範囲と寿命があります。 変数が確保され続ける寿命および利用可能なプログラム範囲は、各変数の種類と宣言された位置に依存します。 局所変数関数や手続きの内部で宣言された変数は、局所変数と呼ばれます。 Sub Test Dim MyInteger As Integer ' ... End Sub このような局所変数は、該当する関数や手続きが実行されている間は確保され続けますが、実行が終了した段階で消去されます。 このため関数を呼び出す際には、以前の呼び出し時に代入された値などを利用することはできません。 このような値を保持しておくには、変数を static として定義しておく必要があります。 Sub Test Static MyInteger As Integer ' ... End Sub 注 – VBA とは異なり StarSuite Basic の局所変数には、モジュールヘッダにある大域変数やプライベート変数と同じ名前を付けることはできません。 このため、VBA アプリケーションを StarSuite Basic に移植する際には、重複した変数名を変更する必要があります。 パブリックドメイン変数パブリックドメイン変数は、モジュールのヘッダセクションでキーワード Dim を使って定義します。 この変数は、ライブラリ内のすべてのモジュールで利用可能となります。 モジュール A: Dim A As Integer Sub Test Flip Flop End Sub Sub Flip A = A + 1 End Sub モジュール B: Sub Flop A = A - 1 End Sub このサンプルコードで変数 A の値は、関数 Test では直接変更されませんが、間接的に関数 Flip で 1 増やされ、関数 Flop で 1 減らされています。 この両者の関数による変更は、大域的 (グローバル) に実施されています。 パブリックドメイン変数の宣言用キーワードには、Dim の代わりに Public も使用できます。 Public A As Integer パブリックドメイン変数は、該当するマクロが実行されている間は確保され続けますが、実行が終了した段階で消去されます。 大域変数大域変数はパブリック変数と同等の機能を担っていますが、該当するマクロの実行終了後もその値が確保され続ける点が異なります。 大域変数は、モジュールのヘッダセクションでキーワード Global を使って定義します。 Global A As Integer プライベート変数プライベート変数は、定義されたモジュール内部でのみ有効となります。 プライベート変数の定義には、キーワード Private を使用します。 Private MyInteger As Integer 複数のモジュールで同じ名前のプライベート変数が使われている場合、StarSuite Basic では、これらの変数はそれぞれ個別の変数として確保されます。 以下のサンプルコードでは、モジュール A およびモジュール B の両方で、変数名 C というプライベート変数を確保します。 ここで関数 Test は、最初にモジュール A でプライベート変数を作成し、次にモジュール B でプライベート変数を作成します。 モジュール A: Private C As Integer Sub Test SetModuleA ' モジュール A で変数 C の値を設定 SetModuleB ' モジュール B で変数 C の値を設定 ShowVarA ' モジュール A での変数 C の値を表示 (= 10) ShowVarB ' モジュール B での変数 C の値を表示 (= 20) End Sub Sub SetmoduleeA A = 10 End Sub Sub ShowVarA MsgBox C ' モジュール A での変数 C の値を表示 End Sub モジュール B: Private C As Integer Sub SetModuleB A = 20 End Sub Sub ShowVarB MsgBox C ' モジュール B での変数 C の値を表示 End Sub 定数StarSuite Basic で定数を宣言するには、キーワード Const を使用します。 Const A = 10 必要であれば、宣言時にデータ型を指定しておくこともできます。 Const B As Double = 10 演算子StarSuite Basic には、一般的な算術、論理、比較用の演算子が用意されています。 算術演算子算術演算子は数値を対象とした処理を行うものですが、+ 演算子は文字列を結合させる場合にも使用します。
論理演算子論理演算子は、ブール演算を実行するためのものです。 このタイプの演算子をブール型のデータに対して適用すると、該当する論理演算を行った結果が返されます。 また、整数およびロング整数のデータに対して適用すると、ビット単位の演算結果が返されます。
比較演算子比較演算子は、基本的なすべてのタイプの変数 (数値、日付、文字列、ブール型) に対して適用できます。
注 – VBA の Like 演算子は、StarSuite Basic には用意されていません。 分岐処理指定した条件に応じて、プログラム内の特定のコードブロックのみを実行させたい場合などは、分岐ステートメントを使用します。 If...Then...Else使用頻度の高い分岐ステートメントの 1 つとして If ステートメントがあり、これは以下のように使用します。 If A > 3 Then B = 2 End If このサンプルコードで B = 2 の行が実行されるのは、変数 A の値が 3 より大きい場合だけです。 If ステートメントのバリエーションとして、If/Else 句があります。 If A > 3 Then B = 2 Else B = 0 End If このサンプルコードで変数 B に代入される値は、変数 A が 3 以上の場合は 2 となり、それ以外の場合は 0 となります。 If ステートメントをカスケード化して、以下のようなより複雑な条件分岐を行わせることもできます。 If A = 0 Then B = 0 ElseIf A < 3 Then B = 1 Else B = 2 End If このサンプルコードでは、変数 A の値が 0 であれば、変数 B には 0 が代入されます。 変数 A の値が 3 よりも小さければ (ただし 0 とは等しくない)、変数 B には 1 が代入されます。 これら以外の場合 (つまり変数 A の値が 3 以上の場合)、変数 B には 2 が代入されます。 Select...CaseSelect...Case ステートメントは、If ステートメントのカスケード化と同等の機能を果たすもので、複数の条件に対する分岐を行う際に使用します。 Select Case DayOfWeek Case 1: NameOfWeekday = "Sunday" Case 2: NameOfWeekday = "Monday" Case 3: NameOfWeekday = "Tuesday" Case 4: NameOfWeekday = "Wednesday" Case 5: NameOfWeekday = "Thursday" Case 6: NameOfWeekday = "Friday" Case 7: NameOfWeekday = "Saturday" End Select このサンプルコードでは、変数 DayOfWeek の値が 1 であれば Sunday 、2 であれば Monday というように、各曜日の名前を番号で識別させています。 Select コマンドによる条件判定は、単純な 1 対 1 に限定されるものではなく、Case による個々の分岐指定部には比較演算子を使ったり、複数の条件式をリスト化して一括指定することが可能です。 以下のサンプルコードでは、特に多用される条件判定の例を示します。 Select Case Var Case 1 To 5 ' ... 変数 Var の値が 1 から 5 の間にある場合の処理 Case 6, 7, 8 ' ... 変数 Var の値が 6、7、8 のいずれかの場合の処理 Case Var > 8 And Var < 11 ' ... 変数 Var の値が 8 より大きく 11 より小さい場合の処理 Case Else ' ... その他の場合の処理 End Select ループループは、特定のコードブロックを指定した回数繰り返し実行させる場合などに使用します。 またループの実行回数は、不特定値とすることも可能です。 For...NextFor...Next ループは、特定回数の繰り返し実行を行うためのものです。 この場合の繰り返し回数は、ループカウンタを使って指定します。 このタイプのループは、以下のサンプルコードのような形式で指定します。 Dim I For I = 1 To 10 ' ... ループの内部 Next I この場合、変数 I がループカウンタであり、初期値は 1 とされています。 このカウンタの値は、ループを 1 回実行するごとに 1 ずつ増加されます。 最終的に変数 I の値が 10 に等しくなった段階で、ループは終了します。 ループカウンタの増分値を 1 以外にする場合は、以下のように Step を使用します。 Dim I For I = 1 To 10 Step 0.5 ' ... ループの内部 Next I 上記のサンプルコードでは、ループを 1 回実行するごとにカウンタの値は 0.5 ずつ増加されるため、ループは最終的に 19 回実行されることになります。 ループの増分値には、負の値を指定することもできます。 Dim I For I = 10 To 1 Step -1 ' ... ループの内部 Next I 上記のサンプルコードではカウンタの初期値を 10 として、ループを 1 回実行するごとにカウンタの値を 1 ずつ減算させ、最終的に 1 となるまでループを実行しています。 Exit For ステートメントを使用すると、For ループを強制的に終了させることができます。 以下のサンプルコードでは、ループの 5 巡目で強制的に終了します。 Dim I For I = 1 To 10 If I = 5 Then Exit For End If ' ... ループの内部 Next I 注 – VBA にある For Each...Next ループは、StarSuite Basic では用意されていません。 Do...LoopDo...Loop は、特定回数のループを行うものではありません。 Do...Loop によるループ処理は、特定の条件が満たされるまで繰り返し実行されます。 Do...Loop には 4 つのバリエーションがあります (以下のサンプルコードで A > 10 の部分がループ条件) 。
For...Next ループと同様に、Do...Loop にも強制終了用のコマンドが用意されています。 この場合は Exit Do コマンドにより、ループ内の任意の位置で強制終了が行えます。 Do
If A = 4 Then
Exit Do
End If
' ... ループ処理の本体
While A > 10
サンプルプログラム: 多重ループによるソーティングループの用途としては、リストの検索、値の取得、複雑な数値計算など、様々な処理で利用されています。 以下のサンプルコードは、ループ処理を用いてリストを名前でソートするアルゴリズムです。 Sub Sort
Dim Entry(1 To 10) As String
Dim Count As Integer
Dim Count2 As Integer
Dim Temp As String
Entry(1) = "Patty"
Entry(2) = "Kurt"
Entry(3) = "Thomas"
Entry(4) = "Michael"
Entry(5) = "David"
Entry(6) = "Cathy"
Entry(7) = "Susie"
Entry(8) = "Edward"
Entry(9) = "Christine"
Entry(10) = "Jerry"
For Count = 1 To 10
For Count2 = Count + 1 To 10
If Entry(Count) > Entry(Count2) Then
Temp = Entry(Count)
Entry(Count) = Entry(Count2)
Entry(Count2) = Temp
End If
Next Count2
Next Count
For Count = 1 To 10
Print Entry(Count)
Next Count
End Sub
ここでは 2 つの値を 1 組にして順序の入れ替え作業を行い、最終的に昇順で並ぶまでこの作業を繰り返しています。 その際に個々の変数値は 1 つずつ位置をずらしていきますが、この動きはちょうど泡が移動する様子に似ています。 このような理由から、このタイプのアルゴリズムは一般に バブルソート と呼ばれています。 手続きと関数手続きと関数こそは、プログラム構造の中心的な役割を担うものです。 これらを利用することで、複雑なプログラムを個々のタスクごとにブロック化することができます。 手続き手続き は、プログラム内の特定の処理を実行するユニットのことですが、戻り値を返すことはありません。 構文は以下のようになります。 Sub Test ' ... 手続き本体のコード End Sub このサンプルコードでは Test という名前の手続きを定義していますが、この手続きによる処理は、プログラム内の任意の位置から実行させることができます。 手続きを呼び出すには、以下のようにプログラム内の該当行に手続き名を記述するだけです。 Test 関数関数 も、手続きと同様に、特定のプログラムブロックを 1 つのユニットとしてまとめたものです。 手続きとの相違点として、関数は戻り値を返すという点があります。 Function Test ' ... 関数本体のコード Test = 123 End Function 関数の戻り値の指定は、通常の変数への値の代入と同様の形式で、関数名に対して値を代入することで実施します。 この代入は、関数の末尾で実行する必要はなく、関数内の任意の位置で行えます。 上記のようにして定義した関数は、プログラム内の任意の位置から呼び出すことができます。 Dim A A = Test このコードは、変数 A を宣言してから、関数 Test の戻り値をその中に代入しています。 戻り値として返す値は、関数内で何回も書き換えることが可能です。 通常の変数への代入操作と同様に、以下のサンプルでも実際に返される関数の戻り値は、最後に代入した値となります。 Function Test Test = 12 ' ... Test = 123 End Function このサンプルコードの場合、関数の戻り値は 123 となります。 戻り値の代入を行わなかった場合、その関数の戻り値としてはゼロ値が返されます (数値関数の場合は 0 、文字列関数の場合は空白文字列)。 関数の戻り値のデータ型は、任意の種類を指定できます。 この場合のデータ型宣言は、通常の変数宣言と同様の手順で行えます。 Function Test As Integer ' ... 関数本体のコード End Function 明示的に値を指定しなかった場合、戻り値はバリアント型として扱われます。 手続きと関数の強制終了StarSuite Basic では、Exit Sub および Exit Function コマンドを使って、実行途中の手続きや関数を強制終了させることができ、エラーハンドルなどの処理をする際に有用です。 これらのコマンドは、手続きや関数を強制終了させてから、これらを呼び出した行にまでプログラムの実行行を戻します。 以下のサンプルコードでは、変数 ErrorOccured の値が True になった場合に、手続きを強制終了します。 Sub Test
Dim ErrorOccured As Boolean
' ...
If ErrorOccured Then
Exit Sub
End If
' ...
End Sub
パラメータの渡し方関数や手続きには、1 つまたは複数のパラメータ (引数) を渡すことができます。 パラメータは、関数や手続きの名前の後に、かっこで囲んで指定する必要があります。 これは以下のように指定します。 Sub Test (A As Integer, B As String) End Sub この手続きを呼び出す場合は、整数変数 A および文字列変数 B へ渡すパラメータ値の指定が必要です。 StarSuite Basicでは、通常パラメータは 参照渡し で与えます。 この場合、呼び出した手続きや関数が終了しても、これらの変数値に対して行われた変更はそのまま維持されます。 Sub Test
Dim A As Integer
A = 10
ChangeValue(A)
' この段階で変数 A の値は 20
End Sub
Sub ChangeValue(TheValue As Integer)
TheValue = 20
End Sub
上記のサンプルコードでは、手続き Test の内部で定義した変数 A を、関数 ChangeValue にパラメータとして渡しています。 次に TheValue に代入するためこのパラメータの値を 20 に変更していますが、この変更後の値は関数が終了してもそのまま維持されます。 またパラメータに対する変更をオリジナルの変数の内容に反映させたくない場合は、パラメータを 値渡し で与えることも可能です。 パラメータを値渡しで与えるには、関数宣言用のヘッダ部で、該当する変数名の前にキーワード ByVal を指定する必要があります。 たとえば先のサンプルコードで、関数 ChangeValue に渡すパラメータを値渡しにするには、以下のように指定します。 Sub ChangeValue(ByVal TheValue As Integer) TheValue = 20 End Sub このように変更すると、変数 A の値は、呼び出した関数内部での値の変更に影響されなくなります。 この場合、関数 ChangeValue を呼び出した後も、変数 A の値は 10 のままです。 注 – StarSuite Basic における手続きや関数へのパラメータの渡し方は、基本的に VBA と同じものです。 標準でパラメータは、参照渡しとして与えられます。 そのため、値渡しでパラメータを与えるには、キーワード ByVal を指定する必要があります。 なお VBA の場合は、キーワード ByRef を指定することで、強制的に参照渡しでパラメータを与えることが可能です。 StarSuite Basic にこのキーワードは用意されていませんが、これは StarSuite Basic の場合は標準で参照渡しとなるためです。 オプションパラメータ関数や手続きを呼び出す際には、必要なパラメータをすべて指定する必要があります。 ただし StarSuite Basic では、特定のパラメータを オプション (省略可能) となるよう指定が可能で、これらのパラメータについては、呼び出し時の指定が省略されても、値が空であるものとして、そのまま処理が進められます。 このような指定は、以下のようにして行います。 Sub Test(A As Integer, Optional B As Integer) End Sub この場合パラメータ A の指定は必須ですが、パラメータ B の指定は省略できます。 IsMissing 関数を使うと、呼び出し時にパラメータが指定されているかをチェックできます。 Sub Test(A As Integer, Optional B As Integer) Dim B_Local As Integer ' パラメータ B が指定されているかをチェック If Not IsMissing (B) Then B_Local = B ' パラメータ B が指定されている場合 Else B_Local = 0 ' パラメータ B が指定されていない場合、標準値は 0 End If ' ... 関数の本体 End Sub 上記のサンプルコードでは、まずパラメータ B に値が指定されているかをチェックしてから、チェック結果に応じて、局所変数 B_Local に渡す値を変えています。 そしてパラメータに値が指定されていなかった場合、B_Local にはパラメータ値ではなく標準値 (この例では 0) が代入されます。 注 – VBA にあるキーワード ParamArray は、StarSuite Basic ではサポートされていません。 再帰処理現行の StarSuite Basic では、再帰処理が行えます。 再帰処理とは、関数や手続きが処理中に自分自身を呼び出すことで、特定の終了条件を満たすまで、このような処理を実行し続けます。 たとえば再帰関数の場合、終了条件が満たされた段階で、戻り値を返します。 以下のサンプルコードは再帰関数の使用例で、ここでは 42 、-42 、3.14 の各数値の階乗を再帰処理で求めています。 Sub Main
Msgbox CalculateFactorial( 42 ) ' 表示結果は 1,40500611775288E+51
Msgbox CalculateFactorial( -42 ) ' 表示結果は「Invalid number for factorial!」
Msgbox CalculateFactorial( 3.14 ) ' 表示結果は「Invalid number for factorial!」
End Sub
Function CalculateFactorial( Number )
If Number < 0 Or Number <> Int( Number ) Then
CalculateFactorial = "Invalid number for factorial!"
ElseIf Number = 0 Then
CalculateFactorial = 1
Else
' This is the recursive call:
CalculateFactorial = Number * CalculateFactorial( Number - 1 )
Endif
End Function
上記のサンプルコードでは、数値 42 の階乗を計算する際に、関数 CalculateFactorial で再帰呼び出しを行い、0! = 1 の計算になった段階を終了条件としています。. 注 – 再帰回数のレベルは、ソフトウェアのプラットフォームごとに異なります。 Windows の場合、再帰回数のレベルは 5800 です。 Solaris および Linux の場合、再帰回数のレベルは、スタックサイズの計算結果を基に計算されます。 エラー処理プログラミングを進める際に大きな問題となるのが、エラーに対する修正作業です。 StarSuite Basic には、エラー処理用に各種の機能が用意されています。 On Error 命令On Error 命令は、エラー処理の中心となる機能です。 Sub Test On Error Goto ErrorHandler ' ... エラー発生時に実行行を引き継ぎ Exit Sub ErrorHandler: ' ... エラー処理用のコード End Sub ここで On Error Goto ErrorHandler 行により、StarSuite Basic に対して、エラー発生時に実行行をどのようにするかを指定しています。 たとえばこの場合の Goto ErrorHandler は、現在の実行行を中断させて、ErrorHandler: で指定するコードブロックを StarSuite Basic に実行させます。 Resume コマンドResume Next コマンドを使うと、エラーハンドラ用コードを実行した後で、エラー発生行の次の行にプログラム実行を戻して、処理を再開させることができます。 ErrorHandler: ' ... エラー処理用のコード Resume Next また Resume Proceed コマンドを使用すると、エラーハンドラ用コードを実行した後のプログラム実行の行き先を指定することができます。 ErrorHandler: ' ... エラー処理用のコード Resume Proceed Proceed: ' ... エラー処理後のプログラムの継続先 エラーが発生した際に、エラーメッセージを表示させずにプログラムを継続させるには、以下のように記述します。 Sub Test On Error Resume Next ' ... エラー発生時は次の行を継続実行 End Sub この On Error Resume Next コマンドの作用範囲はプログラム全域に及ぶので、使用する際には注意が必要です。 詳細については、このマニュアルの 「効率的なエラー処理のヒント」を参照してください。 エラーの関連情報の取得エラー処理を行う場合、エラーの内容と発生箇所の情報が確認できると有用です。
こうした情報を表示させるには、たとえば以下のようなコードを記述します。 MsgBox "Error " & Err & ": " & Error$ & " (line : " & Erl & ")" この場合は、メッセージウィンドウにエラーの内容が表示されます。 注 – エラーの内容は、StarSuite Basic では Err 、Error$ 、Erl 変数に格納されますが、VBA では Err という名前のオブジェクトにまとめられます。 これらのエラー情報は、次に Resume または On Error コマンドを実行するまで維持され、これらを実行した段階でリセットされます。 注 – VBA では、Err オブジェクトに対する Err.Clear メソッドにより、エラー情報をリセットします。 StarSuite Basic では、On Error および Resume コマンドがこの機能を果たしています。 効率的なエラー処理のヒントエラーハンドラを設定する On Error コマンドも、実行行を復帰させる Resume コマンドも、いわゆる Goto コマンドの一種です。 この種の実行行をジャンプさせるコマンドは、エラーの発生を予防する観点からも、コード内での多用を避けるべきです。 また On Error Resume Next コマンドは、エラーの関連情報をリセットしてしまうので、その使用に当たっては注意が必要です。 最善の方法は、プログラム内でエラー処理を行うブロックを一カ所にまとめておくことです。つまり、エラー処理ブロックをプログラム本体のコード部から分離しておき、エラー処理が終わっても実行行はエラー発生行にジャンプさせないようにします。 以下のサンプルコードは、エラー処理の手順の流れを示しています。 Sub Example
' エラーハンドラをプログラムの先頭部に設定
On Error Goto ErrorHandler
' ... 本体のコードの先頭部
' これ以降はエラーハンドラ機能を解除
On Error Goto 0
' 本体のコードの末尾
Exit Sub
' エラーハンドラの開始点
ErrorHandler:
' あらかじめ想定されたエラーか判定
If Err = ExpectedErrorNo Then
' ... エラー処理用のコード
Else
' ... 想定外のエラーの場合は警告を表示
End If
On Error Goto 0 ' これ以降はエラーハンドラ機能を解除
End Sub
この手続きでは、一番最初にエラーハンドラを設定してから、プログラム本体のコードを記述しています。 そしてプログラム本体のコードの末尾で On Error Goto 0 によりエラーハンドラ機能を解除し、Exit Sub コマンドにより手続きの実行を終了させるようにしています (End Sub との違いに注意) 。 このサンプルコードでは、あらかじめ想定されたエラーが発生したのかを、エラー番号をチェックすることで判定して (この例では判定用に ExpectedErrorNo という定数を使用) 、その結果に応じてエラー処理の内容を分岐させています。 想定外のエラーが発生していた場合は、警告を表示します。 このように、想定外のエラーの発生を検出するには、エラー番号を使ってチェックが行えます。 コード末尾に On Error Goto 0 を記述してあるのは、エラー情報 (エラー管理用のシステム変数に記録されたエラーコード) をリセットして、次回以降に発生するエラーを正確に記録させるためです。 |