- ベストアンサー
Excel2003 VBAでテキストボックスを使用して住所録を編集する方法
- Excel2003のVBAを使用して、ユーザーフォームからの入力・操作のみでシート上の住所録を編集する方法について質問があります。セル範囲の名前の定義やオブジェクトの配置、新規データの入力や検索機能などのコードを提供しています。
- 新規データの入力時には、テキストボックスに入力したデータをセルに追加し、住所録を氏名でソートするコードを提供しています。また、コンボボックスで選択した名前からテキストボックスに名前と住所を表示するコードも提供しています。
- しかし、テキストボックスに表示された文字を変更しても訂正後の情報が反映されない問題が発生しています。訂正後の情報を反映させるためにはどうすればよいか質問しています。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
Private Sub CB2_Click()の最後で Selection = TB2 が抜けていました。これが原因で提案した コードでデータが訂正されなかったようです。 また、必要の無いイベント Private Sub CB3_Click() が最後にありましたので 削除しました。 あらためて以下で確認してみてください。 Private Sub UserForm_Initialize() Dim lRow As Long With Worksheets("Sheet1") lRow = .Range("A" & Rows.Count).End(xlUp).Row End With With CMB .ColumnCount = 1 .RowSource = "Sheet1!A2:A" & lRow End With End Sub Private Sub CB1_Click() Dim x As String Range("A65536").End(xlUp).Select Selection.Offset(1, 0).Select Selection = TB1 Selection.Offset(0, 1).Select Selection = TB2 'コンボボックスの再設定で追加 Dim lRow As Long With Worksheets("Sheet1") lRow = .Range("A" & Rows.Count).End(xlUp).Row End With With CMB .RowSource = "Sheet1!A2:A" & lRow End With End Sub Private Sub CB2_Click() Dim BB As String Dim CC As Object BB = CMB.Text With Worksheets(1).Range("A2:A101") Set CC = .Find(What:=BB, LookIn:=xlValues, lookat:=xlWhole, _ SearchOrder:=xlByColumns, MatchByte:=False) Cells(CC.Row, CC.Column).Select Selection = TB1 Selection.Offset(0, 1).Select Selection = TB2 End With End Sub
その他の回答 (5)
- piroin654
- ベストアンサー率75% (692/917)
No4を変更します。少々。
- piroin654
- ベストアンサー率75% (692/917)
一応、こちらで設定したコードをすべて 上げておきます。いくつかは変更し、 いくつかはそのまま使っています。 これで確認してみてください。 Private Sub UserForm_Initialize() Dim lRow As Long With Worksheets("Sheet1") lRow = .Range("A" & Rows.Count).End(xlUp).Row End With With CMB .ColumnCount = 1 .RowSource = "Sheet1!A2:A" & lRow End With End Sub Private Sub CB1_Click() Dim x As String Range("A65536").End(xlUp).Select Selection.Offset(1, 0).Select Selection = TB1 Selection.Offset(0, 1).Select Selection = TB2 'コンボボックスの再設定で追加 Dim lRow As Long With Worksheets("Sheet1") lRow = .Range("A" & Rows.Count).End(xlUp).Row End With With CMB .RowSource = "Sheet1!A2:A" & lRow End With End Sub Private Sub CB2_Click() Dim BB As String Dim CC As Object BB = CMB.Text With Worksheets(1).Range("A2:A101") Set CC = .Find(What:=BB, LookIn:=xlValues, lookat:=xlWhole, _ SearchOrder:=xlByColumns, MatchByte:=False) Cells(CC.Row, CC.Column).Select Selection = TB1 Selection.Offset(0, 1).Select End With End Sub Private Sub CB3_Click() Dim BB As String Dim CC As Object BB = CMB.Text With Worksheets(1).Range("A2:A101") Set CC = .Find(What:=BB, LookIn:=xlValues, lookat:=xlWhole, _ SearchOrder:=xlByColumns, MatchByte:=False) Cells(CC.Row, CC.Column).Select Selection = TB1 Selection.Offset(0, 1).Select Selection = TB2 End With End Sub
- piroin654
- ベストアンサー率75% (692/917)
他のコードについては省きますが、訂正ボタンに 関しては、以下で動きますが。 Private Sub CB2_Click() Dim BB As String Dim CC As Object BB = CMB.Text With Worksheets(1).Range("A2:A101") Set CC = .Find(What:=BB, LookIn:=xlValues, lookat:=xlWhole, _ SearchOrder:=xlByColumns, MatchByte:=False) Cells(CC.Row, CC.Column).Select Selection = TB1 Selection.Offset(0, 1).Select Selection = TB2 End With End Sub
補足
ご回答ありがとうございます。 TB1,TB2の値を両方共変更した場合はTB1のみ機能するようです。 シートにはTB1は変更後、TB2は変更前の値が入ります。 layyさんに指摘していただいたようにMsgboxでTB2の値を確認したところ TB1:変更なし、TB2:変更あり("ABC"から"XYZ"に変更)の条件では Selection = TB1 の前まではTB2.Valueは"XYZ"なのですが Selection = TB1 の直後にTB2.Valueは"ABC"に戻ってしまいます。 CMBの値がどこかで邪魔をしてしまっているのでしょうか?
- layy
- ベストアンサー率23% (292/1222)
>BB = CMB.Value >Set CC = Range("氏名").Find・・・・ >Cells(CC.Row, CC.Column).Select >Selection = TB1 >Selection = TB2 同じ状況ができなかったので、確認です。 必要となるBBやCC、TB1やTB2の値は DEBUG.PRINTなりMSGBOXなり試して内容を確認していますか?。 それともエラーメッセージが表示されているのでしょうか?。
補足
度々ありがとうございます。 DEBUG.PRINT, MSGBOXでの確認はしていませんでした。 MSGBOXでの確認を処理の各段階でしてみます。
- layy
- ベストアンサー率23% (292/1222)
各イベントのときVALUEで指示した値は取得できてる?。 CBMはCMBの間違い?。
補足
ご回答ありがとうございます。 CBMはCMBの打ち間違えです。失礼しました。 記載したコードは質問用に簡単にしたもので 実際のものは正しい記述になっております。 ご指摘の「値の取得」ですが、どのように確認したらよろしいのでしょうか?
お礼
CB2クリック時のCMBの値が問題と考え、 Cells(CC.Row, CC.Column).Select の後に CMB.ListIndex = -1 のコードを追加しました。 このことにより、 CMB_Change()が作動し、TB1, TB2の値と整合性が取れなくなりエラーが出てしまいましたが、 CMB_Change()をCMB_AfterUpdate()に変更することでエラーの出現を回避することが出来ました。 教えて頂いた、 Dim lRow As Long With Worksheets("Sheet1") lRow = .Range("A" & Rows.Count).End(xlUp).Row End With With CMB .ColumnCount = 1 .RowSource = "Sheet1!A2:A" & lRow End With のコードは目から鱗でした。 コンボボックスでの選択の範囲をリスト全行からしていましたが これにより入力された行のみの選択となり、ずいぶんすっきりしました。
補足
遅くなりましたが、記述して頂いたコードを試してみました。 やはり、CB2クリック時の動作が上手くいきません。 TB1, TB2 両方共に変更した場合は共に変更後の値がシートに入るのですが、 TB2のみ変更の場合は変更前の値がシートに入ってしまいます。(見た目はシートに変更なし) そして変更したTB2の値もCB2クリックで変更前のものに戻ってしまいます。 ところで記述して頂いたコードの中にCMB_Change()のコードが含まれていませんでしたが、 あれは自分で記述したコードのままでよろしかったのでしょうか。