メモる
プロシージャ単位で実行できるので適切なプロシージャに分割する。
sheet1.vba
Private sub main()
Call f1
Call f2
End Sub
Private sub f1()
...
End Sub
Private sub f2()
...
End Sub
f1, f2 が独立して実行できる上に、main()に統合できる。
モジュール(翻訳単位)で有効なオブジェクトは初期化する。
Private x as New Collection
Private sub main()
Call init()
Call f1()
Call f2()
End Sub
Privete Sub init()
Set x = Nothing
End Sub
Private sub f1()
Dim data
x.add data
End Sub
Private Sub f2()
x.Count
End Sub
この場合、オブジェクト'x'はプロシージャ呼び出しをまたがって生存するので毎回、初期値の設定をしないと、オブジェクト'x'に追加(Append)される。
標準モジュールには読み取り専用でプロジェクトに局所化されるもの以外置かいない。
Module1.vba
Option Private Module
Public Const MIN=0, MAX=255
大域的な通用範囲は汚さず、変更せず。
クラスモジュールにする場合、共有部分は標準モジュールに置く。
Module1.vba
Option Private Module
Public Const READ_ONLY = 1, CREATE_NEW = 2, APPEND = 8
class1.vba
Private m_mode As Integer
Property Let mode(set_mode As Integer)
On Error GoTo ERR_MSG
If set_mode <> READ_ONLY And _
set_mode <> CREATE_NEW And _
set_mode <> APPEND Then
Err.Clear
Err.Raise Number:=-1, Description:="invalid mode"
Exit Property
Else
m_mode = set_mode
Exit Property
End If
ERR_MSG:
MsgBox Err.Number & vbCrLf & Err.Description
Exit Property
End Property
無闇にクラス(モジュール)化やエラー・ハンドリングに頼らない。
論理エラーはコワイ。