- ベストアンサー
マクロ フォームでのチェックボックスについて
教えてください。 1)フォームでテキストボックス2つ、ボタンで新しい入力フォーム表示 2)入力フォームでチェックボックス6個、コンボボックス6個を作ります。 3)チェックボックスにチェック(1個のみ)したら、1)のフォームのテキストボックスにチェックされた、項目とコンボボックスで選択された内容が転記したい。 例)果物にチェック、コンボでブドウと選択 テキストボックス→果物 ブドウ というようにフォームに転記させたい。 以前、シートでのマクロを教えていただきましたが、フォームだと頭が混乱してしまいました。 簡単で良いので、マクロの記述を教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
遅くなりました、takachan7272です。 会社にOffice2000のPCが有るので試してみました。 問題なく動きました。 1つ伝えていなかった事がありました。 Form2にはオプションボタンは6つ無いとダメです。 コンボボックスは3つしか使っていませんが・・・ 私のサンプルコードは、For~Nextで6回ループさせて、チェックが入っているオプションボックスを確認しています。 6個無いと・・・見付かるはずがないですね・・・ For i = 1 To 6 Step 1 ↑の6を設置したオプションボタンの数に減らせば解決すると思います。 チェックボックスの方法ですが、ただ配置しただけだと全部選択できてしまいます。 下記コードで対応できます(チェックボックス1をクリックした場合) Private Sub CheckBox1_Click() If CheckBox1 = True Then CheckBox2.Enabled = False CheckBox3.Enabled = False CheckBox4.Enabled = False Else CheckBox2.Enabled = True CheckBox3.Enabled = True CheckBox4.Enabled = True End If End Sub CheckBox1がTrueを返した場合、他のチェックボックスのEnableのプロパティをFalseにします。 使用不可に擦るということです。 チェックボックスの数だけ、それぞれに書かなければいけません。 チェックボックスのNo.に気を付けて下さい。 オプションボタンなら、これを書く必要は無いのですが・・・ 最初のサンプルコードのOptionButtonをCheckBoxに置き換えるだけでOKだと思います。 動作するか検証はしていませんけど。 帰りが遅かったもので、また明日見に来ます。 継続して、分かる範囲で回答したいと思います。
その他の回答 (5)
- papayuka
- ベストアンサー率45% (1388/3066)
#2です。 #3さんのサンプルは Excel2000でも問題ありません。 提示された回答をご自分で読み解こうという意識はおありですか? 「指定されたオブジェクト名がないとエラー表示されます。」ってそのものずばり、試している環境で UserForm2 に OptionButton1~6 や ComboBox1~6 と言う名前のオブジェクトが無いだけだと思いますけど、、、 > 選択制で、1個だけ選択させたいです。それらの項目と内容だけをフォーム1に記録させたいです。 > それは可能でしょうか? 可能かって話なら可能だと思いますが、1個だけ選択させる制御のために余計なコードを書かなきゃなりません。 OptionButtonなら勝手にやってくれます。 ベタですが、新規ブックで UserForm に CheckBox を6つ置いて、UserFormモジュールにコピペします。 Sub CheckBox_Check(chCnt As Control) Dim cnt As Control For Each cnt In Me.Controls Debug.Print TypeName(cnt) If TypeName(cnt) = "CheckBox" Then If cnt.Name <> chCnt.Name Then cnt.Value = False End If Next cnt End Sub Private Sub CheckBox1_AfterUpdate() CheckBox_Check CheckBox1 End Sub Private Sub CheckBox2_AfterUpdate() CheckBox_Check CheckBox2 End Sub Private Sub CheckBox3_AfterUpdate() CheckBox_Check CheckBox3 End Sub Private Sub CheckBox4_AfterUpdate() CheckBox_Check CheckBox4 End Sub Private Sub CheckBox5_AfterUpdate() CheckBox_Check CheckBox5 End Sub Private Sub CheckBox6_AfterUpdate() CheckBox_Check CheckBox6 End Sub
お礼
ありがとうございました。試した結果上手くいきました。やはり余分な記述が多いですね。本当困ったもんです。でも参考にして作り上げていきます。
補足
ループ数を6から3に変化しただけで上手く機動しました。自分は読み取る基礎がないです。すいませんでした。上記の記述早速試してみます。必ず報告します。それとオプションボタンの方が良いと皆さんが言われていた意味が良く理解出来ました。実は今、フォームの中に簡単に誰でも記入出来るように、作成しております。その項目は、いっぱいあって頭の中でも整理出来ていません。papayukaさんにはいつも感謝しております。出来れば、今後もアドバイスお願いします。
- takachan7272
- ベストアンサー率29% (179/616)
takachan7272です。 自宅のOffice環境が2003の為、2000で動作するかは未確認です。 申し訳ありませんが、明日、会社のPCで試してみます。 実行時にエラーでしょうか? それとも、コードを書いている時にエラーでしょうか? 書いている時なら、スペースやピリオド〔.〕は大丈夫でしょうか。 s1 = Me.Controls("OptionButton" & i).Caption 見辛いですが、Captionの前にピリオドがあります。 明日の夜に検証結果を書き込みますね。
お礼
ありがとうございます。ピリオドも記入しています。そのままコピーしただけです。実行時エラー -2147024809(80070057) 指定されたオブジェクトはは見つかりませんと書かれていました。出来ればチェック式の記述も教えていただきたいです。お待ちしています。
- takachan7272
- ベストアンサー率29% (179/616)
補足を待っている間に回答が付きましたね。 私も同感で、オプションボタン(ラジオボタンと一緒)とループの使用を考えました。 私も転記するタイミングに悩みまして、勝手にフォーム2にもコマンドボタンを設置してみました。 それらしいものを作ってみましたので、ご自分で試してみて下さい。 --------------------------------- UserForm1 --------------------------------- Private Sub CommandButton1_Click() TextBox1.Value = "" TextBox2.Value = "" UserForm2.Show End Sub --------------------------------- UserForm2 --------------------------------- Private Sub UserForm_Initialize() With ComboBox1 .AddItem "ぶどう" .AddItem "桃" .AddItem "バナナ" End With With ComboBox2 .AddItem "きゅうり" .AddItem "キャベツ" .AddItem "にんじん" End With With ComboBox3 .AddItem "ビール" .AddItem "サワー" .AddItem "日本酒" End With End Sub Private Sub CommandButton1_Click() Dim i As Integer Dim s1, s2 As String For i = 1 To 6 Step 1 s1 = Me.Controls("OptionButton" & i).Caption s2 = Me.Controls("combobox" & i).Value If Me.Controls("optionbutton" & i) = True Then With UserForm1 .TextBox1.Value = s1 .TextBox2.Value = s2 End With End If Next i Unload UserForm2 End Sub --------------------------------- ・フォーム1のボタンを押したらフォーム2を表示して2つのTextBoxを空白にする。 ・フォーム2のボタンを押したら、チェックされているOptionBox#の Captionをフォーム1のTextbox1に書込み。 同時にOptionBoxの#と同じ番号のComboBoxの値をTextbox2に書き込みます。 選択されていなければ空白が入ります。 ・最後にフォーム2を閉じてフォーム1の表示を残します。 ★フォームの閉じる〔X〕でも終われますが、終了ボタンを作っておくと良いでしょう。 1つ意見ですが、フォーム1のボタンを押してと言うのは必要無いのでは? フォーム2で選択してボタンを押したらフォーム1を表示するとか。
お礼
s1 = Me.Controls("OptionButton" & i).Caption←黄色表示 指定されたオブジェクト名がないとエラー表示されます。 コンボボックスの前にはオプションボタンで良いですよね? どうしてですか?教えてください。自分は2000のエクセルです。
補足
フォーム1は全体の項目を把握するもので、フォーム1には他に入力ボタンがいくつもあります。やはりオプションボタンの方が操作しやすいでしょうか?自分はチェックボタンを作ってしまいました。やってみてまた、報告させてください。
- papayuka
- ベストアンサー率45% (1388/3066)
チェックボックスは複数選択出来るものなので、仕様としてどうかと思います。 また「チェックボックスにチェックしたら」のタイミングで「コンボボックス」が既に選択されているとは限らず、転記に行くタイミングとしては適切で無いようにも思います。 どちらを先に操作するかはユーザーによって異なるのでは無いでしょうか? コマンドボタンのクリックで転記を行うにしても、チェックボックスもコンボボックスも複数選択した状態で行う事が可能なわけで、その場合はどれを転記したら良いのかって話になります。 強引にやるなら、ループで最初に見つけた物もしくは最後に残った物って事かな? ループでチェックボックスの Value を判断して、Caption を代入 ループでコンボボックスの Value を判断して代入 ってところでしょうか、、、 ちなみに用途的にはラジオボタンを使う方が排他制御は楽だと感じます。
補足
ありがとうございました。選択制で、1個だけ選択させたいです。それらの項目と内容だけをフォーム1に記録させたいです。それは可能でしょうか?
- takachan7272
- ベストアンサー率29% (179/616)
チェックボックスにチェック(1個のみ)と言うことは 2個以上のチェックは無いと言うことですか?
補足
ありがとうございます。その中で1個のみチェックされた項目と内容だけをフォーム1のテキストボックスに転記させたいです。2個チェック字はエラー表示させたいです。
お礼
忙しいところありがとうございました。ループ数を変えるだけで、上手く作動出来ました。自分は読み取る基礎がないのですいませんでした。確かに、オプションボタンの方が記述は楽だとかんじました。しかし、自分が既に作成しているのは、チェックボックスなのでこれからやってみようと思います。本当にありがとうございます。