お手伝いの仕事?を楽にするため,また,簡単なVBAを作りました。簡単にできるかと思ったのですが,意外
に難航。なかなか思った動作をしてくれません。意図した動作とは,
のようなユーザーフォームで,クリックをしなくても,テキストボックスに入力できるようにするというもの
です。入力できるようにするには,TextBox1.SetFocus という表現をするのですが,どう書き換えても入力
できるようになりませんでした。ネットでくぐってもこの SetFocus のトラブルは結構あるみたいで,いく
つも出てきますが,明確な解決法には,あたりませんでした。
最初 Private Sub TextBox1_Change() というイベントに関係することを記載していましたが,だめでした。
そこで,
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
のイベント処理のところに書いたら,やっと思った動作ができました。
SetFocus の命令は,どこに書いても正しい動作をするのではない,ということが,おぼろげながら分かりま
した。
思った動作とは,
ユーザフォームを自動で表示(クリックしなくても,テキストボックスに入力できる状態に)
入力後所定の動作が終わったら,また,テキストボックスに入力できる状態に
ということで,次のようなコードで,思った動作ができました。
Dim keyWord As String
Dim myRange As Range
Dim myObj As Range
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Set myRange = Range("D5:D98")
keyWord = TextBox1.Text
If KeyCode = vbKeyReturn Then
Set myObj = myRange.Find(keyWord, LookAt:=xlPart)
Label1.Caption = "検索結果=「" & myObj.Offset(0, 0).Value & "」" & myObj.Row & "行目"
myObj.Offset(0, -3).Interior.ColorIndex = 6
UserForm1.TextBox1.Text = ""
UserForm1.TextBox1.SetFocus
End If
If KeyCode = vbKeyF1 Then
myObj.Offset(0, -3).Interior.ColorIndex = 0
Set myObj = Nothing
Label1.Caption = "検索結果="
UserForm1.TextBox1.Text = ""
UserForm1.TextBox1.SetFocus
End If
End Sub
Private Sub UserForm_Initialize()
TextBox1.Text = ""
End Sub
Private Sub UserForm_Activate()
UserForm1.TextBox1.SetFocus
End Sub
Private Sub TextBox1_Change()
keyWord = TextBox1.Text
End Sub
やっていることは,単に,テキストボックに検索する文字を入力して,検索後,あれば,あった場所の左側の
背景の色を変えるということで,なんのことはありません。エンターキーを押すと,検索して,F1 を押すと
直前に変えた背景をもとに戻すという,単純な動作です。
ただ,今回のものは,検索の対象が,複数ある場合には,対応していません。複数検索に対応させるには,検
索自体はそれほど複雑ではないのですが,背景色を変える対象も複数になるので,それをもとにに戻すとなる
と,背景を変えた場所を何らかの形で記憶していないとだめで,プロシャージャが複雑になりますので,今回
はやめようかと思います。