QA@IT

VBA:テキストボックスについて

2999 PV

お世話になります。現在、ExcelVBA(Excel 2010)で開発を行っています。その中で一つおかしな事象が発生しましたので質問させて下さい。

<<不具合事象>>
フォーム上にテキストボックスが2つ(TextBox1、TextBox2)があります。そのフォームを表示した時にTextBox1にカーソルがあるのですが、TABキーを押しても次のTextBox2に移動せず、TextBox1のテキスト内にTABが入ってしまいます。TextBox2にマウスでフォーカスをあててからTABキーを押しても、同じく次のコントロールに移動せずTABが入ってしまうのです。

ですが、このフォームを閉じた後、再度表示するとTABキーを押すと次のコントロールに移動します(これが期待していた動作)。以降、どうやっても上の事象は発生しないのです。発生するのは必ず「Excelを開いて、最初にフォームを表示した時だけ」です。

なぜこのような動作になってしまうのか全く検討がつきません。テキストボックス関連で記述しているコードは以下だけです。

''' ENTERキー入力時に次のテキストボックスに移動して全テキスト選択
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    If KeyCode = vbKeyReturn Then
        TextBox2.SetFocus
        TextBox2.SelStart = 0
        TextBox2.SelLength = Len(TextBox2.Text)

    End If

End Sub

IMEは「Microsoft Office IME 2010」と「Google日本語入力」どちらも試しましたが同じでした。
また両TextBoxのIMEModeプロパティは「0-fmIMEModeNoControl」です。

VBAのテキストボックスはIME周りで不具合があると聞いたことがあるのですが、この現象もそれと関連があるのでしょうか?

何か原因解明につながるヒントでも構いませんので、よろしくお願い致します。

回答

「Excelを開いて、最初にフォームを表示した時だけ」

この際 Formはどういう操作/処理でどのようにして表示していますか?
セキュリティ設定(マクロ有効化の問い合わせをどうしているか)も含めて教えてください。

あとは既定のインスタンスを使っている(UserForm1.Showの様にやっている)のなら、new してみてください。

Private Sub CommandButton1_Click()

    Dim f As UserForm1

    Set f = New UserForm1
    f.Show
    Set f = Nothing

End Sub

ちなみに以下の様なAs New ~はVBA,VB6ではお勧めしません(理解して使ってるなら構いませんが)

Private Sub CommandButton2_Click()
    Dim f As New UserForm1
    Call f.Show(vbModeless)   ' ここで止めないためだけにモードレスダイアログで表示
    Set f = Nothing
    Call f.Show(vbModeless)   ' 参照が無いと変数アクセスのタイミングで再度 New される。
                              ' 多分VB6/VBAの As New ~ はそういう仕様。
    Set f = Nothing
End Sub
編集 履歴 (0)

回答ありがとうございます!

「Excelを開いて、最初にフォームを表示した時だけ」

この際 Formはどういう操作/処理でどのようにして表示していますか?

シート上に配置したボタンを押した時にmoduleに記載したプロシジャをコールしています。プロシジャは下記の通りです。

Sub ボタン_Click()

    ''' (中略)
    Call frmMainFlow01.Show(vbModal)

End Sub

そこでflied_onionさんの言われた通り、Newしてみました。

Sub ボタン_Click()

    ''' (中略)
    ''' Call frmMainFlow01.Show(vbModal)

    Dim f As frmMainFlow01
    Set f = New frmMainFlow01
    f.Show
    Set f = Nothing

End Sub

すると、先の不具合が見事に改善されました!!!!
今まで後者の書き方はVB.NETでしかやっていませんでした。。。。

(でもこれによって何故先の不具合が改善されたのか全く検討がつきませんが・・・
それについては、今後勉強することにします。)

本当にありがとうございました!

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。