[[20180308194731]] 『VBAのユーザーフォームでのデータ入力』(summer bird) ページの最後に飛ぶ

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

 

『VBAのユーザーフォームでのデータ入力』(summer bird)

VBAによるユーザーフォームを作成して、
データ入力をしたいと思っています。

ユーザーフォーム上には、
オプションボタン1、オプションボタン2、
コンボボックス1、コンボボックス2、コンボボックス3を配置しています。

オプションボタン1を選択した場合のコンボボックス1内のリストを
【 A、B、C 】の3つに、
オプションボタン2を選択した場合のコンボボックス1内のリストを
【 a、b 】の2つにしたいです。

さらに、コンボボックス2については、
コンボボックス1で、
Aを選択した場合は【 あ、い、う、え、お 】の5つ、
Bを選択した場合は【 ア、イ、ウ、エ、オ 】の5つ、
Cを選択した場合は【 1、2、3、4、5 】の5つ、
aを選択した場合は【 〇、△、□ 】の3つ(記号変更可)、
bを選択した場合は【 ●、▲、■ 】の3つ(記号変更可)のように、
コンボボックス1の内容を条件として、
コンボボックス2のリストを変更したいと考えています。

つまり、コンボボックス1については、
どちらのオプションボタンを選択したかによって、
コンボボックス2については、
コンボボックス1の選択内容によって、
それぞれボックス内に異なるリストを表示したいです。

コンボボックス3については、下のコードで
リスト内に1〜5の数字が入っています。

 ≪コード≫
   Option Explicit
 

     Private Sub UserForm_ Initialize()
 
       Dim i As Integer
       With ComboBox3
        For i = 1 to 5
         .Add Item i
        Next i
       End With

このとき、コンボボックス3で1を選択した場合は、
コンボボックス1の内容を、
シート”竹内”のA5セルに、
(A5セル以降のA列に順次転記)
コンボボックス2の内容を、
同じシートのB5セル(B5セル以降のB列に順次転記)に転記します。
コンボボックス3で2を選択した場合は、
コンボボックス1の内容を、
シート”山崎”のA5セルに、
(A5セル以降のA列に順次転記)
コンボボックス2の内容を、
同じシートのB5セル(B5セル以降のB列に順次転記)に転記します。
このように、コンボボックス3で1〜5を選択することによって、
入力データを転記するシートを指定したいと思っています。

以上のような条件の場合、
どのようなコードにすれば
うまくいくでしょうか。

教えていただけると助かります。

よろしくお願いします。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 コンボボックス3の値を選んだ時すぐに転記だと選びなおせないので、
 ユーザーフォームにコマンドボタンを1つ配置します。
 フォームモジュールに下記を入力。
 コンボボックス3選択時のシート選択はご自身で追加してください。
 転記先のシートの表の配置も分かりませんので、ご自身で改良してください。

 Private Sub ComboBox1_Change()
    With Me.ComboBox2
        Select Case Me.ComboBox1.Text
            Case "A"
                .Clear
                .List = Array("あ", "い", "う", "え", "お")
            Case "B"
                .Clear
                .List = Array("ア", "イ", "ウ", "エ", "オ")
            Case "C"
                .Clear
                .List = Array(1, 2, 3, 4, 5)
            Case "a"
                .Clear
                .List = Array("○", "△", "□")
            Case "b"
                .Clear
                .List = Array("●", "▲", "■")
        End Select
    End With
 End Sub

 Private Sub CommandButton1_Click()
    Dim SH As Worksheet
    With Me.ComboBox3
        Select Case .Text
            Case 1
                Set SH = Sheets("竹内")
            Case 2
                Set SH = Sheets("山崎")
                                                '←ここにシートを追加して!
        End Select
    End With
    SH.Range("A" & SH.Rows.Count).End(xlUp).Offset(1).Value = Me.ComboBox1.Text
 End Sub

 Private Sub OptionButton1_Click()
    With Me.ComboBox1
        .Clear
        .List = Array("A", "B", "C")
    End With
 End Sub

 Private Sub OptionButton2_Click()
    With Me.ComboBox1
        .Clear
        .List = Array("a", "b")
    End With
 End Sub

 Private Sub UserForm_Initialize()
    Dim i As Integer
    With Me.ComboBox3
        For i = 1 To 5
            .AddItem i
        Next i
    End With
 End Sub
(ろっくん) 2018/03/09(金) 09:11

横から茶々入れですが、

>オプションボタン1を選択した場合のコンボボックス1内のリストを 【 A、B、C 】の3つに、 オプションボタン2を選択した場合のコンボボックス1内のリストを 【 a、b 】の2つにしたいです。

たぶん、オプションボタン1と2は排他なんだろうなぁと勝手に推測して、こんなのでもいけそうな気がします。

Private Sub OptionButton1_Click()

    Call オプションクリック
End Sub

Private Sub OptionButton2_Click()

    Call オプションクリック
End Sub

Private Sub オプションクリック()

    With ComboBox1
        .Clear
        If OptionButton1 Then .List = Array("A", "B", "C")
        If OptionButton2 Then .List = Array("a", "b")
    End With
End Sub

ComboBoxのChangeイベントの方も、「.Clear」は、Select Caseの外側(前)にしたほうが、ちょっぴり記述が短くなっていいかなぁなんて思いました。

余計なことであればごめんなさい。
(もこな2) 2018/03/09(金) 11:01


 いろいろ継ぎ足すとなんか抜けちゃいますね。。
 最初からちゃんとフロー立てしないとダメね。
 もこな2さん、フォローありがとう!
(ろっくん) 2018/03/09(金) 11:30

ろっくん さま
もこな2 さま

早速のアドバイスありがとうございます。

お2人のお力で想定していた内容がかなり実現できました。

重ねての質問で申し訳ないのですが、
教えていただいたようにコードをコピペしたのですが、
コンボボックス2だけはリストに何も表示されません。

単純にコピペしたのではだめだったのかなと思って
コードを読んでみたのですが、
どこをどう直せばよいのかわかりませんでした。

引き続きお教えいただけると助かります。
よろしくお願いいたします。

(summer bird) 2018/03/09(金) 14:35


>重ねての質問で申し訳ないのですが、
>教えていただいたようにコードをコピペしたのですが、
>コンボボックス2だけはリストに何も表示されません。
 ちょっとろっくんさんのコードをしっかり読んでないので、そちらは解らないですが、私の方はコピペではだめかもです。(オブジェクト名が何になってるかは考慮してないので)

>単純にコピペしたのではだめだったのかなと思って
>コードを読んでみたのですが、
>どこをどう直せばよいのかわかりませんでした。
 とりあえず、どのように修正したか拝見してから説明した方がよいとおもうので、動かない(と思っていらっしゃる)コードを提示してみてください。
(もこな2) 2018/03/09(金) 15:17


 ろっくんさんのコードをそのままコピペしたら、普通に動きましたけど?

(半平太) 2018/03/09(金) 15:24


 フロー立てと言うのかどうか分かりませんが、ちょっと整理してみました。

 不明点がいくつかありますね。(運用上は問題ないかもですけど)

  _______A_______  __________B__________  ________________________________C________________________________
  コントロール     アクション                      処理内容                                       
  OptionButton1    選択                   1.ComboBox1を指定リストで更新する                              
                                          2.ComboBox2のリストをクリアする                                
                                          3.ComboBox3に何するか不明瞭(無選択状態にするなど)             

  OptionButton2    選択                   1.ComboBox1を指定リストで更新する                              
                                          2.ComboBox2のリストをクリアする                                
                                          3.ComboBox3に何するか不明瞭(無選択状態にするなど)             

  ComboBox1        1.項目を選択する     ComboBox2を指定リストで更新する                              
                   2.項目を手入力する    <処理不明>                                                   

  ComboBox2        1.項目を選択する     選択状態にしたまま。特に何もしない                               
                   2.項目を手入力する    <処理不明>                                                   

  ComboBox3        1.項目を選択する     選択状態にしたまま。特に何もしない                               
                   2.項目を手入力する    <処理不明>                                                   

  CommandButton1   クリック               シートに作用させたあと、各Controlをどう言う状態にするかは<不明>

(半平太) 2018/03/09(金) 15:48


メモ帳で書き書きしてるあいだに、本業忙しくなってレス遅れましたが、状況整理するとこうなのでは?

●オプションボタンがクリックされたときのイベント
 1にチェックが付いてるとき
   →コンボボックス1のリストを 【A、B、C】
 2にチェックが付いてるとき
   →コンボボックス1のリストを 【a、b】

●コンボボックス1の内容(textかな?)が変更されたときのイベント
 「A」に変更されたら、コンボボックス2のリストを【あ、い、う、え、お】
 「B」に変更されたら、コンボボックス2のリストを【ア、イ、ウ、エ、オ】
 「C」に変更されたら、コンボボックス2のリストを【1、2、3、4、5】
 「a」に変更されたら、コンボボックス2のリストを【〇、△、□】
 「b」に変更されたら、コンボボックス2のリストを【●、▲、■】

↑ユーザーフォームの話

↓シートに書き込む時の話

●コンボボックス3が
 1のときは、
  コンボボックス1→”竹内”のA5セル
  コンボボックス2→”竹内”のB5セル
 2のときは、
  コンボボックス1→”山崎”のA5セル
  コンボボックス2→”山崎”のB5セル
 【3〜5は提示がないため不明】

>コンボボックス2だけはリストに何も表示されません。
この質問が、「コンボボックス2を変更しても、コンボボックス3にリストが追加されません。」であれば、質問に入ってないので、私もコメントしてないですし、ろっくんさんも特に当該のフォローはされていないように思われます。

なので、繰り返しになりますが、どのような動きを想定して、どのようなコードを書いたけど、どのように想定外になったのか提示(具体的にはコードの提示)がないとアドバイスが難しいです。
(もこな2) 2018/03/09(金) 16:10


もこな2様

説明が拙くてすいません。

先程状況整理していただいた内容は、
もこな2様の書いていただいた通りです。

コンボボックス2については、
オプションボタンを選択、
コンボボックス1のリスト内からデータを選択しても、
コンボボックス2の中が空になっているんです。

フォームモジュールには、
お2人に教えていただいた内容を参考にして、
次のように記述しています。

Private Sub ComboBox1_Change()

    With Me.ComboBox2
        Select Case Me.ComboBox1.Text
            Case "A"
                .Clear
                .List = Array("あ", "い", "う", "え", "お")
            Case "B"
                .Clear
                .List = Array("ア", "イ", "ウ", "エ", "オ")
            Case "C"
                .Clear
                .List = Array(1, 2, 3, 4, 5)
            Case "a"
                .Clear
                .List = Array("○", "△", "□")
            Case "b"
                .Clear
                .List = Array("●", "▲", "■")
        End Select
    End With
 End Sub

 Private Sub CommandButton1_Click()
    Dim SH As Worksheet
    With Me.ComboBox3
        Select Case .Text
            Case 1
                Set SH = Sheets("竹内")
            Case 2
                Set SH = Sheets("山崎")
                                                '←ここにシートを追加して!
        End Select
    End With
    SH.Range("A" & SH.Rows.Count).End(xlUp).Offset(1).Value = Me.ComboBox1.Text
 End Sub

Private Sub OptionButton1_Click()

    Call オプションクリック
End Sub

Private Sub OptionButton2_Click()

    Call オプションクリック
End Sub

Private Sub オプションクリック()

    With ComboBox1
        .Clear
        If OptionButton1 Then .List = Array("A", "B", "C")
        If OptionButton2 Then .List = Array("a", "b")
    End With
End Sub

 Private Sub UserForm_Initialize()
    Dim i As Integer
    With Me.ComboBox3
        For i = 1 To 5
            .AddItem i
        Next i
    End With
 End Sub

引き続きよろしくお願いいたします。

(summer bird) 2018/03/09(金) 19:49


 こっちは半角                        Case "A"
                                                      ↑
                            ↓
 あっちは全角    If OptionButton1 Then .List = Array("A", "B", "C")

 どっちかに合わせてください。

(半平太) 2018/03/09(金) 20:05


   ところで、上にも不明点として書きましたが、
   何故、ListBoxじゃなくて、ComboBoxなのですか?

   項目を手打ちする予定は無いんでしょう?

   将来はあるってことなんですか?
   なるほど、そうだとすれば、ComboBoxにしておいた方が、対応が楽になりますね・・ 

(半平太) 2018/03/09(金) 20:11


原因は、半平太さんが指摘されてるとおりのようですね。

ところで、
 ・ステップ実行
 ・ブレークポイント
と言われて意味がわかりますか?

わからなければネットでちょっと調べてみてください。
今後、自力でデバッグ作業ができるようになる最初の一歩になるはずです。
(もこな2) 2018/03/09(金) 21:13


蛇足です。
推奨はされないけど「:」つかって1行にすることもできたりはしますね。
(慣れないうちは、むしろ混乱の原因になるのでオススメはしませんが)

Private Sub ComboBox1_Change()

    With Me.ComboBox2
        .Clear
        Select Case Me.ComboBox1.Text
            Case "A": .List = Array("あ", "い", "う", "え", "お")
            Case "B": .List = Array("ア", "イ", "ウ", "エ", "オ")
            Case "C": .List = Array(1, 2, 3, 4, 5)
            Case "a": .List = Array("○", "△", "□")
            Case "b": .List = Array("●", "▲", "■")
        End Select
    End With
 End Sub

また、ComboBox3のリストのセットも、5項目程度であればループを回すことがよいのか、ご自身でよく考えたほうがいいのではないかと思いました。
(コンボボックス1、2で配列使ってるのに、コンボボックス3で配列がわかりませんとは言わないですよね?)
Private Sub UserForm_Initialize()

    Me.ComboBox3.List = Array(1, 2, 3, 4, 5)
End Sub

(もこな2) 2018/03/09(金) 21:53


半平太様

ありがとうございます。

半角/全角の違い・・・
納得しました。

修正したところ、
無事コンボボックス2でも
項目が選択できるようになりました。

不明点としてご指摘いただいた点ですが、
単に自分がVBA挑戦し始めたところで、
無知なだけなんです。
正直、リストボックスとコンボボックスの違いも気にしていませんでした。
項目を手打する予定はないので、
それならリストボックスが正解だったんですね。
ご指摘ありがとうございました。
結果的に使えればいいというのではなく、
最初の段階の今こそ基本的なことをいろいろ勉強しなきゃですね。
そういう面でも本当にありがたいです。
(summer bird) 2018/03/09(金) 21:59


もこな2様

ありがとうございます。

半平太様のご指摘で無事解決できました。

教えていただいた「ステップ実行」、「ブレークポイント」ですが
いずれも知らない用語でした。

皆さんのお力添えで、
やりたいこととそのコードの関係を勉強しつつも、
自身でデバッグすることができるようになるところを
目指して1つずつ勉強したいです。

まず「ステップ実行」について検索したところ
デバッグの超基本というページがありました。
第1歩として勉強すべきことまで教えていただいて
本当にありがとうございました。
(summer bird) 2018/03/09(金) 22:09


 見れない間でにだいぶ進んでましたね。
 解決されたようでよかったです。

 もこな2さん
 コンボボックス1と2で配列使ったのは私。3だけが質問者さんの提示です。
(ろっくん) 2018/03/09(金) 23:38

確かに言い方変でしたね。

記述した〜とおしゃってるし、アドバイスのあったコードに関してさらなる質問がこなかったので、自分で調べて消化できたんだろうな〜と解釈したんです。

そうなると、配列とは何ぞやまではわからないにしても、一気にセットする方法は理解できたのだろうから、ループで1個ずつ追加するのがよいのか、一気にセットするのがよいのか、どちらでも好きなほう選べばいいし、必要なら直せるよね。って言いたかったんです。
(もこな2) 2018/03/10(土) 00:58


コメント返信:

[ 一覧(最新更新順) ]


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