- ベストアンサー
VBAでUserFormを使ったデータ入力が正常に動作しない場合の対処方法
- VBAを使用してUserFormを作成し、データの入力を行っていますが、一部のテキストボックスで正しく動作しない場合があります。具体的には、TextBox7にデータを入力しても、指定したセルにデータが入力されないという問題が発生しています。初心者のため、原因がわからず困っています。
- 現在、Windows7とExcel 2010を使用しています。UserFormのコマンドボタンをクリックした際に、指定したセルにデータを書き込む処理が実装されていますが、TextBox7の場合だけうまくいかないのです。他のテキストボックスは正常に動作しているため、何が原因であるのか理解できません。
- 参考にしたコードでは、UserForm内のテキストボックスの値を変数に代入し、指定したセルに代入する処理が行われています。しかし、TextBox7の場合はセルに値が代入されず、何も起こらない状態です。VBAの勉強を始めたばかりで、どこに問題があるのかわかりません。どうぞよろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> TextBox1~6 は順調に入力しますがTextBox7にすると「入力」に飛び おそらく・・としか言いようがありませんが、 「タブインデックス」がコマンドボタンより後にあるのでしょう。 VBE画面でテキストボックスを右クリック⇒プロパティを選択すると、 図のような「プロパティ」という枠が出てきます。 この中の「TabIndex」を確認し、処理したい(フォーカスを置きたい)順番にしてやりましょう。 フォームが開いた時にフォーカスを持つコントロールには「0(ゼロ)」が振られますから、 質問文中の「図」のフォームのままだとすると、テキストボックス7は「7番目にフォーカス」、 よって「6」を設定してやればOKです。 (おそらく今はボタンが「6」、テキストボックス7が「7」に設定されているのでは?) もう一つの確認点は「TabStop」が「False」になっている可能性です。 これだとまったくフォーカスを持てなくなってしまいますので、「True」にしておいてあげましょう。 以上、質問への(私なりの)回答でした。 以下は蛇足で、質問とは全く関係ないのですが・・ > Module のコードには > Sub FormSample() > Do > UserForm1.Show > Loop > End Sub これ、大丈夫ですか? このままだと「強制的にマクロを止めない限り」延々とフォームが出続けますが・・・ 私なら、YES/NO型のメッセージを出し、「NOなら終了/YESなら繰り返し」 のような感じで作ります。 例えば Sub FormSample() UserForm1.Show If MsgBox("続行しますか?", vbYesNo) = vbNo Then Exit Sub Else FormSample End If End Sub 簡単に書くとこんな感じ。 ついでに。 > n = 1 > Do > n = n + 1 > Loop While Cells(n, 1) <> "" おそらく、最終行の次の空白行を取りたいんですね。 もちろん、間違えたやり方とは言いません。 が、これが100行・1000行・・と増えてきたときに どんどんレスポンスが落ちてきます(処理速度が落ちます)。 1行ずつDo~Loopしていく必要があるためです。 (基本的にDo~Loopは遅いです。) なので、別案。 n = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(n, 1) = UserForm1.TextBox1.Text (以下省略) これで、最終行の次の行番号を一発で引っ張ってきます。 これだとデータが何行あっても処理は1回ですから、レスポンスも基本的には落ちません。 以上、参考までに。
お礼
TextBox1 = TabIndex 0 TextBox2 = TabIndex1 という具合に修正したらうまくゆきました。 例えば Sub FormSample() UserForm1.Show If MsgBox("続行しますか?", vbYesNo) = vbNo Then Exit Sub Else FormSample End If End Sub なので、別案。 n = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(n, 1) = UserForm1.TextBox1.Text (以下省略) も採用させていただきました。 丁寧なご回答をいただき誠にありがとうございます。