選択したテキストボックスのカーソル位置に文字列を挿入するコマンドボタン

【スポンサーリンク】



複数のテキストボックスに対し、一つのコマンドボタンから文字列を挿入する方法。
ボタンを押してテキストボックスへ一括入力ではなく、選択したテキストボックスかつカーソルを置いた位置に挿入できる。


プロシージャ外

選択したテキストボックスと、そのカーソル位置を格納する変数の宣言。
プロシージャを跨ぐので外側に記載する。

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


【スポンサーリンク】