『ユーザーフォームで登録』(Rord)  ユーザーフォームの10個のテキストボックスでデータを入力しSheet(住所録)P6:Y26にコマンドボタンでデータを登録&更新していますが、リストボックス(RowSuorce(P6:Y26)で表示)の選択をしなかったら入力データ行の次の空白行に登録させたいのですが、下記語のコード文だと常に最初の行にデータが登録されてしまいます。解決策があればお教え願えませんでしょうか?(リストボックで選択すれば可能ですが。) P欄には自動でIDNo.を表示するようにしていますが、選択してもID用のテキストボックスには番号が表示せれません。 Windows7・SP1 Office2010 Private Sub CommandButton2_Click() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual If fullname.Text = "" Then MsgBox "登録すべき内容がありません!", vbExclamation, "確認" Exit Sub End If Dim 選択行 As Integer Dim i As Integer If ListBox1.ListIndex = -1 Then 'リストが選択していなかったら、 i = Range("P65536").End(xlUp).Offset(1).Row Range("P" & i).Value = i - 5 Range("Q" & i).Value = fullname.Text(氏名) Range("R" & i).Value = employeenumber.Text(社員No.) Range("S" & i).Value = fromaltitle.Text(職名) Range("T" & i).Value = company.Text(入社日) Range("U" & i).Value = birthdate.Text(誕生日) Range("V" & i).Value = postalcode.Text(郵便番号) Range("W" & i).Value = address.Text(住所) Range("X" & i).Value = tel.Text(TEL) Range("Y" & i).Value = mobilephonenumber.Text(携帯番号) Else i = ListBox1.ListIndex + 6 Range("P" & i).Value = i - 5 Range("Q" & i).Value = fullname.Text Range("R" & i).Value = employeenumber.Text Range("S" & i).Value = fromaltitle.Text Range("T" & i).Value = company.Text Range("U" & i).Value = birthdate.Text Range("V" & i).Value = postalcode.Text Range("W" & i).Value = address.Text Range("X" & i).Value = tel.Text Range("Y" & i).Value = mobilephonenumber.Text End If 'データをクリア ListBox1.ListIndex = -1 With TextBox fullname.Text = "" employeenumber.Text = "" fromaltitle.Text = "" company.Text = "" birthdate.Text = "" postalcode.Text = "" address.Text = "" tel.Text = "" mobilephonenumber.Text = "" End With Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub ---- コードはよく見ていないけど、対象のリストの5行目のP〜Y列には何かあらかじめタイトル行があるんだろうね? 最初、まったく空白の時に入力する場合、もし5行目にタイトル行がなければへんになるので。 そういうレイアウトなら、リストボックスから選ばず、登録すると、ちゃんと最終行に書かれない? それより、 >10個のテキストボックス 扱っているテキストボックスはコードを見る限り 「9個」だね。 まったく使用目的のわからない "TextBox" という名前の 10番目のテキストボックスがあるようだけど。 With でくくって、参照せずに End WIth なので、使われていない。 で、 >選択してもID用のテキストボックスには番号が表示せれません ID用のテキストボックスって、どれ? さらに、ListBox1 のイベントルーティンが別途あって、そこで選択されたものが、各テキストボックスに 転記されるのかな?  そのコードもアップされていないので・・・ (ぶらっと) ---- ぜんぜん本題と関係ありませんが、最初の Application.... は If 文の後にして おかないと、データ登録しないときに設定が変わったままになってしまいます。 今回は運用上問題ないとは思いますが、2010 では 100万行までデータが 扱えますから Range("P65536") は Range("P" & Rows.Count ) や Cells(Rows.Count,"P") などと書くようにしたほうがよいと思います。 コード上はリスト選択していない場合、最終行の下に追加されるように見えますが、 i = Range("P65536").End(xlUp).Offset(1).Row にブレイクポイントを設定して、リスト選択しないで実行した場合ここで止まる でしょうか。また停止するのであれば、i は意図した内容になるでしょうか。 (Mook) ---- お二人方へ  下記がリストボックスのコードです。MsgBox ListBox.ListIndexで表示させるとリストボクスで選択すると 「15」になり最終行の次の空白行に正常に表示され選択肢ないと「0」になり最初の行に登録されてしまいます。 「-1」にならないのです。 If MsgBox(ListBox1.ListIndex) = -1 Then 'リストが選択していなかったら、 i = Range("P" & Rows.Count).End(xlUp).Offset(1).Row Private Sub ListBox1_Change() With ListBox1 Dim targetRow As Integer targetRow = .ListIndex ID.Text = .Text fullname.Text = .List(targetRow, 1) employeenumber.Text = .List(targetRow, 2) fromaltitle.Text = .List(targetRow, 3) company.Text = .List(targetRow, 4) birthdate.Text = .List(targetRow, 5) postalcode.Text = .List(targetRow, 6) address.Text = .List(targetRow, 7) tel.Text = .List(targetRow, 8) mobilephonenumber.Text = .List(targetRow, 9) End With End Sub ---- 今からコードを読んでみるけど、↑で質問した2点の回答もほしいね。 >10個のテキストボックス >扱っているテキストボックスはコードを見る限り 「9個」だね。 >ID用のテキストボックスって、どれ? 追記 With TextBox って何? (ぶらっと) ---- とりあえず、想像もしながら、かつ Mookさんから指摘のあった Application関連プロパティのセットタイミングの適正化、 シートへの更新の最後にListBox1のChangeイベントが連鎖発生していることへの対応、ID というのが何者なのかわからないけど ID用のテキストボックスだろうということで、そのクリアを追加。 ただし、このID って、結局は、何が入力されても無視されるよね?であれば、ここはラベルにしておくべきだと思うね あとは、いったんリストボックスから選んでテキストボックスに転記されたあと、あっ、そうじゃなかった、新規で入れたかった。 こうなっても、リストボックスは選択状態のままなので、テキストボックスに新規データを打ち直しても、選んだものを上書き してしまうね。 選択キャンセルという機能も必要かな? また、RowSourceでリストを設定しているので、空白行がリスト内に、どっさり存在。 なので、選択できてしまう。まぁ、この場合、氏名欄が空白だから、エラーではじく? でも、氏名欄に何か入力すると、その空白の行に書き込まれるね? それでいいのなら、それでいいんだけど。 本筋としては RowSourceをやめ、実際に存在するシート上のデータを直接 List に配列でいれる方法じゃないのかな? さらに(しつこいね?)リストは21行なんだろうけど、おかまいなしにどんどん登録できるよね。 しかしながらリストには26行目までしか表示されない。21行目以降は登録できないようにするか、あるいは、↑でいっているように シートの存在するデータをすべて(かつ、シートに存在するデータのみ)をList に登録すべきだなぁ。 ともあれ、以下。これをベースに、さらに、問題点をクリアにしていけばいかが? Private Sub ListBox1_Change() Dim targetRow As Long If Me.Tag = "Skip" Then Exit Sub With ListBox1 targetRow = .ListIndex ID.Text = .Text FullName.Text = .List(targetRow, 1) employeenumber.Text = .List(targetRow, 2) fromaltitle.Text = .List(targetRow, 3) company.Text = .List(targetRow, 4) birthdate.Text = .List(targetRow, 5) postalcode.Text = .List(targetRow, 6) Address.Text = .List(targetRow, 7) tel.Text = .List(targetRow, 8) mobilephonenumber.Text = .List(targetRow, 9) End With End Sub Private Sub CommandButton2_Click() Dim 選択行 As Long Dim i As Long If FullName.Text = "" Then MsgBox "登録すべき内容がありません!", vbExclamation, "確認" Exit Sub End If Application.ScreenUpdating = False Application.Calculation = xlCalculationManual If ListBox1.ListIndex = -1 Then 'リストが選択していなかったら、 i = Range("P65536").End(xlUp).Offset(1).Row Range("P" & i).Value = i - 5 Range("Q" & i).Value = FullName.Text '(氏名) Range("R" & i).Value = employeenumber.Text '(社員No.) Range("S" & i).Value = fromaltitle.Text '(職名) Range("T" & i).Value = company.Text '(入社日) Range("U" & i).Value = birthdate.Text '(誕生日) Range("V" & i).Value = postalcode.Text '(郵便番号) Range("W" & i).Value = Address.Text '(住所) Range("X" & i).Value = tel.Text '(tel) Range("Y" & i).Value = mobilephonenumber.Text '(携帯番号) Else i = ListBox1.ListIndex + 6 Range("P" & i).Value = i - 5 Range("Q" & i).Value = FullName.Text Range("R" & i).Value = employeenumber.Text Range("S" & i).Value = fromaltitle.Text Range("T" & i).Value = company.Text Range("U" & i).Value = birthdate.Text Range("V" & i).Value = postalcode.Text Range("W" & i).Value = Address.Text Range("X" & i).Value = tel.Text Range("Y" & i).Value = mobilephonenumber.Text End If Me.Tag = "Skip" 'データをクリア ListBox1.ListIndex = -1 'With TextBox FullName.Text = "" employeenumber.Text = "" fromaltitle.Text = "" company.Text = "" birthdate.Text = "" postalcode.Text = "" Address.Text = "" tel.Text = "" mobilephonenumber.Text = "" ID.Text = "" 'End With Me.Tag = "" Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub (ぶらっと) ---- お教えありがとうございます。ここまでわかれば後は自分で解決していきます。 (Rord)