Visual Basic 業務アプリ構築法 第7回

開発環境と処理系の違いを知るエラーへの対処
長谷川裕行
1998/10/13

長谷川 裕行 (はせがわ ひろゆき)
有限会社 手國堂 代表取締役
http://www.hirop.com/
テクニカルライターとして活躍。プログラミングに関する著書多数、DB Magazineなどにも多くの記事を提供している。

簡単なアプリケーションの作成を通して、VBの操作とアプリケーション開発の基本的な作法を紹介してきました。今月は、前回作成した簡単なアプリケーションにどのような意味があるのかを考えます。また、初期の段階で遭遇する各種エラーメッセージと、その対処方法を紹介します。


単純な処理とVBによる業務アプリ開発

前回作成したアプリケーションは、非常に単純なものでした。文字列を切り替えるだけで、データベースも何も扱いません。これが業務アプリケーションとどう関わってくるのか、疑問を持った方も多いと思います。


- 簡単すぎて物足りない! -

既に汎用機やオフコンなどでアプリケーション開発を経験されてきた人にしてみれば、これまでにこのコーナーで紹介してきた「メッセージを表示するだけ」のアプリケーションなど「初歩の初歩」でしかないでしょう。非常に単純なメカニズムで構成されているので、ばかばかしいと思った人も多いのではないかと思います。
実際、ボタンをクリックしてメッセージが表示されるだけでは、まったく実用になりません。「私が知りたいのは、業務アプリケーションの開発手法だ。メッセージの出し方や切り替え方なんかじゃない!」と思った人も多いでしょう。



- 入口と出口の問題 -

ここに、落とし穴があります。多くの業務アプリケーション開発者は、アプリケーション内部の「データの加工」段階に目を奪われがちです。もちろん、プログラムの本質はデータの加工ですから、それは間違いではありません。むしろ正しい姿勢です。  が、「データの加工過程さえうまくできていれば万事OK」というものではありません。アプリケーションには、ユーザーとのインターフェースが不可欠です。プログラムにとってユーザーと触れ合う部分は、大きく2箇所あります。「入口と出口」です。いわゆる入出力仕様の問題なのですが、多くの汎用機やオフコン用アプリケーションでは、この部分が非常にあっさりと片づけられます。


- 入出力とユーザー・インターフェース -

特にCOBOLを用いた開発の場合、バッチ処理では「大量のファイルからデータを連続的に読み込み、結果をファイルとして吐き出す」という構成で済んでしまうことがほとんどです。実際の入力デバイスが、バーコードリーダーであろうがカードリーダーであろうが、キーボードであろうが何であろうが、内部では「ファイル」でしかあり得ません。出力にしても同じです。
ところがパソコンでWindowsを動かしている環境では、多くの場合アプリケーションがユーザーと直接のやりとりを行います。内部で、単にファイルをレコード単位で処理していく――というだけでは済みません。
入力用の画面や確認用のダイアログボックス、出力時のデザインなどをすべてアプリケーションが抱え込むことになるのです。



- パソコン用アプリを作るということ -

Windows、というよりパソコン用の業務アプリケーションでは、ユーザーとのインターフェース部分の重要性が、内部のデータ加工と同じくらいの比重を占めています。いくら目の覚めるようなコーディングで効率的な内部処理を達成していても、データを入力する際にとまどってしまうようなデザインでは、ユーザーから不評を買ってしまいます。
パソコンやオフコンでは、COBOLでもディスプレイを介した入出力インターフェースを扱います。ただCOBOLの場合、ディスプレイとキーボードを介したやりとりもSCRREN SECTIONでファイルとして扱われるだけなので、あまり重要視されないようです。
単にファイルの1レコードをフィールドごとに区切り、それを入力枠と対応させてディスプレイ上にレイアウトしただけで、あとは各入力枠の移動順や終了/取り消しなどの制御機構を用意すれば出来上がってしまいます。これがCOBOLの優れているところです。



- VBには一貫性がない?! -

一方Windowsアプリケーションでは、画面表示――VBでいうフォームは、処理の土台となるファイル(データベース)の構造とは無関係に、実に自由自在にデザインできてしまいます。このことは一見気楽そうに見えますが、デザイン基準が存在しないということなので逆に非常にやっかいな部分です。
画面上に表示し、ユーザーとのやりとりを行わせる各要素(Windowsの場合はテキストボックスやコマンドボタンなど)が、基になるデータと何のつながりも持っていないのです。それらを有機的につなぐのは、プログラマーの役目であり責任です。
COBOLのように、FILE SECTIONでデータ構造を定義し、それに基づいてSCREEN SECTIONで入力を受け取り、WORKING STRAGE SECTIONで処理をする――といった一貫性、整合性の保証は、VBをはじめとする一般的なWindowsの処理系には存在しません。



- まったく異なる制御方法 -

そのことを体験的に理解していただくための第一歩が、これまでに取り上げた「単純なアプリケーション」だったのです。
このアプリケーションには、取り扱うべき基礎データが存在しませんでした。他の言語なら、おそらく最初に表示させるメッセージやボタンの文字列も、常数として扱われるはずです。
ところがVBでは、フォームに直接ラベルとして、あるいはボタンコントロールのCaptionプロパティの値として設定してしまいます。ファイルの基礎データどころか、こういった予備的なデータの扱いさえ、これまでの言語とは大きく異なるのです。
当然、それらの制御方法も異なっていました。「画面上の何行・何桁目にXXXXの文字列を表示する」という考え方ではなく、「あのコントロールのこのプロパティに、XXXXを設定する」という考え方です。



- トータルな意味でのVBの一貫性 -

この先、回を追ってデータベースの扱いについて触れていきますが、その場合も上述のようなアプローチの違いが存在します。とにかくVBでは「プロパティを操作して処理を進める」ことが中心です。それは、画面であっても内部処理であっても変わりません。
先に、VBでは基礎的なデータの扱いに一貫性がない――といった意味のことを書きましたが、逆にアプリケーション全体の構造に関しては、常に一貫性を保っていることになります。
扱う対象が画面上のテキストボックスだろうが、内部のデータだろうが、同じようにプロパティとメソッドを操作すればよいのです。これがオブジェクトを操作することのメリットであり、VBを理解する上で非常に重要な概念です。
今後、VBで業務アプリケーションを開発するなら、過去の「データ構造だけに拘束された一貫性」に頼ることを避け、開発環境としてのトータルな一貫性に目を向けてください。



動かない原因と対処方法

前回紹介したサンプルは非常に単純だったので、すんなりクリアできた人も多かったと思います。が、中にはうまく動かなかったり、エラーメッセージに遭遇してしまった人がいるかもしれません。


- VBの発するエラーメッセージ -

外見からは非常に単純に見えたアプリケーションでも、いざ作ってみるとエラーメッセージが表示されることがあります。一般的なコンパイル型言語では、ソースコードを入力し終えてそれをコンパイラに通したときにコンパイルエラーが、無事にコンパイルを終えてリンカにかけたときにリンクエラーが表示されます。
ところがVBでは、開発環境自体にインタプリタを抱え込んでいるため、ソースを編集し終えてテスト実行した時点で、コンパイルエラーや実行時エラーが表示されます。外見上リンク工程は存在しないので、リンクエラーは存在しません。
また、ソースの入力中にエラーが指摘されることもあります。このようにVBでは、アプリケーションを完全に完成させる前の段階で間違いが示されるので、その時点でバグを修正できます。大きく膨れ上がってしまってからバグの原因を探すより、小さな部品の段階でそれを行う方がはるかに効率的なことは、言うまでもありません。インタプリタとコンパイラの双方の機能を持つ、VB統合環境の大きなメリットです。



- 初期段階ではデバッガ不要 -

VBには、アプリケーションを実行させながら変数の変化など内部の状態を監視し、適当な箇所で停止させて修正する――といったデバッガの機能も用意されていますが、初歩の段階ではデバッガを使う必要はありません。ソース入力とテスト実行で、ほとんどすべてのバグが退治できます。
初歩の段階で遭遇しそうなエラーメッセージと、その対処方法を紹介しておきましょう。



- 正しく動かない! -

作成したアプリケーションが「正しく動作しない」場合、当然ソースの修正が必要です。この場合の「正しく動かない」には、以下の2通りの意味が込められています。

(1) 見た目は出来上がっているのに、思い通り動かない
ボタンをクリックしても変化がない
ボタンが見つからない

(2) アプリケーションは動作するが、どこかおかしい
メッセージが尻切れになる
一度動いたのに、2回目から動かない
出来上がったプロジェクトが消えてしまった
- (1)見た目は出来上がっているのに、思い通り動かない -

ボタンをクリックしても変化がない
まず、ソースコードの先頭にコメントを示す「'」が付いていないか確かめましょう。

Private Sub Command1_Click()
  ' Label1.Caption = "Enjoy Programming!!"
  ' Label1.ForeColor = vbMagenta
End Sub

などとなっていたら、肝心の文字列を表示する処理がコメントとみなされて実行されません。
また、フォームをデザインしている段階では、ボタンをクリックしても選択されてハンドルが表示されるだけで、プロシージャは実行されません。アプリケーションを動作させるには「実行(R)」→「開始(S)」を選択します。
ボタンが見つからない
フォームを小さくしすぎると、ボタンもフォームの外になって実行時に表示されなくなります。フォームのフレームをドラッグして、広げてみましょう。
ボタンの上にラベルなど他のコントロールを貼り付けると、下敷きになって隠れてしまう場合があります。コントロールをドラッグで移動させて、確かめてみましょう。
また、プロパティの設定でVisibleプロパティをFalseにしていると、デザイン時には表示されていても、実行時には非表示となります。ここは、通常はTrueにしておきましょう。標準では、Trueになっています。


- (2)アプリケーションは動作するが、どこかおかしい -

メッセージが尻切れになる
ラベルの大きさを調整し、文字列が完全に表示される大きさにしましょう。アプリケーションを終了させてフォームのデザイン画面にし、ラベルのハンドルをドラッグして広げます。
また、フォーム自体を小さくしすぎると、文字列だけではなくボタンなども尻切れになります。
一度動いたのに、2回目から動かない
[元に戻す]ボタンに割り当てたプロシージャが機能していないことが考えられます。先の説明したように、ソースコードがコメントとなっていないか確かめましょう。

'Private Sub Command2_Click()

などと、プロシージャの開始行自体がコメントとなっていると、プロシージャそのものが存在しないことになります。この場合、後述する「コンパイルエラー」が発生します。
出来上がったプロジェクトが消えてしまった
プロジェクトはファイルとして保存しなければ、次に違うプロジェクトをオープンしたり、新規作成したりした時点で消えてしまい、二度と再実行はできません。
未保存のプロジェクトをオープンした状態で、別のプロジェクトをオープンしようとしたり新規作成しようとすれば、現在のプロジェクトを保存するか尋ねてきます。作成したアプリケーションは、必ず保存しましょう。


エラーメッセージとその対処方法

VBで簡単なアプリケーションを作ったときに遭遇しそうなエラーメッセージと、その対処方法を掲げておきます。どれもちょっとした不注意で現れるもので、すぐに訂正できます。


- 入力時のエラー -

以下のエラーは、ソースコードの入力中に現れます。

修正候補:識別子
「識別子」とは命令語やプロシージャの名前などのことです。これが正しくないということで、例えば

Sub Command1_Click()

とすべきところを

Sub Command1_Click( 

のように最後の「)」(閉じ括弧)を付け忘れたような場合に表示されます。通常、この部分はあらかじめ入力されているので間違えることはありませんが、ソースを訂正した場合に間違って削除することのないよう、気をつけておきましょう。
修正候補 識別子または角かっこ([ ])で囲む必要がある名前が含まれています。
「Label1.Caption.」などと行の最後に余計な「.」を付けた場合に表示されます。
修正候補 式
「Label1.Caption;」などと行の最後に余計な記号(>、<、;など)を付けた場合に表示されます。
修正候補 ステートメントの最後
「Sub Command1_Click()+」などと、プロシージャの始まりの行の最後に不要な記号を付けた場合、あるいは「Sab Command1_Click()」などと"Sub"の綴りを間違えた場合に表示されます。
修正候補 行番号またはラベルまたはステートメントまたはステートメントの最後
「+Private Sub Command1_Click()」などと、プロシージャの始まりの行の先頭に不要な記号を付けた場合に表示されます。
名前が適切ではありません
同じ名前のプロシージャがもう1つ存在している場合に表示されます。
「Command2_Click ()」とすべきところが「Command1_Click ()」と、先に記述したプロシージャ名と同じになっていないか、確認しましょう。

このほか、最も大事な約束ごととして、VBのソースコードは必ず「1バイト文字(俗に言う半角文字)で入力する」という決まりがあります。特別な場合を除いて、これはほとんどすべてのプログラムにあてはまる約束ごとです。
ただVBの場合は、2バイト文字で入力しても、[Enter]を押せば自動的に1バイト文字に修正してくれます。"Caption"を"caption"とするなど大文字と小文字を間違えても、ほとんどの場合正しく修正してくれます。また、コントロールの名前や変数名にも、日本語2バイト文字が使えます。
ただし綴りが間違っていると、上記のようなエラーが発生します。



- 実行時のエラー -

ソース入力が無事に終わっても、それで安心はできません。以下のような実行時エラーが発生する場合があります。

メソッドまたはデータメンバが見つかりません。
「Label1.Caption」とするところを「Label1.Captio」などと文字が足りなかったり綴りを間違えたりして、正しい名前を入力しなかった場合に表示されます。
End Sub、End Function または End Property 以降には、コメントのみが記述できます。
プロシージャの終わりを示す「End Sub」以降に、何らかの文字列を入力した場合に表示されます。通常、「End Sub」以降にソースコードを入力することはありませんが、ついうっかりキーボードを触って知らぬ間に文字が入力されている場合もあります。


- 終了させてから手直しを -

実行時のエラーでは、いったん実行中のアプリケーションを停止させてから、ソースの間違いを訂正しなければなりません。この場合は、メニューから「実行(R)」→「リセット(R)」を選択するか、■ボタンをクリックします。  プログラムが停止すると、ソースコードの問題のあった箇所またはそれに近い個所が強調表示されるので、そこを目安にソースを修正します。


- 原因は単純なミスがほとんど -

ここで取り上げた以外にも、ちょっとしたミスでうまく動かないことがあります。
特に

Label1.Caption

などの個所の「.」を「,」と間違えたり、行の最後に・や;などの余計な記号を入力してしまったりすると、間違いなくエラーが発生します。
VBでは、入力中のエラーは画面1、実行中のエラーは画面2のようなメッセージボックスで表示されます。入力中のエラーは、コードウィンドウにソースコード入力して[Enter]を押した直後に現れ、実行中のエラーはアプリケーションを実行してボタンをクリックしたときなど、プロシージャが実行された時点で表示されます。

画面1:入力中のエラーメッセージ
画面2:実行中のエラーメッセージ



- 強調表示の前後も調べる -

エラーメッセージには概略的なことしか書かれていません。内容によっては、メッセージが的はずれに思えるものもあります。が、エラーメッセージが表示されるとコードウィンドウも同時にオープンし、エラーの元となった箇所のソースが強調表示されるので、その部分、またはその前後当たりに間違いがあると目星を付けられます。
このとき、必ずしも強調表示された箇所が間違っているとは限らないことに注意しましょう。特に実行時のエラーは、VBがソースを読み取り解釈して動作する過程で、正しい処理を行えなくなった時点でエラーが発生します。その直前、あるいは直後など、強調表示されている部分に関係する別の箇所が間違っている可能性もあります。
エラーメッセージとともに示されるエラー箇所は、必ずしも間違っている場所ではなく、間違いを見つけるための手がかりということになります。

今回は、初歩の段階で遭遇するエラーとその対処だけに絞って紹介しました。複雑なアプリケーション、特にデータベースを扱うようになると、エラーの種類も増え、原因究明も対処方法も複雑で高度な知識が要求されるようになってきます。
そういった複雑な問題に対処するためには、さらに複雑なアプリケーションの構造やデータベースについて知っておかなければなりません。
回を追って、どんどん深入りしていくことにしましょう。
Copyright © MESCIUS inc. All rights reserved.