|
|
| Excel VBA Macro ・ コンボボックス・コントロール ・ FAQ |
|
コンボボックスで入力した値をセルに順次格納するには?
|
|
|
|
Question 21.2 |
|
 |
 |
|
|
サンプルマクロのコンボボックスをダウンさせていただきました。あまりVBAを使ったことが無いので助かっています。
で、サンプルで疑問に思ってることがありますので、質問です。
ダウンロードしたコンボボックスでDBへ直接入力する部分を実行させると、DBシートにC3セルから順次にデータが入力されます。
でも、私の方で同じように作成したものは、データが順次に入力されません。ある1ヶ所での入力になります。
されないのはわかるような気がするのですが、どうして順次に入力されるのかが、わかりません。
よろしくお願い致します。
|
|
Answer Excel 95用 |
Copyright (C) 1999.8.25 永井善王 |
|
|
はじめに、前ページ「コンボボックスでDBへ入力するには?」の回答内容を、復習しておきましょう。

このコンボボックスの仕組み
・リストボックスに映っている県名のどれかをクリックすると、その県名がエディットボックスに写る。
・リストボックスに希望の県名がない場合は、直接エディットボックスに入力することが可能。
・マクロでは、このエディットボックスに入っている値を、セルに取り出すことになる。 ★★
・サンプルマクロとして、下記の二通り用意されている。
1) 入力されたデータを直接にDBへ書き込む方法
2) 一旦、入力シートに書いてからDBシートにコピー貼り付けする方法。
回答に入ります。
二通りのコードはダウンロードしたサンプルマクロで見れますが、下記に転載した第1の方法のコードを使って考えてみましょう。
'=========================================================================================
Sub コンボボックスでDBへ直接入力する()
2 Sheets("DB").Select '住所録データベース用のシート
3 Do
4 下 = Range("C1").End(xlDown).Row 'セルC1の列の下端検出
5 DialogSheets(1).Show '入力用のダイアログ(コンボボックス等)表示
6 Range(Cells(下 + 1, 3), Cells(下 + 1, 3)) = DialogSheets(1).EditBoxes(1).Text
'県名をC列のセルへ
7 Range(Cells(下 + 1, 4), Cells(下 + 1, 4)) = DialogSheets(1).EditBoxes(2).Text
'住所地をD列のセルへ
8 Loop
End Sub
'-----------------------------------------------------------------------------------------
コードの6行目に、= DialogSheets(1).EditBoxes(1).Text と書かれています。
これが、「エディットボックスに入っている値を取り出す」★★ コードです。
では、取り出した値を「DBシートのC3セルから順次にデータを入力」できるのは、なぜでしょうか。
DBシートのレイアウト
6行目の = の左辺に、Range(Cells(下 + 1, 3), Cells(下 + 1, 3)) と書かれています。その中の
Cells(下 + 1, 3) の中の 3 は、C列を意味します。 同様に、7行目にある 4 は、D列となります。
行の指定は、下 + 1 と書かれています。「下」は変数名ですから「下 + 1」の意味は、変数「下」に入っている値に「1」を加えた値となります。
では変数「下」には、どんな値が入っているのでしょうか。
コードの4行目に、下 = Range("C1").End(xlDown).Row と書かれていて、その説明に「セルC1の列の下端検出」とあります。
それより前の2行目で、「DB」シートが選択されていますので、組み合わせて考えると「DBシートのセルC1の列の下端を検出する」となり、上図レイアウトでは、2となります。
以上により 6行目のコードは、エディットボックスの値を、C列の3行目のセルに入力することになります。
7行目のコードの意味は、もう、わかりますね。
.EditBoxes(1).の( )の中の数字は、エディットボックスの識別番号と思っておけば良いでしょう。
さあ、大詰めですよ。
6〜7行目のコードが実行されると、DBシートの3行目にデータが記入されます。次の 8行目のコードは、Loop ですので、Do〜Loop つまり 3〜8行目のコードが繰り返して実行されます。2度目に4行目のコードが実行されて下端検出された行数は、1度目に検出された行数よりも 1行増えているということは、理解できますね。
同様に、2度目に5行目のコードが実行されてコンボボックスが映り、2度目に6行目のコードが実行されると、エディットボックスの値が DBシートの4行目にセットされることが、わかりますか。
この Do〜Loopは、上の図の「コンボボックスのレイアウト」にある[終了]ボタンが押されると、別のマクロが実行されて反復が終ります。[終了]ボタンには予め、別のマクロを登録しておきます。
別のマクロは、サンプルマクロに、「Sub コンボボックス_終了_click()」として載っていますので、見てください。
|
|
|
|
|