• 締切済み

VBA ユーザーフォームの値の取得方法

いつもお世話になっております。 以下のような仕様のVBAコードを作成したいと考えています。 (貼付資料も参照してください) ■仕様  (1)ユーザーフォーム   1.処理の対象となる市名をチェックボックスから選択   2.処理の対象となるシート名をコンボボックスから選択  (2)ユーザーフォームで選択した    選択したシートの対象市名のデータを配列に格納  (3)格納した配列を元に一覧、詳細の表を作成 ■オブジェクト  ●ユーザーフォーム  ・フレーム   Frame1:神奈川県 Frame2:茨城県 Frame3:栃木県 Frame4:対象年度  ・チェックボックス   CheckBox1:フレーム外の全選択   CheckBox2~4:各フレームの全選択   CheckBox5~11:市町村名(横浜市~小山市の順)  ・コンボボックス   ComboBox1:対象年度  ●ワークシート ■不明な事  (1)⇒(2)の処理(ユーザーフォームで選択した項目を他のプロシージャで使用する)  について質問させていただきます。  私の頭の中では、  I.パブリック変数を用意して、CheckBoxやComboBoxで選択した項目を格納  II.プロシージャ引数として・・・  の2つの方法が候補として浮かんでいます。  Iに関して  CheckBox1:対象年度については、オブジェクトが1つしかないので、  適当なパブリック変数(今回はmySh)を用意して、  mySh=Combobox1.Value  とすれば、仕様は満たせると思いますが、  CheckBoxに関しては、数が多いので,どのようにすれば良いのかイマイチ分かりません。  IIに関しては、全く見当が付きません。 ■質問  (1)上記の処理を行う場合は、I又はIIの方法で問題無いでしょうか?  (2)I又はIIの方法の優劣はあるのでしょうか?  (3)I、IIの方法を教えてください。 どうぞよろしくお願いします

みんなの回答

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.1

つまり、呼び出し先のプロシージャでデータを格納したいため、 フォームの選択結果をキーとして渡したいということでしょうか? >(1)上記の処理を行う場合は、I又はIIの方法で問題無いでしょうか? 呼び出し先のプロシージャが同じユーザーフォーム内であれば CommandButton1_ClickプロシージャからCall ○○で呼び出して 呼び出し先の○○プロシージャでFor i = 5 To 11~Nextで Me.Controls("CheckBox" & i).Valueとして値を判定すればいいし、 呼び出し先が標準モジュールであれば UserForm1.Controls("CheckBox" & i).Valueで同じく値を判定すればよいのでは? ユーザーフォームは呼び出し先のプロシージャからUnload UserForm1すれば消せますし。 >(2)I又はIIの方法の優劣はあるのでしょうか? 引数でも、広域変数で渡しても好みの問題かと。 >(3)I、IIの方法を教えてください。 I ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ■ユーザーフォームモジュールへ記述 (以下ではコンボボックスしか格納していませんが、チェックボックスはII参照して同様に。) Private Sub CommandButton2_Click() pub_cmBox_no = Me.ComboBox1.ListIndex pub_cmBox_str = Me.ComboBox1.Value Unload Me Call sample2 End Sub ■標準モジュールへ記述 '広域変数を用意 Public pub_cmBox_no As Integer Public pub_cmBox_str As String '結果を表示 Sub sample2()   MsgBox "▼選択されたコンボボックス" & vbCrLf & pub_cmBox_no + 1 & "番目の" & pub_cmBox_str End Sub II~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ■ユーザーフォームモジュールへ記述 Private Sub CommandButton1_Click() Dim list_boo(6) As Boolean Dim list_str() As String Dim cnt As Integer 'チェックボックス判定 For i = 5 To 11   'チェックボックスの状態を配列に格納   list_boo(i - 5) = Me.Controls("CheckBox" & i).Value   If list_boo(i - 5) Then     'Trueのリスト配列(名前)を作成     cnt = cnt + 1     ReDim Preserve list_str(1, cnt)     list_str(0, cnt - 1) = "CheckBox" & i     list_str(1, cnt - 1) = Me.Controls("CheckBox" & i).Caption   Else   End If Next i '要素数1削除 If Sgn(list_str) <> 0 Then ReDim Preserve list_str(1, cnt - 1) Unload Me 'sample1プロシージャを引数つきで呼び出し Call sample1(list_boo, list_str, Me.ComboBox1.ListIndex, Me.ComboBox1.Value) End Sub ■標準(ユーザーフォーム)モジュールへ記述 Sub sample1( _   list_boo() As Boolean, list_str() As String, _   cmBox_no As Integer, cmBox_str As String) Dim i As Integer Dim msg As String msg = "▼全チェックボックスの状態" For i = 0 To UBound(list_boo)   msg = msg & vbCrLf & "CheckBox" & i + 5 & "=" & list_boo(i) Next i msg = msg & vbCrLf & "▼チェックされているもの" If Sgn(list_str) <> 0 Then   For i = 0 To UBound(list_str, 2)     msg = msg & vbCrLf & list_str(0, i) & "=" & list_str(1, i)   Next i Else   msg = msg & vbCrLf & "1つもチェックされていません" End If msg = msg & vbCrLf & "▼選択されたコンボボックス" If cmBox_no > -1 Then   msg = msg & vbCrLf & cmBox_no + 1 & "番目の" & cmBox_str Else   msg = msg & vbCrLf & "1つも選択されていません" End If MsgBox msg End Sub

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAユーザーフォームの操作について

    いつもお世話になっております。 VBAでユーザーフォームのチェックボックス使用したデータを作成しています。 ●ユーザーフォームの仕様  1.各県名ごとにフレームを作成し、フレーム内に市名と全選択のチェックボックスを配置  2.各フレームの全選択のチェックボックスにチェックを入れると、フレーム内の市名のチェックボックスにチェックが入る  3.フレーム外の全選択のチェックボックスにチェックを入れると、全チェックボックスにチェックが入る。 ●オブジェクト名 ・フレーム  Frame1:神奈川県 Frame2:茨城県 Frame3:栃木県 ・チェックボックス  CheckBox1:フレーム外の全選択  CheckBox2~4:各フレームの全選択  CheckBox5~11:市町村名(横浜市~小山市の順) ●プロシージャ 1つ1つの動作をIFステートメントを使って記述しています。 ※IFの中身については、チェックボックスの数がもっと多ければ For Nextなんかを使ってもっとスッキリできますが、今回は数か少ないので羅列しています。 以上に関して、貼付ファイルのようなコードを記述してみました 一応仕様を満足する動作はしてくれるようですが・・・ ご指摘がありましたら、よろしくお願いします。

  • VBAユーザーフォームのチェックボックスについて

    いつもお世話になっております。 VBAのチェックボックスについてお尋ねします。 貼付ファイルのようなユーザーフォームを作成しました。 フレーム1(TEST1)に 1.CheckBox1(全選択) 2.CheckBox2 3.CheckBox3 フレーム2(TEST2)に 4.CheckBox4(全選択) 4.CheckBox5 5.CheckBox6 フレーム外に 6.CheckBox7(全選択) があります。 フレーム1のCheckBox1にチェックを付けるとCheckBox2とCheckBox3にチェックが入り フレーム外のCheckBox7にチェックを付けると全てのCheckBoxにチェックが入るようにしたいのですが。 どなたかご教授をお願いします。

  • EXCEL VBA ユーザーフォーム内のテキストボックスを一括処理する方法について

    EXCEL VBAのユーザーフォームについて質問があります。 ユーザーフォームを作り、その中にコンボボックスを1個、テキストボックスを100個設置する。 コンボボックスの値が1のときはテキストボックス1~テキストボックス50までのEnabledをFalseに設定し、 コンボボックスの値が2のときはテキストボックス1~テキストボックス100までのEnabled をFalseに設定する。 このとき、TextBox1.Enabled = False、TextBox2.Enabled = False・・・と一つ一つ書いていくのではなく、 セルを処理するときと同様に、テキストボックスの番号を変数にして処理することは可能でしょうか。 Private Sub ComboBox1_Change()  Dim i As Integer   If ComboBox1.Value = 1 Then   For i = 1 To 50   TextBox(i).Enabled = False   Next i   ElseIf ComboBox1.Value = 2 Then   For i = 1 To 100   TextBox(i).Enabled = False   Next i   End If End Sub というような処理をイメージしているのですが、うまくいきません。どうぞよろしくお願いいたします。

  • VBA コンボボックスで選んだ値を取得するには

    ユーザーフォーム上のコンボボックスから値を選択し、その値を変数として使いたいのですが、うまくいきません。 コンボボックスのコードで Private Sub ComboBox1_Change() moji1 = ComboBox1.Text Range("A1").Value = moji1 のようにすれば、コンボボックスから値を選んだ時点でA1セルにその値をコピーできるのですが、同じユーザーフォーム上にあるコマンドボタンをクリックして実行する「マクロ1」にてこのmoji1という変数を使いたいのです。 マクロ1にて、上記と同じ Range("A1").Value = moji1 というコードを記述しても、ユーザーフォームで選択した値が消えており、empty値となってしまいます。 原因をご存知の方はお教えください。

  • EXCEL VBA のユーザーフォームで絞り込み

    ここで質問が出来るほどの実力はないのですが・・・。 EXCELのユーザーフォームにコンボボックスを2つ配置しておいて、ComboBox1では都道府県名を選択できるようにしておき、県名を選択したらComboBox2にその県の市町村名が絞り込まれて選択できるようにしたいと考えています。 エクセルにどのような並びでデータをセットしてどのようなコードを書けば実現できるのかをご教授して頂けないでしょうか? まるまる「おんぶにだっこ」的な質問内容ですがよろしくお願いします。

  • エクセルVBA ユーザーフォームのチェックボックス

    エクセルVBAのユーザーフォームのチェックボックスについて教えてください。 frame1の中にCheckbox1~5があるのですが、以下のように指示したいです。 Checkbox1~4は自由にチェックできるようにしておいて、Checkbox1~4の全てにチェックが入った場合に、Checkbox1~4の全てチェックを外し(False)、その代わりCheckbox5を自動的にチェックを入れたいです(True)。 CommandButtonなどをクリックして初めて変化するのではなく、ユーザーフォームにチェックを入れている間に自動的にチェックを入れたり外したいです。 特に「Checkbox1~4の全てにチェックが入った場合」というのを、どこに入力するのか分かりませんでした。 1箇所だけならPrivate Sub CheckBox1_Click()と始めたら良いんだとおもうのですが。。。 よろしくお願いします

  • マクロ VBA ユーザーフォーム 

    いつも大変御世話になっております。 WiindowsXP環境にある【D:\】フォルダ内に【マクロ.xls】があります。 その中にユーザーフォームがあり、そこにはチェックボックスとコマンドボタンがあります。 コマンドボタンを押すと、そのユーザーフォーム内でチェックされたチェックボックスの数を 取得して変数Check_Numberに格納する処理を入れたいのですが、取得方法がわかりません。 例:チェックボックスを2つチェックした状態でコマンドボタンを押すと、【2】が   変数Check_Numberに格納される。 コマンドボタン実行プログラムをこんな↓感じで書きましたが、 これではチェックボックス総数が変更する度に Check_Number_SUMの値を変更しなければいけない為、 汎用性に欠けます。 Private Sub CommandButton1_Click() Dim Check_Number_SUM As Long Dim Check_Number As Long Dim i As Long 'チェックボックス総数設定 Check_Number_SUM = 2 'チェックボックス総数取得 For i = 1 To Check_Number_SUM If Me.Controls("CheckBox" & i).Value = True Then Check_Number = Check_Number + 1 End If Next i MsgBox Check_Number End Sub もっと汎用性が高いコード設計は可能でしょうか? もしご存知の方がいらっしゃるようでしたら、お手数ですがご教授願いますでしょうか? 以上、何卒宜しくお願い致します。

  • EXCEL VBA ユーザーフォームについて

    仕事上システムを作り始めたVBA初心者です。すみませんが、ご教示下さい。 選択した「1の行」のC1をクリックしたときにユーザーフォームを起動させて入力しその行のセルに、数字の1を反映させたいと思っています。 その行は1で終了で今後足していきません。他の行に移ります。 フォームだけは作ってみたのですが反映の仕方がわかりません。 選択項目が多いので、2ページで作りました。 Page1 C1にテキストボックスで「#1」、D1に「#2」(記入ない場合有り)、F1に「#3」(記入ない場合有り)、H1にチェックボックス#4(選択ない場合有り)。 獲得コーナーのI1~Z1まで「Frame1」のグループどれか一組、チェックボックス(I1・J1・K1 3個ずつの連続)。3個中、左以外は記入ない場合有り。いずれかのグループに必ずチェック。 内訳の「Frame2」AA1~AK1のオプションボタン一つ必ず選択。 Page2 「Frame3」AL1、AM1、AN1で、オプションボタン一つ必ず選択。 「Frame4」チェックボックス複数選択「#11」AO1・PO1、 「#12」AQ1・AR1、「#13」AS1、AT1(記入ない場合有り) 「Frame5」AV1~AZ1複数選択 「Frame6」BA1~BC1複数選択 「Frame7」BD1~BE1複数選択 「Frame8」BF1~BI1オプションボタン一つ必ず選択。 選択後右下のコマンドボタンの「OK」ボタンで反映させたいと思っています。 選択セルが全てC列なのですが、複数選択する場所があるのと、シートが1日~31日と多いのです。(中身は全て一緒です。) 何を記入するとその行のセルに反映されるのかわからなかったのでご教示いただきたく思います。

  • VBA ユーザーフォームを速く開く方法について

    VBA ユーザーフォームを速く開く方法について 現在Excel2000を使用しています。 VBAにてユーザーフォーム1と2を作成して、ユーザーフォーム1のコマンドボタンを押すと userform2.showが実行されてユーザーフォーム2が開きますが、フォーム2にはテキスト ボックスなどが約400個程設置してあり、そのせいかフォーム2が開くのに約8~10秒程かかり ます。 そこでそのフォームを速く開きたいのですが、(1秒~2秒程で)どうしたら速く開くでしょうか? Application.DisplayFullScreen = Falseなどを使用しても余り効果がありません。 パソコン自体の処理速度もあると思いますが、できるだけ速くしたいです。 よろしくお願いします。

  • エクセルVBAでユーザーフォーム

    エクセルVBAでユーザーフォーム上にオプションボタンが2つ、コンボボックスが6つあります。 OptionButton1をクリックした場合のComboboxの動きの制御について以下のように書いてみました。 これでも期待通りCombobox1~3は動き4~6は動かなくなります。 ただ、もっと別の簡単な書き方があるのではないかと思い質問しました。 宜しくお願いします。 Private Sub OptionButton1_Click() ComboBox1.Enabled = True ComboBox1.ListIndex = 0 ComboBox2.Enabled = True ComboBox2.ListIndex = 0 ComboBox3.Enabled = True ComboBox3.ListIndex = 0 ComboBox4.Enabled = False ComboBox4.ListIndex = 0 ComboBox5.Enabled = False ComboBox5.ListIndex = 0 ComboBox6.Enabled = False ComboBox6.ListIndex = 0 End Sub

専門家に質問してみよう