Access VBA:InputBoxのようなフォームを作成する|戻り値はキャンセルとOK

簡単に入力できるInputBoxフォームをVBAで使う方法を掲載しています。

BackHome Backフォーム

日付やパスワードを入力する、専用のInputBoxを作りたい場合があります。そこでここではフォームで改造の基本となるようなInputBoxを作成します。
使用するコントロールはラベル・テキストボックス・OKとキャンセルのコマンドボタンになります。
フォームを開く時に、複数の引数を設定できるようにし、タイトルやテキストボックスの初期値を指定できるようにします。
フォームはダイアログ形式にし、フォームを閉じなければフォーカスが戻らないようにします。
フォームのサイズは、Form_Loadイベント内でコマンドボタンの位置とサイズから計算し設定します。
次に掲載している「フォーム入力時に自動的に半角と全角(日本語)を切り替える」も参照してください。




InputBoxのようなフォームを作成する

下のようにフォームデザインで、ラベル・テキストボックス・2つのコマンドボタンのコントロールを配置しました。
コマンドボタンの標題プロパティに、それぞれ「OK」と「キャンセル」を設定しました。

フォームデザインで、ラベル・テキストボックス・2つのコマンドボタンのコントロールを配置

フォームを開くVBAを標準モジュールに作成しました。
これは標準モジュールでなくても、別のフォームからでも同じです。

フォームを開くVBAを標準モジュールに作成

フォームを開くには、DoCmd.OpenFormを使用し,引数のWindowModeにacDialogを指定することで、ダイアログ形式にしています。
これでInputBoxと同様に、フォームが閉じないとフォーカスは戻りません。

Private Sub MyInputBox()
    DoCmd.OpenForm "F_InputBox", , , , , acDialog
End Sub

実行し、開いたフォームです。
レコードセレクタなどは不要なので、ダイアログボックスらしい見た目に修正します。

ダイアログボックスらしい見た目に修正する

フォームのプロパティを下記に変更します。

  • サイズ自動修正を「いいえ」に変更
  • 境界線スタイルを「細線」に変更
  • レコードセレクタを「いいえ」に変更
  • 移動ボタンを「いいえ」に変更
  • スクロールバーを「なし」に変更
  • 最小化/最大化ボタンを「なし」に変更
フォームのプロパティを変更する

フォームの読み込み時イベントに、フォームのサイズを設定するVBAです。

フォームの読み込み時イベントに、フォームのサイズを設定するVBA

  • フォームの位置とサイズは、DoCmd.MoveSizeで設定できます。
  • 位置の引数は必要ないので設定していません。
  • フォームの幅は、キャンセルボタンの左位置+ボタンの幅+400にしています。400は見た目で決めました。
  • フォームの高さ、キャンセルボタンの上位置+ボタンの高さ+800にしています。800は見た目で決めました。

Private Sub Form_Load()
    DoCmd.MoveSize , , Me!コマンド2.Left + Me!コマンド2.Width + 400, _
        Me!コマンド2.Top + Me!コマンド2.Height + 800
End Sub

設定したサイズで開いたフォームです。

設定したサイズで開いたフォーム


フォームを開く時のOpenArgsに複数の引数を設定する

フォームを開いた時に、任意に渡すことができる引数のOpenArgsは1つだけです。
そこで、コンマ区切りの文字列をOpenArgsに設定し、その後分解するようにします。

コンマ区切りの文字列をOpenArgsに設定する

・「"入力してください。,MyInputBox,あいうえお"」のように3つの文字列をコンマで区切っています。
1つ目がタイトル文字、2つ目がラベルの標題、3つ目がテキストボックスの初期値になります。


Private Sub MyInputBox()
    DoCmd.OpenForm "F_InputBox", , , , , acDialog, "入力してください。,MyInputBox,あいうえお"
End Sub


フォームを開く時の引数 OpenArgsを分解するVBAです。

フォームを開く時の引数 OpenArgsを分解するVBA

  • Splitは指定した区切り文字で分解し、結果を配列にして返します。
  • UBoundで配列の大きさを求めて、Forループで1つずつ取り出し、タイトルなどにセットしていきます。

Private Sub Form_Load()
    Dim s1 As Variant
    Dim i As Long
    
    DoCmd.MoveSize , , Me!コマンド2.Left + Me!コマンド2.Width + 400, _
        Me!コマンド2.Top + Me!コマンド2.Height + 800
    
    s1 = Split(Nz(Me.OpenArgs), ",")
    For i = 0 To UBound(s1)
        Select Case i
            Case 0: Me.Caption = s1(0)
            Case 1: Me!ラベル1.Caption = s1(1)
            Case 2: Me!テキスト0.Value = s1(2)
        End Select
    Next
End Sub



複数の引数を設定したフォームです。

複数の引数を設定したフォーム

フォームの戻り値を取得できるようした標準モジュールのVBAです。

フォームの戻り値を取得できるようした標準モジュールのVBA

  • 戻り値を格納するPublic変数lRretを宣言しています。
  • 戻り値を確認するため、MsgBoxで表示しています。

Public lRet As Long

Private Sub MyInputBox()
    DoCmd.OpenForm "F_InputBox", , , , , acDialog, "入力してください。,MyInputBox,あいうえお"
    
    MsgBox lRet & " が返りました。"
End Sub



コマンドボタンのクリックで戻り値を設定し、フォームを閉じるVBAです。

コマンドボタンのクリックで戻り値を設定し、フォームを閉じるVBA

  • Form_Load時、Public変数lRretを初期化しています。
  • キャンセルボタンがクリックされると、DoCmd.Closeでそのままフォームを閉じます。
  • OKボタンがクリックされると、戻り値lRetに1をセットし、フォームを閉じます。

Private Sub Form_Load()
    Dim s1 As Variant
    Dim i As Long
    
    lRet = 0
    
    DoCmd.MoveSize , , Me!コマンド2.Left + Me!コマンド2.Width + 400, _
        Me!コマンド2.Top + Me!コマンド2.Height + 800
    
    s1 = Split(Nz(Me.OpenArgs), ",")
    For i = 0 To UBound(s1)
        Select Case i
            Case 0: Me.Caption = s1(0)
            Case 1: Me!ラベル1.Caption = s1(1)
            Case 2: Me!テキスト0.Value = s1(2)
        End Select
    Next
End Sub

Private Sub コマンド2_Click()
    DoCmd.Close acForm, "F_InputBox"
End Sub

Private Sub コマンド3_Click()
    lRet = 1
    DoCmd.Close acForm, "F_InputBox"
End Sub



OKボタンがクリックされた場合のメッセージボックスです。

OKボタンがクリックされた場合のメッセージボックス

キャンセルボタンがクリックされた場合のメッセージボックスです。

キャンセルボタンがクリックされた場合のメッセージボックス


BackHome Backフォーム

Copyright(C) FeedSoft