複数のテキストボックスに対し、一つのコマンドボタンから文字列を挿入する方法。
ボタンを押してテキストボックスへ一括入力ではなく、選択したテキストボックスかつカーソルを置いた位置に挿入できる。
プロシージャ外
選択したテキストボックスと、そのカーソル位置を格納する変数の宣言。
プロシージャを跨ぐので外側に記載する。
Dim objSelTB As Object '直前に選択したコントロール(テキストボックス) Dim intSelSt As Integer 'テキストボックスの選択位置
テキストボックス
クリックしたテキストボックスとカーソル位置を取得する処理を、更新後イベント(AfterUpdate)とクリック時イベント(Click)に入れる。
文字列を挿入したいテキストボックス全てに入れる必要がある。
Private Sub 選択したテキストボックスを取得(objTxt As Object) Rem テキストボックスとSelStartの位置を取得する Set objSelTB = objTxt intSelSt = objSelTB.SelStart End Sub
Private Sub TextBox1_AfterUpdate() Call 選択したテキストボックスを取得(Me.TextBox1) Rem 改行があるテキストボックスで、末尾の改行を保持したい場合はTextを入れる処理を行う Me.TextBox1 = Me.TextBox1.Text End Sub Private Sub TextBox1_Click() Call 選択したテキストボックスを取得(Me.TextBox1) End Sub
コマンドボタン
文字列を挿入するボタンのクリック時イベント。
ボタンの複数設置に備え、処理を別プロシージャにまとめ、挿入文字列を渡す形にしている。
【テスト】
の部分が挿入する文字列で、ここをMe.(コマンドボタン名).Caption
にすればコマンドボタンの標題を挿入できる。
コンボボックスで文字列を選択する形式の場合はMe.(コンボボックス名)
にする。
Private Sub CommandButton1_Click() Call 選択したテキストボックスに文字列挿入("【テスト】") End Sub
文字列挿入処理
テキストボックスに文字列を挿入する処理。
SetFocus
でフォーカスを移し、SelStart
でカーソル位置を指定し、SelText
で挿入。
最後にカーソル位置を移動する処理を入れないと、連続でボタンを押した時、挿入した文字列の前に次の文字列が入ってしまう。
Private Sub 選択したテキストボックスに文字列挿入(strTxt As String) objSelTB.SetFocus objSelTB.SelStart = intSelSt 'カーソルを移動 objSelTB.SelText = strTxt '文字列挿入 intSelSt = intSelSt + Len(strTxt) '挿入した文字列の後ろにカーソル位置を変更 objSelTB.SelStart = intSelSt '続けて入力できるようにカーソルを移動 End Sub
おまけ
上記の方法に行き着く前に色々やっていたけど使わなかったもの。せっかくなのでここに残しておく。
カーソル位置より前/後の文字列を取得する
前
Left(objSelTB.Value, intSelSt)
後ろ
Mid(objSelTB.Value, intSelSt + 1)
Screen.PreviousControlのControlType
Screen.PreviousControl
でコントロールの種類を求める場合はControlType
を使う。
但しScreen.PreviousControl.ControlType
の値は数字。
AccessのControlType
はこのページから確認できる。
https://learn.microsoft.com/ja-jp/office/vba/api/access.accontroltype