- ベストアンサー
Excel VBAコンボボックスの問題点と改善方法
- エクセルVBAコンボボックスの問題点と改善方法について解説します。
- 問題点1:大分類のリストが一部表示されない 問題点2:Select Caseの構文の改善 改善方法として、以下のように修正します。
- - 大分類のリストを正しく取得する - Select Caseの条件を動的に設定する
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>14個ほどあるリストの3つほどしかでてこない。 表示だけの問題でなく確かに3つしか載ってない事を確認済みなのでしたら,あと間違ってる可能性があるのは 次の行: MyVar1 = Sheets("商品リスト").Range("A3:A" & Range("A3").End(xlDown).Row) で,実行中に間違ったシートが開かれているという状況でしょうか。 正しい書き方: MyVar1 = Sheets("商品リスト").Range("A3:A" & Sheets("商品リスト").Range("A3").End(xlDown).Row) 実際には,書いたマクロをただ漫然と実行して「うごいたー とまったー」と一喜一憂してるんじゃなく,アヤシいところでデバッグを行い,あなたの書いた1行1行が確かに意図通りに動作しているのか,その一行一行で変数の値や実際に取得している値の中身や範囲は具体的にどうなっているのか調べ,マクロの動作をトレースして間違いを探してください。 具体的には「3行しか入ってない」その仕込みをしたまさにその瞬間,myVar1の実際の中身はどうなっていたのか,何故そうだったのか,といったことですね。 参考:上から下までよく目を通してください。 http://members.jcom.home.ne.jp/rex-uchida/vba110.htm >可変にしたい Variant配列を宣言して利用してみましょう。 最大個数(20)は「デザイン時にはフィックスしている」ものとします。 Private Sub ComboBox1_Change() Dim MyVar(20) As Variant dim i dim A_max A_max = Sheets("商品リスト").range("A65536").end(xlup).row - 2 for i = 2 to A_max MyVar(i) = Sheets("商品リスト").Range(Sheets("商品リスト").cells(3, i) , Sheets("商品リスト").cells(65536,i).End(xlup)) next i combobox2.list() = myvar(ComboBox1.ListIndex+2) End Sub #実際には,Initialize時点でパブリックなmyVar(20)にデータを取得しておき,各実行時に毎回毎回シートを調べに行ったりしないで済ませるような,仕込みをすると良いんじゃないかな?と思います。
その他の回答 (1)
- Azzz___
- ベストアンサー率40% (9/22)
こんにちは。 直接の回答ではないので恐縮ですが >(2)Select Caseの構文を使用していて、大分類が14個だから「Case 13」までと こちらの方はクラスモジュールを使う方法があると思います。 (というか、それしか私には分かりませんでしたが、、) 複数のコンボボックスのイベントプロシージャで、基本的に同じ処理をしているという前提ですが、 その場合、クラスモジュールを使えば一つのプロシージャで代替できると思います。 (もっともこの場合、Case13までの記述は必要になりますが1回の記述で済むものと思われます) そもそも質問者さんの説明が理解できているか不明なのと、クラスモジュールの 説明は「雛型」、「インスタンス」の概念の理解レベルなどで説明方法変わりが難しいですので 細かい点は遠慮させて頂きます点ご容赦です。 他の回答者が言われているように配列にする方法もありますが、この方法でも可能だと思います。 なお、この場合は、 Private Sub ComboBoxXXX_Change() の部分は省略できず、コンボボックスの数だけChangeイベントを書く必要が出てきます。 (ただ、コンボボックスの名前を工夫すれば共通のプロシージャを1個用意し、 ある程度は楽にできるかもしれません。更に私は分かりませんが、呼び出し元のプロシージャ名を取得できる方法があれば尚良しの感じにできそうですが) 下記で似たようなこと語っています。 http://okwave.jp/qa/q6539523.html なお、 >(1)大分類で14個ほどあるリストの3つほどしかでてこない。 こちらは別の回答者の方が言われているように、コードのミスか何かではないでしょうか? 該当部分を絞って質問された方が的確な回答が得られるかと思います。
お礼
>正しい書き方: >MyVar1 = Sheets("商品リスト").Range("A3:A" & Sheets("商品リスト").Range("A3").End >(xlDown).Row) ここを直したらうまく行きました! ありがとうございました。