[[20160519144910]] 『ユーザーフォームのリストボックスについて(範囲』(フォーム作成中) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーフォームのリストボックスについて(範囲指定が反映されない、絞り込みリストを作成したい)』(フォーム作成中)

VBA初心者です。
ユーザーフォーム作成にあたり、皆様のをお知恵を拝借させて下さい。
よろしくお願いします。

2つのリストボックスを使用して、
リスト1で絞り込んだ項目のリストから、複数選択したデータを入力したいです。

▽ユーザーフォームイメージ
−−−−−−−−−−−−−−−−−−−
ListBox1
□ 野菜
□ 果物
□ お菓子

ListBox2(野菜を選んだ場合)
□ キャベツ
□ キュウリ
□ ホウレンソウ
□ たまねぎ
□ じゃがいも
   ・
   ・
   ・
−−−−−−−−−−−−−−−−−−−
野菜・果物・お菓子のリスト内容は、
それぞれシート2にリストを作成し、名前を定義しています
リスト1の3項目のリストも、同じシートにグループという名前で定義しています

絞り込みフォームが出来ない場合の代案として、まずは3項目それぞれのフォームを作成しようと思い、
一つのリストボックスから複数選択して入力するフォームは作ることが出来たのですが、
その時のリスト範囲が、コードで指定した範囲と連動してくれませんでした

−−−−−−−−−−−−−−−−−−−−−−−−−
Private Sub userform1_Initialize()

    With ListBox1
    .RowSource = "Sheet2!野菜"
    MultiSelect = fmMultiSelectMulti

    End With
End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−
上記のコードを作成したのですが、
複数選択は出来るようになったのですが、リスト範囲指定(RowSource)が反映されず、
VBA画面左に表示されているリストボックスのプロパティ→項目別→データ→Row Source にSheet2!野菜を直接入力するとリストが反映されました。
名前定義ではだめなのかと、コードをSheet2!A1:A10等、リストが入力されている範囲を直接指定をしてもリストボックスには反映されませんでした。

コード上の範囲指定が無視されてしまっているので、この問題が解決されない限り、
絞り込みフォームは作れないと思っているのですが、何が問題なのでしょうか。
自分なりに調べてみたのですが、答えにたどり着けません。

絞り込み選択のコードも作成してみたのですが、上記の問題で作動するかどうかも確認できていない状態ですが、
こちらについてもご指導いただけると助かります。(入力用のボタンなどの部分は省いています)

−−−−−−−−−−−−−−−−−−−−−−−−−

Private Sub UserForm1_Initialize()

    With ListBox1
    .RowSource = "Sheet2!グループ"

    End With
    End Sub

Private Sub ListBox1_Change()
With Me. ListBox2

    .Value = ""
    Select Case Me..ListBox1.ListIndex
        Case 0
            .RowSource = "Sheet2!野菜"
          MultiSelect = fmMultiSelectMulti
        Case 1
            .RowSource = "Sheet2!果物"
          MultiSelect = fmMultiSelectMulti
        Case 2
            .RowSource = "Sheet2!お菓子"
          MultiSelect = fmMultiSelectMulti

     End Select
End With
End Sub

End Sub

−−−−−−−−−−−−−−−−−−−−−−−−−

恐れ入りますが、ご指導よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 コードは、実際に動かしているものを、「そのままコピペ」でアップしましょう。
 手打ちしたものを見せられても、本物ではないので、コメントしづらいです。

 いずれにしても、「ちゃんと正確に記述されたコード」であれば、ちゃんとリスト表示されるはずです。

(β) 2016/05/19(木) 16:34


βさん

コメントありがとうございます。
コードはそのままコピペしています。

野菜や果物の部分は、本来別の言葉ですが、社内情報なので変更しておりますが、
それ以外はそのままの記述です。

もちろん、「ちゃんと正確に記述されたコード」ならば動作することは分かっているのですが、
現在表示されないので、どこかが誤っているのだと思い、質問している次第です。

誤解を与えてしまっていたらすみません。
(フォーム作成中) 2016/05/19(木) 16:52


 >>コードはそのままコピペしています。 

 ほんもののコードなら

 Select Case Me..ListBox1.ListIndex

 こんなコードはコンパイラーから叱られますし

 MultiSelect = fmMultiSelectMulti

 Option Explicit を記述してあれば、これもコンパイラーから叱られます。
 記述してなければ、エラーにはなりませんが、全く機能しない、意味のないコードです。

 一事が万事で、肝心のコードにも、どこか(実際は)違った記述になっているかもしれない。
 そうすると、その記述間違いが悪さをしているということはおおいに考えられることなので
 そのままのコードをアップしてくださいと申し上げました。

 ちなみに、こちらで、例えば Sheet2 に 野菜 という名前の領域を作成し
 RowSource に "野菜" といれても(それがブックレベルの名前なら)当然リストに表示されますし
 "Sheet2!野菜" としても、ちゃんと表示されています。

(β) 2016/05/19(木) 17:33


 ちなみに ListBox2 に対して、何かのイベントプロシジャがかかれていたとしたら
 それも、「そのまま」アップしてください。

(β) 2016/05/19(木) 17:38


Select Case Me..ListBox1.ListIndex  こんなコードはコンパイラーから叱られますし

すみません、元のコードを見たら確かに Select Case Me.ListBox1.ListIndex となっていました。
項目名修正の過程で誤って.を入力してしまったようです。
確認不足で申し訳ありません。

MultiSelect = fmMultiSelectMulti

こちらに関しては、Option Explicit は記述していません。エラーも特に出ていませんでした。
一つ目に記載しているコードでは、リストは反映されなかったのですが複数選択ができるようになったので
このコードでいいのかと思っていたのですが、意味のないものだったのですね…。

実際のコードと照らし合わせてみましたが、上記以外は全く同じ記述になっていました。
コピーして項目名を変更しただけだと思っていた為、混乱を招いてしまい申し訳ありません。
ご指摘いただいた箇所を確認後修正したコード記載させていただきます。
よろしくお願いします。

Private Sub UserForm1_Initialize()

    With ListBox1
    .RowSource = "Sheet2!グループ"

    End With
    End Sub
Private Sub ListBox1_Change() 
With Me. ListBox2 

    .Value = ""
    Select Case Me..ListBox1.ListIndex
        Case 0
            .RowSource = "Sheet2!野菜"
          MultiSelect = fmMultiSelectMulti
        Case 1
            .RowSource = "Sheet2!果物"
          MultiSelect = fmMultiSelectMulti
        Case 2
            .RowSource = "Sheet2!お菓子"
          MultiSelect = fmMultiSelectMulti

     End Select
End With
End Sub
End Sub 

これ以降は入力用のボタンに関する記述でリストボックスに対しての記述はありません。
イベントプロシジャ等も記載しておりません。
よろしくお願いします。
(フォーム作成中) 2016/05/19(木) 19:03


 >>野菜や果物の部分は、本来別の言葉ですが、社内情報なので変更しておりますが、 
 >>それ以外はそのままの記述です。 

 コピペでアップした後、当該部分のみ 野菜 等に 掲示板上で変更してください。

 いくら、目を皿のようにしてチェックしてOKだといいはられても、現に、指摘した2つのコードはそうではなかったわけですし
 他にも With Me. ListBox2 これも手打ちですよね。間違っていますので。

 >>MultiSelect = fmMultiSelectMulti

 まず、Option Explicit は 是非是非、記述してください。
 VBE画面の ツール --> オプション の編集タブ で 変数の宣言を強制する(R) にチェックをいれておくと
 モジュール挿入時点で、自動的に記述されます。

 Option Explicit があれば、うっかりしたタイプミス等、ちゃんとコンパイラーがチェックして叱ってくれるので
 開発生産性が格段にアップします。

 で、MultiSelect = fmMultiSelectMulti 、実際のコードは .MultiSelect = fmMultiSelectMulti でしょ?

 MultiSelect なんていう変数は、どこにも規定されていません。
 (もちろん、ListBox1.MultiSelect といったプロパティはありますよ)

 ユーザーフォーム関連のプロパティであれば Me.なんたら と記述しなくても なんたら だけでいいのですが
 ユーザーフォーム自体のプロパティにもMultiSelectなんてものはありません。

 でも、Option Explicit が記述されていなければ、VBEは、テンポラリーのVariant型変数として、その場で生成して
 そこに fmMultiSelectMulti をいれているだけ。全く無意味ですよね。

 >>よろしくお願いします。

 といわれても、コメントしたように、こちらで、コードを書いて実行すると問題なく、各リストが表示されます。
 ですから、どうにもこうにも、できません。
 本物のコードを見せてもらえれば何かわかるかもしれませんが。
 
(β) 2016/05/19(木) 20:00

 もし、諸般の事情で、コードをすべてアップできないとしたら

 ・With Me.ListBox2  ここにブレークポイントを設定してください
 ・ユーザーフォームを表示して、ListBox1 で 野菜をクリック
 ・With Me.ListBox2  が黄色く光って止まったら、そこから F8 を押しながらステップ実行をしてください。
 ・ちゃんと、.RowSource = "Sheet2!野菜" これが実行されることを確認してください。
 ・念のため、そのあとも End Sub まで、実行させ、ListBox2 に関するコード(ないと、おっしゃっていますが)を実行しないかどうか確認してください。

 もし、ブレークポイントで止まらない場合は

 ・そもそも、ListBox1 のクリックイベントが発生していない。
 ・クリックイベント処理で With Me.ListBox2 の前に、終了している。
 ・クリックイベント処理で With Me.ListBox2 の前に、どこかに分岐している。

 といったことも考えられます。

(β) 2016/05/20(金) 07:59


ミスをたくさんして指摘して頂きありがとうございます。
ですが、残念ながら
>コピペでアップした後、当該部分のみ 野菜 等に 掲示板上で変更してください。
この方法でUPしています。

With Me. ListBox2 も間違いとのことですが、VBA画面上も同じ記述です。
昨日の再UPの時点で貼り直し→項目名を変更をした上でUPしています。
エラーが出ていなかったのでそのまま貼ったのですが、間違いだったのですね。
VBA上ではもともと手打ちで作成しているので、そこから間違っているということなんでしょうね…

>実際のコードは .MultiSelect = fmMultiSelectMulti でしょ?
これもこちらのVBA画面上、MultiSelect = fmMultiSelectMultiと記載していたのでそのまま貼っています。変えていません。

ですが、その間違いを指摘して頂きたかったので、ありがたいです。
間違っているということは分かったので、一から自分で調べなおしてみますね。

VBAに手を付け始めたばかりで、調べたものを組み合わせて作っている状況だったので、
間違いはたくさんあると思い、だからこそ質問させていただいたのですが、
ここまで揚げ足を取るような指摘のされ方をされるとは思っていませんでした。
>こちらで、コードを書いて実行すると問題なく、各リストが表示されます どうにもこうにもできません
とのことですが、こちらではやはりリストは表示されません。
エクセルの設定等の問題もないか一度調べてみます。

最初に一部のコードを誤って改変してしまったことでもう何度貼っても信用いただけないようので、
ここで教えて頂くのはあきらめます。

教えて頂いたOption Explicit 使ってみます。
ありがとうございました。
(フォーム作成中) 2016/05/20(金) 09:18


 少なくとも
 >With Me. ListBox2
 はVBE上でこう打とうとしても
 >With Me.ListBox2
 になってコメントや文字列内でもなければ入力そのものができないと思うのだが。

(ねむねむ) 2016/05/20(金) 09:55


 >>ここまで揚げ足を取るような指摘のされ方をされるとは思っていませんでした。 

 決してそんな意図はないのですが、最近、別トピでも同様の指摘を受けていますので
 これは、ひとえに βの至らなさがなせる状況なんでしょうね。

 質問者/回答者が共同で問題解決していくうえで、まずスタートラインは 『同じコード』を見つめるということだと思っています。
 実際のコードと掲示板にアップされたコードが異なっていた場合

 ・実際には間違っているけど掲示板上で変更した結果、間違いが取り除かれて気が付かない。
 ・逆に 実際は正しいのに掲示板上でミスタイプした結果、そこがおかしいから、そこをなおそうという
  方向の違う議論に陥る。

 こういうことを避けたかったので コピペ して 野菜 だけを タイプしなおしてほしいとお願いしました。

 ねむねむさんから指摘がありますけど、コピペしてアップすれば

 With Me. ListBox2  こういうコードにはなりません。
 With Me.ListBox2  になります。(アップされたコードは Me. の後ろにスペースがあります)

 まずは同じコードを見つめたかったんですが、その意図が通じなかったようです。

 いずれにしても、コメントした ステップ実行。これをやれば、何か発見があるかもしれませんね。

(β) 2016/05/20(金) 11:48


もしかして。
Initialize プロシジヤ、手打ちではなく本当にこのコードだとしたら
UserForm1ではなく1を除いてUserForm だけにしたらどうなりますか?

(β) 2016/05/20(金) 12:48


こんにちは。
まだ見ておられるか分かりませんが。

違っていたらすみませんが、なんとなく、イベントのコードが実行されていない感じがします。
下のようにしたら、メッセージボックスが出てくるでしょうか。

>Private Sub userform1_Initialize()
 MsgBox "イベントのコードは実行されている"  '←これを追加
> With ListBox1
> .RowSource = "Sheet2!野菜"
> MultiSelect = fmMultiSelectMulti

> End With
>End Sub

なお。
>MultiSelect = fmMultiSelectMulti
については、もしかしたら VBA画面(*)左に表示されているリストボックスのプロパティで
複数選択が有効になっているのではないかな、と思います。

(*)VBEという名です。Visual Basic Editor の略です。

'
'
>>コピペでアップした後、当該部分のみ 野菜 等に 掲示板上で変更してください。
>この方法でUPしています。

個人的見解ですが、この方法にはまだミスの入り込む余地があります。
理想を言えば、質問用のファイルを作成して、範囲名を本当に 野菜 等にして
ちゃんと不具合が発生するのを確認後、コードをコピペでそのままUPするのがいいです。
お手間ですが。

ひとによっては、寄せられた回答を質問環境から本物の環境に読み替えることができず、、、
ということもありますが、拝見する限りフォーム作成中さんにはその心配はなさそうです。

( 佳 ) 2016/05/21(土) 16:52


>ここまで揚げ足を取るような指摘のされ方をされるとは思っていませんでした。

なにかとんでもない勘違いしていませんか?
コードが思うように動かないというテーマなので、
コードの細部にわたって指摘を受けたのですから、
感謝することはあっても、批判できる根拠はまるでありません。

掲示板で質問するときのコツまで教えてもらっているのに、
そういう言いぐさは無いと思います。

(γ) 2016/05/21(土) 19:49


 私もコメントさせていただきましたが 佳さんの指摘、Initializeが通っていないと思われます。

 Private Sub Userform1_Initialize() 

 このコードが、本物だとした場合ですけど。
 正しくは

 Private Sub Userform_Initialize() 

 ですので。

 ただ、実際には、ListBox1 にはユーザーフォームが表示された時点でリストが表示されているようです。
 ですから、そこから 野菜 を選ぶことができたわけですので。

 なので、おそらく、プロパティで RowSource が設定されていて、このリストでは、野菜 が 先頭ではない。
 したがって ListBox1 のクリックイベントでの Select Case で空振りしているのかなと想像しています。

 TO γさん

 お気遣い深謝いたします。
 別トピ(なぜか、もうトピそのものが削除されているんですが)で、思わぬ指摘を受け
 ちょっと、へこんでおりました。

(β) 2016/05/21(土) 20:00


こんにちは。

>Private Sub userform1_Initialize()
βさんのご指摘とやや重なりますが、
userform1が小文字なので、、、、VBE上で手入力されてるのかも知れませんね。

失礼ながら、理解力はあるが凡ミスの多いタイプとお見受けします。
手入力を極力避けてコードを作る方法をお教えすれば、将来にわたってお役に立つのでしょうが
いらっしゃるかどうか分からないので、だんだんに張り合いが出ません。

TO βさん
>なぜか、もうトピそのものが削除されている
それなんですよ。どう挨拶したものか困っておりました。
暗闇で握手を求めるここちがします。

( 佳 ) 2016/05/21(土) 22:20


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.