ユーザーフォーム SetFocus VBA エクセル 検索 (1)

お手伝いの仕事?を楽にするため,また,簡単な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 を押すと
直前に変えた背景をもとに戻すという,単純な動作です。

ただ,今回のものは,検索の対象が,複数ある場合には,対応していません。複数検索に対応させるには,検
索自体はそれほど複雑ではないのですが,背景色を変える対象も複数になるので,それをもとにに戻すとなる
と,背景を変えた場所を何らかの形で記憶していないとだめで,プロシャージャが複雑になりますので,今回
はやめようかと思います。