下記のような質問がHPに来ました。
質問です。
Q: ユーザーフォーム(TextBox)に、下書きをTemplateで作って、呼び出しています。
その下書き文章の中に、場所を選んで(カーソルクリックなど)から、
別のListBoxにある文字列を挿入(挿入ボタンをクリックして)したいのですが、1.TextBoxの中の位置を関数でとることができますか?
2.カーソルが一度TextBoxから離れますが、その時の1を保持して、
ListBox(Selected(I))の文字をセットする方法がありますか?
で、かなり失敗しながらチャレンジしてみました。
作成過程
いつもの作成動画です、やはり カッコつけて即興でサッと作るつもりが、
途中ハマった動画です。
http://www.youtube.com/watch?v=JScb1-DgxZ8
www.youtube.com
(※まぁ、ハマって途中固まるのは三流君らしいけど、いいかげんにしないと、
正解を速くほしい 質問者が怒ってしまうか。。。)
処理のポイント
Me.TextBox1.SelStart で 選択位置の先頭 を取得できます。
(今回は、使わなかったのですが、.SelLengthで長さ、.SelTextで選択テキスト )
.SelStartこの値(選択位置)を利用して
テキストボックスの文章を
Left と Mid 関数を利用して分割して、
分割前半 = Left(元のテキスト, 選択位置.SelStart)
分割後半 = Mid(元のテキスト, 選択位置.SelStart + 1, Len(元のテキスト))
で、リストボックスの値と&でつなげてみました。
'結果を代入
Me.TextBox1.Text = 前半 & Me.ListBox1.Value & 後半 '文字を挿入して再代入
複数行の処理で、選択位置がなぜかうまく取得できなかったので、
strWORK = Replace(Me.TextBox1.Text, vbCrLf, vbCr) '改行コードの調節
'*1↑マルチラインの時
なんて感じで、vbCrLf 2文字を vbCr 1文字に直して対応してみました。
(原因が違う気もするが、宿題です。詳しくは操作動画を見たり、自分で動かしてみてください)
作成結果
結果は、下記のような感じです。
※作成過程と合わせてみてください。
Option Explicit Private Sub CommandButton1_Click() Debug.Print Me.TextBox1.SelStart '選択位置の先頭 Debug.Print Me.TextBox1.SelLength Debug.Print Me.TextBox1.SelText Dim s1 As String '前半 Dim s2 As String '後半 Dim strWORK As String 'ワーク、一時変数 strWORK = Replace(Me.TextBox1.Text, vbCrLf, vbCr) '改行コードの調節 '*1↑マルチラインの時 s1 = Left(strWORK, Me.TextBox1.SelStart) s2 = Mid(strWORK, Me.TextBox1.SelStart + 1, Len(strWORK)) '結果を代入 Me.TextBox1.Text = s1 & Me.ListBox1.Value & s2 '文字を挿入して再代入 End Sub Private Sub CommandButton2_Click() 'テストで保存 Open ActiveWorkbook.Path & "\テスト.txt" For Output As #1 Print #1, Me.TextBox1.Text Close #1 End Sub
終わりのあいさつ
なんか、テキストボックス、マルチラインのCrLf変換が気になるなぁ。
LfとCrをいじらないで、違う方法があるような気もするし、
まぁ、いつもの宿題ですね。