- ベストアンサー
EXCEL VBAのユーザーフォームのコマンドボタンでBSキーと同様の役割を持たせる方法について
すいません、EXCEL VBAで教えていただきたいことがあります。 EXCEL VBAでユーザーフォームを作る。 フォーム内にはTextBox1とCommandButton1を設置。 TextBox1に書き込んだ文字をドラッグ →CommandButton1を押す →ドラッグした文字を消去 という機能をコマンドボタンに持たせたいのですが 可能でしょうか。 下記のコードを作ってみたのですが、やはりこれだと一文字づつしか消せません。 よろしくお願いします。 Private Sub CommandButton1_Click() Dim i As Integer With Me.TextBox1 i = .SelStart If i > 0 Then .Text = Left(.Text, i - 1) & Mid(.Text, i + 1) .SelStart = i - 1 End If End With TextBox1.SetFocus End Sub
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 > BSキーと同様の役割を持たせる方法 そのままんま、SendKeys でキー送信してみては? キー送信時の フォーカスは事前に設定しておきます。 Private Sub CommandButton1_Click() TextBox1.SetFocus SendKeys "{BS}" End Sub
その他の回答 (3)
- chie65536
- ベストアンサー率41% (2512/6032)
追記の追記。 SelStartプロパティやSelLengthプロパティを操作して、テキストボックス内の文字を操作する場合は、Textプロパティを操作せず、SelTextプロパティを使います。 何故なら、Textプロパティを操作すると、カーソル位置(SelStartプロパティやSelLengthプロパティ)の値が初期化されてしまう(カーソルが有無を言わさず先頭に飛んでしまう)からです。 Textプロパティを操作せず、SelTextプロパティを操作すれば、カーソル位置は変化しません。 なお、SelTextプロパティに空じゃない文字列(""じゃない文字列)を与えれば、範囲選択した部分を置換したり、カーソル位置に文字列を挿入出来ます。
お礼
できました!ありがとうございます。 SelTextを使うというやり方を知らなかったので、 非常に勉強になりました。 またよろしくお願いいたします。
- chie65536
- ベストアンサー率41% (2512/6032)
追記。 If .SelStart = 0 Then 'カーソルが先頭にあるなら Exit Sub '何もしない この2行の間に、1行追加して、以下のように修正して下さい。 If .SelStart = 0 Then 'カーソルが先頭にあるなら .SetFocus 'フォーカスだけ戻して ←この1行を追加 Exit Sub '何もしない カーソルが先頭に居て範囲指定が無かった場合、フォーカスが戻ってませんでした。
- chie65536
- ベストアンサー率41% (2512/6032)
BSキーの動作は、以下のようになります。 ・範囲指定が行われていない場合、カーソルが先頭にある場合は何もしない。 ・範囲指定が行われていない場合、カーソルが先頭にない場合は、カーソルの1文字手前が消える。 ・範囲指定が行われている場合、範囲指定部分が消える。 これをVBで書くと以下のようになります。 Private Sub CommandButton1_Click() With Me.TextBox1 If .SelLength = 0 Then '範囲指定がされてない場合 If .SelStart = 0 Then 'カーソルが先頭にあるなら Exit Sub '何もしない End If .SelStart = .SelStart - 1 'カーソルを1文字分、左へ動かし .SelLength = 1 '1文字分、範囲指定する End If .SelText = "" '範囲指定されている部分を消去する .SetFocus 'フォーカスを戻す End With End Sub
お礼
こんな簡単な方法があったとは! 恥ずかしながらこのやり方は知りませんでした。 やりたかったことが全部解決です! どうもありがとうございました。