2011年1月1日土曜日

変数をまとめて初期化するユーザー定義関数

絶対に、誰かが既に書いて、どこかで公開していると思うんですよ。
思うんですけど、見つけられなかったので書いてしまいました。
書いてしまったので、備忘で公開しておきます。


何かの後始末的処理の中で、ひたすら変数をクリアしていく、という不毛なコードが延々と続くときってありませんか?

たとえばこんな感じ。

' 後始末
Set obj1 = Nothing
Set obj2 = Nothing
str1 = vbNullString
str2 = vbNullString
i = 0
j = 0
' 以下略

もうこれはあまりにもかったるいので、まとめて片付けたいわけです。
こんな風に。

' 後始末
ClearVars obj1, obj2, str1, str2, i, j, ...    ' 以下略

では、コード。

' 変数を初期化します。
' 配列と構造体は受け付けないので、注意。
' 使用例: ClearVars db, rs, myName, i, j, ...
Public Sub ClearVars(ParamArray args() As Variant)
    If IsMissing(args) Then Exit Sub
    
    Dim i As Integer
    Dim t As VbVarType

    ' For Each だとオブジェクトを初期化できないので、For ループにする
    For i = LBound(args) To UBound(args)
        t = VarType(args(i))
        If t And vbArray Then
            Err.Raise 5 ' プロシージャの呼び出し、または引数が不正です。
        Else
            Select Case t
                Case vbObject
                    Set args(i) = Nothing
                Case vbString
                    args(i) = vbNullString
                Case vbBoolean, vbDate, vbByte, vbInteger, vbLong, _
                        vbSingle, vbDouble, vbCurrency, vbDecimal
                    args(i) = 0
                Case vbVariant
                    args(i) = vbEmpty
                Case Else
                    Err.Raise 5 ' プロシージャの呼び出し、または引数が不正です。
            End Select
        End If
    Next
End Sub

それもうあるよ、というのをご存知の方は、コメントで教えてください。

2 件のコメント:

  1. 似たようなものがあったなぁと思ったら、YU-TANGさんのサイトの情報でした・・・

    ※コントロールをまとめて扱う関数
    http://www.f3.dion.ne.jp/~element/msaccess/AcTipsC_Function.html

    お決まりの処理なので、1行でスパッとできたら本当に助かりますね。いつだったか、dbをクローズしなかった為に、ファイルの残骸をAccess本体が掴みっぱなしで、無駄に悩んだことがありました。

    返信削除
  2. コメントありがとうございます。スパムフィルタに引っかかっていたので、気づくのが遅れてすみません。たぶん URL が入っていたのでスパム扱いに…ってウチの URL じゃん! 頼むよ Blogger!

    でもねー、こういう機構は言語側で用意しておいてほしいというのが、本音ですね。なんか宣言時に Grouping キーワード付けておけば、InitVars みたいな文でまとめて初期化できるとか。

    返信削除