[Windows 95/98/2000/XP]
Visual Basic Tips
 目次
本書は、Visual Basic においてプログラミングを始めた初心者を対象としている。 その特性上、読んでも意味が無い方もいるかと思うが予めご容赦いただきたい。

 使用できる文字
VB に限らず、プログラミングにおいて変数などに使用できる文字は限られています。
例えば、変数名に漢字・ひらがな・カタカナなどを使う事はできません。
基本的に、漢字などは文字列としてのみ使う事ができます。(文字列型変数の値として) 基本的に、使っていく上で覚えるものであると思うので、あとは言及しません。

 コードの実行順序
VB のコードは一行に一文(ひとつのコマンド)を書く決まりである。また、VB のコードは一行ずつ実行される。
即ち、同時に幾つかのコマンドを実行する事はできない。従って、一行ずつ見ていくことが大切である。
また、途中で関数を使用した場合などは、その関数が終了するまで、次の行へは進まない。
ただし、If や Select Case といった分岐文やDo 〜 Loop や While Wend といった反復文は行を移動する。
また、スタートアップとして設定されているところからコードの実行が開始される。
そして、イベントが発生する(例えば、マウスをクリックしたとか)とその都度そのイベントに対応したコードが実行される。

-------Form1--------------------------------------------------------------------
Private Sub Form_Click 'フォームをマウスでクリックするとこのイベントが発生
'ここに必要なコードを書く
End Sub
===============================================================================
Private Sub PassText_Change 'テキストボックスはオブジェクト名が使われる
'ここに必要なコードを書く
End Sub
--------------------------------------------------------------------------------

-------Form2--------------------------------------------------------------------
Private Sub Form_Click 'フォームをマウスでクリックするとこのイベントが発生
'ここに必要なコードを書く
End Sub
--------------------------------------------------------------------------------

上の二つのコードは同じもののように思えわれますが、少し違います。
上はForm1のコードなので、Form1で発生したイベントのみ反応します。
逆に下のコードもForm2のイベントに対してのみ反応します。

今現在編集している、フォーム・モジュールについて気をつけてください。
分かりやすくオブジェクト名を付け、編集する際に注意してください。
オブジェクト名は違っても、種類(フォームとフォームのように)が同じ場合はイベントの書き方は一緒です。

 宣言と定義
定数の宣言と定義、関数の宣言と定義、変数の宣言と定義を行う必要が必ずといっていいほど存在します。

定義・・・実態を伴う、即ちメモリ上に領域を必要とするもの
宣言・・・実態を伴わない、即ちメモリ上に領域を必要としないもの
次の例を見て下さい。
--------------------------------------------------------------------------------
Type EmployeeRecord ' ユーザー定義型を作成します。
  ID As Integer
  Name As String
  Address As String
  Phone As Long
  HireDate As Date
End Type
--------------------------------------------------------------------------------
これは宣言です。Type ステートメントは宣言です。この宣言された型の変数を実際に定義するまで
メモリの領域を使用しません。

--------------------------------------------------------------------------------
Dim ER As EmployeeRecord
--------------------------------------------------------------------------------
これは定義です。Dim キーワードが使用されています。これによって実際に ER という EmployeeRecord 型
の変数がメモリ上におかれます。

 Dim と Static と Public での宣言
Dim で定義すると、定義したプロシージャ内でのみ参照することができ、プロシージャが終了すると、メモリ領域が開放されます。(データが消えます。)
Static の場合は、Dim と同じく定義したプロシージャ内でのみ参照できますが、プロシージャが終了しても、メモリ領域は開放されません。(データが残ります。)
従って、プロシージャをもう一度実行した場合、定義されている変数には、以前のデータが残ったままです。Public で定義するには、まずプロシージャなどを書く前に書きます。
Public で定義すると、どのプロシ−ジャやモジュールからも値を参照でき、メモリ領域はアプリケーションが終了するまで開放されません。(データは保持されます。)

 Const で宣言する
Const はある値を定数として宣言することができます。 例えば、Thousand という定数を宣言して、その値に1000という数値を入れるとすると次のようになります。

-------------------------------------------
Const Thousand As Integer = 1000
-------------------------------------------

こうすると、1000という数字をあらわすときに、Thousand という名前が使えます。定数には、文字列を宣言することもできます。

---------------------------------------------------------
Const Are_you_ready As String ="準備はよろしいですか?"
---------------------------------------------------------

 変数の定義の書く場所
変数は使用する前に定義します。できるだけ、Sub , Function などのステートメントの後にすぐ書くようにします。ただし、Public で宣言するときすべてのプロシージャの前に書きます。

 型の代入互換性
型には代入互換性というものがあります。ただし、Visual Basic ではこの代入互換性をあまり意識しないでコードを書く事ができます。しかし、ある程度コードが書けるようになるとこの問題に遭遇することがあります。型ごとに異なり、組み合わせなども関係するので必ず、型に関するヘルプを参照すること。

 Sub ステートメントと Function ステートメント
言葉で説明するよりも例を挙げると分かり易いので以下に示します。

----------------------------------------------------------------------
Private Sub IBM()
' 何か処理をここに書く
' 呼び出し元に対して、値を返す必要が無いのだから、このIBM という関数は
' call IBM で呼び出せる
End Sub
----------------------------------------------------------------------

それでは、これを Function に変えてみる事にします。

----------------------------------------------------------------------
Private Function IBM() As String '返す値の型を書く
    ' Function は値を返す。だから次のような行を入れる必要がある。
 IBM = "International Business Machines"
    ' 見ての通り、この関数名の変数に代入する。
    ' これで呼び出し元に International Business Machines という文字列が返される。
    ' 戻り値があるという事は、受け皿が必要である。つまり、 次のように呼び出す。
    ' Dim IBM_Official_Name As String
    ' IBM_Official_Name = IBM
    ' このとき、呼び出し側で関数と同じ名前の変数を定義しないこと。
End Function
----------------------------------------------------------------------

 Sub Main から実行するようにする
フォームをスタートアップに設定すると、オブジェクト名を変更したりするとスタートアップの変更を要求されます。それ自体は問題ありませんが、面倒です。VBでは、Sub Main というステートメントから実行するようにします。プロジェクトのプロパティで[スタートアップの設定]を[Sub Main]に変更します。そして、モジュールを追加または現在存在するモジュールに以下の行を追加します。

-----------------------------------------------------------------------------
Private Sub Main ()
    'ここに必要なコードを書きます。
End Sub
-----------------------------------------------------------------------------
このとき、フォームは自動ではロードされません。従って、次のコードを挿入します。

-----------------------------------------------------------------------------
Form1.Show     'Form1 は フォームのオブジェクト名
-----------------------------------------------------------------------------
これで、サブ/メインから実行するようにできます。この方が、エラーへの対処がしやすくなります。

 コードの書き方
通常、コードを書く際にほとんどのプログラマーはタブキーを多用します。
例えば、次のようにします。

------------------------------------------------------------------------------
Private Sub Microsoft()
  Dim Microsoft As String
  Dim Corporation As String
  Dim Msg As Integer

  Microsoft = "マイクロソフト"
  Corporation = "株式会社"
  Msg = MsgBox("Do you know " & Microsoft & Corporation & "?",vbYesNoCancel + vbQuestion,Microsoft)

    If Msg = vbYes Then
      Msg = MsgBox("さすがですね",vbInformation,"わ〜いわ〜い")
    Else
      Select Case Msg
      Case vbNo
        Msg = MsgBox("それはまずいですね",vbCritical,"おいおい")
      Case vbCancel
        Msg = MsgBox("変ですね〜",vbExclamation,"ドあほ〜")
      End Select
    End If
End Sub
-------------------------------------------------------------------------------
このように段階を作って分かりやすくかくのがコツです。このように書くと段階ごとになっているので、デバックするときに楽になります。ちなみに、If と Select Case をあえて組み合わせました。いきなり、If を 二重三重に重ねると、次はどのコードが実行されるんだ〜?となってしまうので。通常、Select Case で分岐するのはひとつの要素に対して多くの分岐内容があるときに使用します。

---------------------------
Select case <分岐する内容>
case <分岐する内容の値・文字列>


End Select
---------------------------

"Do you Know" & Microsoft というコードがあります。この & は + と書いても構いません。VB で文字列を連結するときは、+ または & を使います。また、MsgBox 関数で長い文字列を扱うとき、一行で書くときたくなってしまう場合があります。そのような場合は次のようにします。
-------------------------------------------------------------------------------
Msg = MsgBox("日本アイ・ビー・エム株式会社は、米国インターナショナル・ビジネス・マシーンズ・" & _
         "コーポレーションの子会社です。",vbYesNoCancel + vbInformation,"IBM")
-------------------------------------------------------------------------------
ちなみに、vbYesNoCancel + vbInformation の + は & などに置き換えることはできません。
vbYesNoCancel などは、実質的な値は整数型だからです。

 Do 〜 Loop ,While 〜 Wend ,For Each 〜 Next (反復文)
反復文(繰り返し)はDo 〜 Loop と While 〜 Wend と For Each 〜 Next の3つで使う事ができます。まず、Do 〜 Loop が一番簡単に書くことができます。次のような条件の反復文を書くとします。
  • 1 〜 100 までの数字を足す。そうしたら足すのをやめ MsgBox関数 でその値を表示する。
  • 他の数字でも簡単に使えるように関数としてコードを書く。


まず、共通のサブ/メインを書きます。
------------------------------------------------------------------------------
Private Sub Main()
  Dim SigmaK As Integer
  SigmaK = Sigma(1,100)
  MsgBox(SigmaK)    '結果を表示するだけでよい
End Sub

------------------------------------------------------------------------------
そして、Do 〜 Loop ステートメントでは次のように書くことができます。
------------------------------------------------------------------------------
Public Function Sigma(Start_Int As Integer , Exit_Int As Integer) '共通で使えたほうが便利
  Dim PlusInt As Integer
  Dim TotalInt As Integer
  PlusInt = Start_Int
  Do
    TotalInt = TotalInt + PlusInt
    If PlusInt = Exit_Int Then
  Exit Do
  End If
    PlusInt = PlusInt +1
  Loop   
  Sigma = TotalInt
End Function
------------------------------------------------------------------------------
これで、5050 を返します。しかし、高校生であれば公式を知っているはずです。
公式を使えばもっと楽にコードを書くことができます。
------------------------------------------------------------------------------
Public Function Sigma(Start_Int As Integer , Exit_Int As Integer)
  Dim MTotalInt As Integer
  MTotalInt = (Start-1) * Start / 2
  Sigma = Exit_Int * ( Exit_Int + 1 ) / 2 - MTotalInt
End Function
------------------------------------------------------------------------------
問題:SigmaK^2 はどうすれば求められるでしょう?ちょっと、この Sigma 関数をいじればすぐできます。
自分で考えてみてください。

 改行コード
MsgBox 関数に大きな文字列を渡すと自動的に改行して表示します。しかし、これでは“きれい”に表示できません。VB には改行コードというものがあります。それを文字列内に入れることで、任意の位置で改行させることができます。

-------------------------------------------------------------------------------
Private Sub IBM_Japan()
  Dim IBM_Official_Name As String
  Dim IBM_Japan As String
  Dim Msg As Integer

  IBM_Japan = "日本アイ・ビー・エム株式会社"
  IBM_Official_Name = IBM    '上のほうに書かれている IBM 関数を呼び出す

  Msg = MsgBox(IBM_Japan & "は米国 " & IBM & Chr(13) &"の間接の子会社です。" ,vbYesNoCancel + vbQuestion,IBM_Japan)

    If Msg = vbYes Then
      Msg = MsgBox("さすがですね",vbInformation,"わ〜いわ〜い")
    Else
      Select Case Msg
      Case vbNo
        Msg = MsgBox("それはまずいですね",vbCritical,"おいおい")
      Case vbCancel
        Msg = MsgBox("変ですね〜",vbExclamation,"ドあほ〜")
      End Select
    End If
End Sub
--------------------------------------------------------------------------------
見ていただければ分かると思いますが、Chr(13) というものがあります。
これが改行コードです。ただし、改行コードは使用するオブジェクト・関数などで少し違うことがあります。
(テキストボックス では、Chr(10) + Chr(13) )

 オブジェクトのプロパティ
オブジェクトの名前以外のプロパティは、できるだけコードによって変更するようにします。これは、そのほうが効率的であり応用しやすいからです。ただし、オブジェクト名のようにコードによって、変更することができないものもあります。

 オブジェクトの関数・プロパティ
オブジェクト自身が関数とプロパティを通常は持っています。その関数とプロパティの使い方を示します。
--------------------------------------------------------------------------------
Form1.Width = 1000   'Form1というオブジェクトのWidthというプロパティに1000という値を代入した。
Form1.Show    'Form1というオブジェクトのShowという関数(値を返さない)を呼び出した。
--------------------------------------------------------------------------------
オブジェクトのプロパティや関数を使用するときは、. でプロパティ・関数をつなげて書きます。

 コード実行中の変数の値
コード実行中の変数の値を見るには、MsgBox 関数などで出力するだけでなく、コードを書くときだけ表示するように、することもできます。Debug.Print <表示させたい変数名> でイミディエイトウィンドウに表示されます。また、コード編集の変数、代入式などにマウスポインタを合わせるとTips 形式で表示されます。

 コードのラベルを定義
VB には Basic と違い各行に番号などの名前がありません。従って、実行時にコードの各行を移動する際にどうしても、行に名前が必要です。そこで、ラベルを書きます。つまり、この行を<XXXX>と呼ぶことにすると書くのです。具体的には、以下のことを書きます。

---------------------------------------------------------------------------
LabelName:
---------------------------------------------------------------------------
LabelName は任意のラベル名でそのあとに : (コロン)を付けるだけです。
これで、ラベルになります。

 エラーへの対応
VB でエラーが発生すると、エラーに対してのコードを書いていないと、実行が強制的に止まります。エラーに対応するには次のような方法があります。
  • On Error Resume Next で エラーが発生した場合は、次の行に進んでしまう。
  • On Error Goto Label で Label が書かれている行に移動する。

応用できるのは後者の方です。前者は問題が発生していても動作を続けてしまう事があります。
後者については、以下に具体的な書き方を示します。
---------------------------------------------------------------------------
Private Sub Main()
On Error Goto Debug_Error
  Dim Directry As String
  Directory = Dir() 'わざとエラーを発生させる
Exit Sub 'エラーが発生しなかった場合この後を実行する必要は無い。

Debug_Error:
  Dim Msg As Integer
  Select Case Err.Number 'Err.Number は寸前に発生したエラーの番号が記録される。
  Case 0 'エラーは発生してない。上のExit Subを入れ忘れても平気なようになる。
  Case else '残りのケースすべて。今回は具体的に場合ごとに対応をしない。
    Msg = MsgBox("エラーです。エラーナンバーは" & Err.Number,vbCritical,"Error")
  End Select
End Sub
---------------------------------------------------------------------------
あとは、Select Case に分岐内容を増やすことと、この Main を Fix_Error などにかえて、Private を
Public に変更し、Debug_Error 以下のみを残し、どこからでもエラーに対応できるようにします。
そして、すべてのプロシージャ内にこの例のように On Error Goto Debug_Error などと書き、Debug_Error
ラベルを書き、Fix_Error を呼び出すようにします。

Copyright © 2001 MBI Software Development Group. All rights reserved.