リストボックスで選択された値をテキストボックスで変更可能にするには?

Question 36.1 Previous Next
詳細は こちら はじめまして、エクセル500連発を購入しました。
No.233はコンボボックスなのでしょうか? リストボックスでは、ないのでしょうか。
「エディット14_change」 「リスト13_change」のマクロ名は見れるのですが、コードはどこにあるのでしょうか?

「Sub コンボボックスでセルへ直接入力する( )」や、「Sub コンボボックスで入力してDBへ追加する( )」のプロシージャーは、よくわかります。リストボックスの項目をセレクトした時に、どうしたら「エディットボックス?テキストボックス?」に表示できるかが、どうしてもわかりません。
------------------------------------------------------------
No.233に似た、下記のようなマクロを作成したいのです。

Sheet2の A2:B15に、 A 名前、B 住所 の一覧表があります。 リストボックス 1個に、この 2行を表示させます。
リストボックスの上には、テキスト?エディット?ボックス 2つがあります。左のボックスには名前、右のボックスには住所を、リストボックスのセレクトされた文字が随時表示され、文字の修正もここで行います。(No.233と同じ)

テキストボックスの修正が終わると、ダブルクリックかEnterキーで、Sheet3の A5とB5に入力したいのです。Excel2000を使っています。どうかよろしくお願いします。m(_ _)m
Answer  Excel 2000用 Copyright (C) 2000.11.29 永井善王
500連発(第1弾)233番に掲載されているコンボボックスは Excel95のもので、エディットボックスとリストボックスが組み合わさった右下図のようなコントロールです。
Excel500のコンボボックス 県名の見出しのすぐ右に「東京都」と映っている部分がエディットボックス。その下に「東京都、埼玉県…」と映っている部分がリストボックスになります。
このペアが 1つのコントロールですから、リストボックスの項目をセレクトすれば自動的にエディットボックスに表示されます。

お勧めしませんが Excel95のコンボボックスを Excel97以上で使うことは可能です。くわしく知りたければ、下記のページを参考にしてください。
コンボボックスでDBへ入力するには
コンボボックスで入力した値をセルに順次格納するには
コンボボックスで1文字目一致で入力候補を表示するには
セルに入力された値に対応するコンボボックスを表示したいが

Excel97以上のコンボボックス Excel97以上ではコンボボックスのレイアウトが改良されました。エディットボックスとして独立した部分がなくなりましたが、リストから選択した値を修正・追加することは、従来どおり可能です。

ご質問のイメージに近い例があります。その図を右に掲載しておきます。
くわしく知りたければ下記のページを見てください。
コンボボックスのリストをセットする (2列型)

このコンボボックスは、ひょっとすると、あなたのニーズに合うのかも知れません。
前おきは以上にして回答に入りましょう。

あなたは Excel2000をお使いですので、ユーザーフォームに、質問文に沿ってリストボックスとテキストボックスを組み合わせてレイアウトしてみます。
入力用ユーザーフォーム
「リストボックスの上には、テキストボックスが 2つあり、
左のボックスには名前、右のボックスには住所、
リストボックスのセレクトされた文字が随時表示され、
文字の修正もここで行いたい」でしたね。

左図で合っていますか?


マクロを組んでみましょう。一式、順に組んでみますので、分かっている部分は読み飛ばしてください。

1.ユーザーフォームを初期化する(リストボックスのリストをセットする)など
ユーザーフォームに配置されたリストボックスなどのコントロールは、最初にレイアウトするときにプロパティをハンドで設定しておけば、ユーザーフォームがはじめて表示されるときに自動的に初期化されます。

しかし、この例のリストボックスのリストのように、プロパティの値(リストに表示するためのワークシートのセル範囲など)が変る可能性がある場合には、下記の3行目のようにマクロで設定しておきます。説明が長くなるので、ここでは説明しませんが、変数で書いた方が良いでしょう。くわしく知りたければ[範囲選択]のページにいろいろ掲載していますから、参考にしてください。
4行目で
BoundColumn プロパティに 0 を設定しているのは、リストボックスの何行目が選択されたかを知るためです。

5行目はプロパティの設定ではありません。テキストボックスの値をワークシートの何行目にセットするのか(最初の行)を設定しています。あなたの希望は「Sheet3の A5とB5に入力したい」とセルが固定していますが、次々と下方向のセルへ入力したい場合には、変数「行」の値を変えるだけでセットできるように、柔軟性ある書き方にしています。
'------------------------------------------------------------------------------
Private Sub UserForm_Initialize()
    ListBox1.ColumnCount = 2                'リストボックスの列は2
    ListBox1.RowSource = "Sheet2!A2:B15"    'リストのソース(名前住所一覧表)範囲を設定
    ListBox1.BoundColumn = 0                'ListIndexの値(行数)を使用する
    行 = 5                                  'テキストボックスの値をセットする行
End Sub
'------------------------------------------------------------------------------
2.リストボックスがクリックされたときに選択された値をテキストボックスにセットする
リストボックスがクリックされると
click イベントが発生するので、そのイベントプロシージャーで「選択された行数」を取得します。2行目のコードです。
対応するワークシートの行数は、この例では、リストボックスでの行数よりも 2行下(選択された行数 + 2)になるので、その行の A列と B列のセルの値を、テキストボックスのテキストとしてセットします。
'------------------------------------------------------------------------------
Private Sub ListBox1_Click()
    DB行 = ListBox1.Value + 2                   'リストボックス内で選択された行数 + 2
    TextBox1.Text = Worksheets("Sheet2").Cells(DB行, 1)
                                                '名前住所一覧の指定行A列の値セット
    TextBox2.Text = Worksheets("Sheet2").Cells(DB行, 2) '同じく指定行B列の値をセット
End Sub
'------------------------------------------------------------------------------
3.テキストボックス1または2で[Enter]キーが押されたときにその値を指定のセルにセットする
テキストボックスに表示された値は、ユーザーにより修正されたり追加されたりします。修正・追加作業の終わりには[Enter]キー、[TAB]キーなどが押されるでしょう。このとき
Exit イベントが発生するので、そのイベントプロシージャーで修正・追加後の値を取得することが可能です。(ダブルクリックイベントは他の用途に使われることがあるので避けました)
この例では、取得した値を別のワークシート(Sheet3)のセル(A5またはB5)にセットしています。
'------------------------------------------------------------------------------
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    列 = 1                                      'A列を指定
    Worksheets("Sheet3").Cells(行, 列) = TextBox1.Value
                                                'テキストボックス1の値を指定セルへ
    進行状況を表示する
End Sub
'------------------------------------------------------------------------------
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    列 = 2                                      'B列を指定
    Worksheets("Sheet3").Cells(行, 列) = TextBox2.Value
                                                'テキストボックス2の値を指定セルへ
    進行状況を表示する
    列 = 1
    Worksheets("Sheet3").Cells(行, 列) = TextBox1.Value
End Sub
'------------------------------------------------------------------------------
4.ユーザーフォームの「×」ボタンがクリックされたときに実行するイベントプロシージャー
[閉じる]ボタンがクリックされると
Deactivate イベントが発生するので、ユーザーフォームをメモリから削除することにより非表示にします。
このとき注意が必要なこととして、このイベントに先行してテキストボックスの
Exit イベントが発生する場合があり、その場合は、そちらが先に実行されます。
'------------------------------------------------------------------------------
Private Sub UserForm_Deactivate()
    Unload UserForm1                            'ユーザーフォームをメモリから削除する
End Sub
'------------------------------------------------------------------------------
以上のほかに、最初にユーザーフォームを表示するためのマクロが必要ならば、標準モジュールに組んでおきます。
サンプルブックのダウンロードは ここをクリック  (YNxv9g040_ListBox.xls 82KB)
※ 一旦、ブックをハードディスクに保存し、後で改めて開いてから実行してください。

Excel VBA Macro