HOME > 即効テクニック > AccessVBA > フォーム・レポート > フォーム内のコントロールの内容をクリアする

即効テクニック

フォーム・レポート

フォーム内のコントロールの内容をクリアする

(Access 97)

■ 概要 ■
あるフォーム内に存在するコントロールの中で、任意に選択した種類のコントロールの内容だけをクリアする関数を説明します。


■ 準備 ■
標準モジュールに新規プロシージャを作成して、以下のコードを記述して下さい。


■ サンプルコード ■
'ClearCtl関数用の列挙型パラメータ
Public Enum ClearType
    clNull = 1
    clBlank = 2
    clSpace = 3
End Enum

'【引数説明】
'FromNam        :フォーム名。省略した場合はアクティブフォームが対象になる
'myControlType  :コントロールタイプ。Accessの定数か数値で指定する
'                 省略した場合はテキストボックスになる
'                   テキストボックス = acTextBox  = 109
'                   コンボボックス   = acComboBox = 111
'ClearType      :クリアするコントロールに代入する値
'                   clNull  :Null値でクリアする
'                   clBlank :長さ0の文字列でクリアする
'                   clSpace :スペース埋めでクリアする
Public Function ClearCtl(Optional FormName As String = "", _
                         Optional myControlType As Integer = acTextBox, _
                         Optional ClearType As ClearType = clNull)
    On Error GoTo Func_Err:
    Dim Ctl As Control

    'フォーム名の判別
    If FormName = "" Then
        FormName = Screen.ActiveForm.Name
    End If

    'クリアのためのループ処理
    For Each Ctl In Forms(FormName).Controls
        'コントロールの種類を判別
        If Ctl.ControlType = myControlType Then
            'クリアタイプ別の処理
            Select Case ClearType
                Case clNull
                    Ctl = Null
                Case clBlank
                    Ctl = ""
                Case clSpace
                    Ctl = Space(Len(Ctl))
            End Select
        End If
    Next

'終了処理
Func_Exit:
    Set Ctl = Nothing
    Exit Function

Func_Err:
    MsgBox "Error Number : " & Err.Number & vbCrLf & Err.Description
    GoTo Func_Exit:
End Function


■ 動作確認 ■
新規フォーム[フォーム1]を作成し、テキストボックス[テキスト1]、コンボボックス[コンボ1]、コマンドボタン[コマンド1] [コマンド2]を作成する。
  [コマンド1]のOnClick/クリック時イベントに、以下のコードを記述する。
  ------------------------------------------------------------
  Private Sub コマンド1_Click()
      Call ClearCtl("フォーム1", acTextBox, clSpace)
  End Sub
  ------------------------------------------------------------

  [コマンド2]のOnClick/クリック時イベントに、以下のコードを記述する。
  ------------------------------------------------------------
  Private Sub コマンド2_Click()
      Call ClearCtl("フォーム1", acComboBox, clNull)
  End Sub
  ------------------------------------------------------------

フォームビューに変更し、テキストボックス・コンボボックスに適当な値を入力してからコマンドボタンをクリックする。
クリックしたコマンドボタンに応じて、テキストボックスがスペースで埋められ、コンボボックスがNull値でクリアされていることを確認する。


■ 詳細 ■
サンプルでは、フォームオブジェクトのControlsコレクションを利用して、For Eacl...Next構文でControlオブジェクトを順番に処理することで、コントロールの値を一括してクリアしています。
VBAではVBのようにコントロール配列が使えないため、複数のコントロールに対して同じ処理を一括して行う場合、
For Eacl...Next構文を使用することが一般的です。

またEnumステートメントを使用することにより、関数のパラメータを定数で選択することが出来るようになっています。
このサンプル関数は、特に非連結フォームのコントロールをクリアする時に役立つでしょう。

■■ 注意 ■■
Access97にはEnumステートメントが実装されていません。ですからAccess97以前のバージョンでサンプルを実行する場合、Enumブロックを削除し、SelectCase部分のEnumMemberを整数に置きかえ、関数呼び出し時の引数ClearTypeは整数値で指定して下さい。