Excel2003 VBAでテキストボックスを使用して住所録を編集する方法

このQ&Aのポイント
  • Excel2003のVBAを使用して、ユーザーフォームからの入力・操作のみでシート上の住所録を編集する方法について質問があります。セル範囲の名前の定義やオブジェクトの配置、新規データの入力や検索機能などのコードを提供しています。
  • 新規データの入力時には、テキストボックスに入力したデータをセルに追加し、住所録を氏名でソートするコードを提供しています。また、コンボボックスで選択した名前からテキストボックスに名前と住所を表示するコードも提供しています。
  • しかし、テキストボックスに表示された文字を変更しても訂正後の情報が反映されない問題が発生しています。訂正後の情報を反映させるためにはどうすればよいか質問しています。
回答を見る
  • ベストアンサー

EXCEL2003 VBAのテキストボックス

ユーザーフォームからの入力・操作のみでシート上の住所録を編集出来るものを作ろうとしております。 テキストボックスの値の操作についての質問なのですが、端的に説明しにくいので自分で記述したコードと共に説明させていただきます。 シートはA列に氏名、B列に住所が入るようにし、100件のデータを格納出来るようにします。1行目はタイトルです。 セル範囲の名前は以下のように定義付けしています。  A2:A101 「氏名」  A2:B101 「住所録」 ユーザーフォームには以下のオブジェクトを配置しております。  「名前」入力・出力用テキストボックス(オブジェクト名:TB1)  「住所」入力・出力用テキストボックス(オブジェクト名:TB2)  名前検索用コンボボックス(オブジェクト名:CMB)  「追加」コマンドボタン(オブジェクト名:CB1)  「訂正」コマンドボタン(オブジェクト名:CB2) まずは新規データの入力。テキストボックス(TB1, TB2)に入力した後の「追加」コマンドボタン(CB1)クリック時の処理は以下のコードでうまくいっております。 Private Sub CB1_Click() Range("A65536").End(xlUp).Select Selection.Offset(1, 0).Select Selection = TB1 Selection.Offset(0, 1).Select Selection = TB2 Range("住所録").Sort _ Key1:=Range("A2"), _ Order1:=xlAscending, _ Header:=xlNo, _ OrderCustom:=1, _ MatchCase:=False, _ Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin End Sub 同じテキストボックス(TB1, TB2)を使いデータの訂正をする為、コンボボックス(CMB)に以下のコードを記載しました。 尚、コンボボックスのRowSourceは「氏名」です。 Private Sub CMB_Change() Dim AA As String AA = CMB.Value TB1.Value = Application.WorksheetFunction.VLookup(AA, Range("住所録"), 1) TB2.Value = Application.WorksheetFunction.VLookup(AA, Range("住所録"), 2) End Sub これでコンボボックスで選択した名前からテキストボックスに名前と住所を表示することができました。 ここからが上手くいきません テキストボックスに表示された文字を同じテキストボックス上で変更し、変更後の情報を「訂正」コマンドボタン(CB2)クリックでシート上に送るために以下のコードを記述しました。 Private Sub CB2_Click() Dim BB As String BB = CMB.Value Dim CC As Range Set CC = Range("氏名").Find(what:=BB, LookIn:=xlValues, _ LookAt:=xlWhole, SearchOrder:=xlByRows) Cells(CC.Row, CC.Column).Select Selection = TB1 Selection.Offset(0, 1).Select Selection = TB2 Range("住所録").Sort _ Key1:=Range("A2"), _ Order1:=xlAscending, _ Header:=xlNo, _ OrderCustom:=1, _ MatchCase:=False, _ Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin CBM.ListIndex = -1 End Sub これを実行してもシートには訂正後の情報が反映されず訂正前の情報が入ってしまいます。 ここで訂正後の情報を反映させるためにはどうしたらよろしいのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.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

h_6340
質問者

お礼

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 のコードは目から鱗でした。 コンボボックスでの選択の範囲をリスト全行からしていましたが これにより入力された行のみの選択となり、ずいぶんすっきりしました。

h_6340
質問者

補足

遅くなりましたが、記述して頂いたコードを試してみました。 やはり、CB2クリック時の動作が上手くいきません。 TB1, TB2 両方共に変更した場合は共に変更後の値がシートに入るのですが、 TB2のみ変更の場合は変更前の値がシートに入ってしまいます。(見た目はシートに変更なし) そして変更したTB2の値もCB2クリックで変更前のものに戻ってしまいます。 ところで記述して頂いたコードの中にCMB_Change()のコードが含まれていませんでしたが、 あれは自分で記述したコードのままでよろしかったのでしょうか。

その他の回答 (5)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

No4を変更します。少々。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

一応、こちらで設定したコードをすべて 上げておきます。いくつかは変更し、 いくつかはそのまま使っています。 これで確認してみてください。 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)
回答No.3

他のコードについては省きますが、訂正ボタンに 関しては、以下で動きますが。 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

h_6340
質問者

補足

ご回答ありがとうございます。 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)
回答No.2

>BB = CMB.Value >Set CC = Range("氏名").Find・・・・ >Cells(CC.Row, CC.Column).Select >Selection = TB1 >Selection = TB2 同じ状況ができなかったので、確認です。 必要となるBBやCC、TB1やTB2の値は DEBUG.PRINTなりMSGBOXなり試して内容を確認していますか?。 それともエラーメッセージが表示されているのでしょうか?。

h_6340
質問者

補足

度々ありがとうございます。 DEBUG.PRINT, MSGBOXでの確認はしていませんでした。 MSGBOXでの確認を処理の各段階でしてみます。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.1

各イベントのときVALUEで指示した値は取得できてる?。 CBMはCMBの間違い?。

h_6340
質問者

補足

ご回答ありがとうございます。 CBMはCMBの打ち間違えです。失礼しました。 記載したコードは質問用に簡単にしたもので 実際のものは正しい記述になっております。 ご指摘の「値の取得」ですが、どのように確認したらよろしいのでしょうか?

関連するQ&A

  • エクセルVBAでテキストボックスに文字

    Excel2016です。 ワークシート上に配置した、図形の「テキストボックス」に文字を入れるVBAについての質問です。 下記のTEST01では期待通り文字が入りますが、これはテキストボックスをSelectしなければなりません。 TEST02ならSelectせずにOKかと思ったら実行時エラーとなりました。 どのように修正したらよろしいのでしょうか? Sub TEST01()   Sheets(“Sheet1”).Shapes.Range(Array("TextBox 3")).Select   Selection.ShapeRange.TextFrame2.TextRange.Characters.Text = "TEST/TEST/2020"   Selection.ShapeRange.TextFrame2.TextRange.Font.Name = "Meiryo UI"   Selection.ShapeRange.TextFrame2.TextRange.Font.Bold = msoTrue End Sub Sub TEST02()   With Sheets(“Sheet1”).Shapes.Range(Array("TextBox 3"))     .ShapeRange.TextFrame2.TextRange.Characters.Text = "TEST/TEST/2020"     .ShapeRange.TextFrame2.TextRange.Font.Name = "Meiryo UI"     .ShapeRange.TextFrame2.TextRange.Font.Bold = msoTrue   End With End Sub

  • SelectedIndexChanged

    SelectedIndexChangedイベント後、コンボボックスを空白にしたいのですが、 Private Sub cmb_コンボボックス_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmb_コンボボックス.SelectedIndexChanged Me.cmb_コンボボックス.Text = "" End Sub をしても何も起りません。空白にもならないしエラーにもなりません。 Me.cmb_コンボボックス.Text = Null は出来ないようです。 イベント後、自身のコントロールを空白にするコードを教えてください。ご教授よろしくお願いします。

  • エクセル マクロ 保護解除とテキストボックス追加

    エクセル マクロ 保護解除とテキストボックス追加 作業工程表へ日付けを入力すると■でべた塗りされ、 ボタンで行挿入とテキストボックスが追加(追加後にテキスト入力と移動可能)仕様を作りたいです。 式保護のためD2~R7はロックさせてますが、次の手順で操作するとセルの保護が解除されてしまうため、解除されないようにしたいです。 (1)ファイルを開く、マクロ有効 (2)テキスト追加ボタンで選択したセルの位置へテキストボックス追加(入力、移動可能)  この時、保護解除されていない。 (3)行挿入ボタンで行挿入、D2~R8保護解除される。 Sub テキストボックス() ActiveSheet.Shapes.AddTextbox msoTextOrientationHorizontal, _ Selection.Left + 3, Selection.Top + Selection.Height - 11, _ 50#, 12# End Sub Sub 行挿入() With ActiveSheet .Protect Password:="123", DrawingObjects:=False, UserInterfaceonly:=True Range("A65536").End(xlUp).Offset(0).Select ActiveCell.Resize(1, 23).Select Selection.Copy Selection.Insert Shift:=xlDown Range("A65536").End(xlUp).Offset(0).Select ActiveCell.Resize(1, 3).Select Selection.ClearContents End With End Sub

  • エクセル VBA : テキストボックスのグループ化

    エクセル VBAにてテキストボックスをグループ化したいのです。 マクロを記録すると、 ActiveSheet.Shapes.Range(Array("Oval 82", "Text Box 83")).Select Selection.ShapeRange.Group.Select となります。 "Text Box 83"のように常に名前が固定されているわけではないので、セルのA1からC10にある図形を選択してグループ化するようにしたいのです。 ご存知の方、アドバイス願います。

  • アクセス テキストボックスに値を返す

    こんにちは アクセス2000で管理表を作っています。 工事マスタ 工事ID 工事名 顧客ID 担当ID 顧客マスタ 顧客ID 顧客名 〒 現住所 電話 ファックス メールアドレス (詳細は略) クエリA SELECT 工事マスタ.工事ID, 工事マスタ.工事名, 工事マスタ.顧客ID, 工事マスタ.担当ID, 工事マスタ.顧客担当ID FROM 工事マスタ; 上記のようなテーブル構成とクエリで フォームAを作成しています (コントロールソースはクエリA) フォームAに 顧客IDのコンボボックス顧客コンボを作り それを選択すると詳細が テキストボックス「〒TB」「現住所TB」「電話番号TB」「FAXTB」「メールアドレスTB」に反映するという形をとっています Private Sub 顧客コンボ_AfterUpdate() Me!顧客担当コンボ.Requery '内容反映ここから Me.〒TB = Me.顧客コンボ.Column(2) Me.現住所TB = Me.顧客コンボ.Column(3) Me.電話番号TB = Me.顧客コンボ.Column(4) Me.FAXTB = Me.顧客コンボ.Column(5) Me.メールアドレスTB = Me.顧客コンボ.Column(6) '反映ここまで End Sub うまくいっているように見えたのですが 全部のレコードが変更になっていることに 先程気づきました(T_T;) 調べてみると 非連結だから当たり前ということなのですが これを、各々のレコードで反映できる方法はないでしょうか?

  • VBAについて

    皆様、こんにちは。 VBAを使って会計シートを作っていますが、初心者なので、色々と悩んでいます。今回、コンボボックスにセールをリンクして、コンボボックスで選ばれた値に合わせてシートの行を増やしたいですが、どうすればいいでしょうか?例えば、linked cellは2の場合は、 Range("D25:G27").Select Selection.Insert Shift:=xlDown 3の場合は Range("D25:G28").Select Selection.Insert Shift:=xlDown などのようにしたいですが、誰か詳しい方が教えてくだされば非常に助かります。どうぞよろしくお願いいたします。

  • 重複データーの上書き

    行き詰っています。 よろしくお願いします。 下の構文では、 エラー:オブジェクトは、このプロパティまたはメソッドをサポートしていません と、表示されます。 ”コンボボックス1のデーターと重複しているセル(B2:B50)を探してその行の データーを上書きしたいのです” Private Sub CommandButton1_Click() Dim Mynumber As String Dim FoundCell As Range Sheets("AA").Range("B2:B50").Select Mynumber = ユーザーフォーム.コンボボックス1.Value Set FoundCell = Cells.Find(What:=Mynumber, After:=ActiveCell, _ LookIn:=xlFormulas, LookAt:=xlPart, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False, _ MatchByte:=False) If FoundCell Is Nothing = False Then FoundCell.Select Sheets("AA").Offset(0, 0).Select = Me.コンボボックス1.Value Sheets("AA").Offset(0, 1).Select = Me.テキストボックス1.Value Sheets("AA").Offset(0, 2).Select = Me.テキストボックス2.Value Sheets("AA").Offset(0, 3).Select = Me.テキストボックス3.Value End If Exit Sub End Sub

  • EXCEL VBA

    まことに幼稚な質問で申し訳ないが、バックに合って困っています。 どなたか教えていただけませんか?PCの先生はソフトのバグ!ではないかと云っています。 QT Sub データを作業場に1A() Sheets("データ").Select Range("A1:AB2000").Select  Selection.Copy  Sheets("作業場").Select  Range("A1").Select  ActiveSheet.Paste End Sub UQT Selection.Copyのところで”アプリケーション、オブジェクト等の定義エラーとでます。目を皿のようにしても虫はいないと思いますが? SELECTION.CUTの場合は問題ないのですが! 以上よろしくお願いします。  

  • テキストボックスの表示

    VBAを使って、テキストボックスに表示される内容を設定しているのですが、 下記のように記述とOKですが、 Shapes.Range(Array("Text Box 1")).Select Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "test" Selectを抜かして、 Shapes.Range(Array("Text Box 1")).ShapeRange(1).TextFrame2.TextRange.Characters.Text = "test" のように記述するとエラーになります。 原因がよくわからないのですが、なぜなのでしょうか?

  • エクセルVBA 別シートからのコンボボックス連動

    エクセルVBA 別シートからのコンボボックス連動について Book1(多人数入力用ブック) ・入力シート ・データ用シート Book2(反映用ブック) ・シート1 Book1にコンボボックスが2列 テキストボックスが2列 * 6行のユーザーフォームを作成しました。 コンボボックス1 コンボボックス2 テキストボックス1 テキストボックス2 コンボボックス3 コンボボックス4 テキストボックス3 テキストボックス4 ・ ・ ・ 左のコンボボックスで「あ」が選ばれたときには、右のコンボボックスで「あ行の顧客」・・・というように連動させたいと考えております。 データ用シートのデータは、   A      B          C 1 あ あ行で始まる顧客 か行で始まる顧客 2 か 3 さ 4 た 5 な 6 Private Sub UserForm_Initialize() Dim c As Range ComboBox1.RowSource = "データ用シート!A1:A9" End Sub Private Sub ComboBox1_Change() 'Dim Rng As Range 'Dim i As Long i = ComboBox1.ListIndex If i > -1 Then Dim c As Range Set Sh = Worksheets("データ用シート") Set Rng = Worksheets("データ用シート").Range("B2:I30") ComboBox2.Value = "" ComboBox2.RowSource = Rng.Columns(i + 1).Address End If End Sub 上記コードですと、コンボボックス2が入力シートのデータを表示してしまいうまくいきません。 欲をいえば、 Book1(多人数入力用ブック)入力シートの特定セルに コンボボックス2・テキストボックス1 コンボボックス4・テキストボックス3というように続けて1セルに反映 Book2(反映用ブック)シート1に コンボボックス2・テキストボックス1・テキストボックス2 を各1セル 1行に反映させたいと考えております。 まったく知識がないのですが 仕事上どうしても必要となったので、各種サイトを見よう見真似でやっております。 ご助力いただければ幸いです。

専門家に質問してみよう