• ベストアンサー

Excel VBA checkboxのリンク

Excel VBA内でcheckboxを作り、 checkboxからcheckbox2を表示させたいのですが 分かりません。 どのように、checkboxからcheckbox2を表示しますか? 分かる方いましたら、教えてください。 教えて頂けると助かります。 よろしくお願いします。 ちなみに、Excelの環境は2007です。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

#1です。骨組みとしてはこういうことでしょうか。ご参考まで。 ☆標準モジュール Sub test() UserForm1.Show vbModeless End Sub ☆UserForm1モジュール Private Sub CommandButton1_Click() UserForm2.Show vbModeless Me.Hide End Sub ☆UserForm2モジュール Dim checkBoxCount As Long Private Sub UserForm_Initialize() Dim myControl As MSForms.Control For Each myControl In Me.Controls If myControl.Name Like "CheckBox*" Then checkBoxCount = checkBoxCount + 1 Next myControl If UserForm1.CheckBox1 = True Then Me.CheckBox1.Visible = True Me.CheckBox2.Visible = True Else Me.CheckBox1.Visible = False Me.CheckBox2.Visible = False End If If UserForm1.CheckBox2 = True Then Me.CheckBox3.Visible = True Me.CheckBox4.Visible = True Else Me.CheckBox3.Visible = False Me.CheckBox4.Visible = False End If End Sub Private Sub CommandButton1_Click() Dim i As Long For i = 1 To checkBoxCount Sheets(1).Cells(i, 1).Value = Me.Controls("CheckBox" & i).Value Next i End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) Unload UserForm1 End Sub

mai5891
質問者

お礼

回答ありがとうございます。 確認ですが、Falseが表示。Trueが非表示ですか? Ifで18個の処理を一つづつ書くと長くなってしまうので、switchとかで書けないですか? よろしくお願いします。

その他の回答 (6)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.7

#1&4です。 1.Visible(見える)=true なら見えるです。手を動かしてみる事をお勧めします。 2.当方の提示させていただいたのは骨組みであり、肉付けするのは質問者様にお任せします。 当方にはどのチェックボックスが、どれに対応しているのか分かりませんので。 コード短縮の一例を回答させていただきます。#4のUserForm2モジュールのInitializeと同等の事を行っています。 以上、ご参考まで。 Private Sub UserForm_Initialize() Dim myControl As MSForms.Control Dim array1 As Variant Dim array2 As Variant Dim i As Long array1 = Array(1, 2) 'UserForm1のCheckBox1に対応して表示する、Form2のCheckBoxのNoを列挙 array2 = Array(3, 4) 'UserForm1のCheckBox2に対応、以下同様。Array(3,4,5,6,8,9,10,11,18)てな感じで指定可 For Each myControl In Me.Controls If myControl.Name Like "CheckBox*" Then checkBoxCount = checkBoxCount + 1 myControl.Visible = False End If Next myControl If UserForm1.CheckBox1 = True Then For i = LBound(array1) To UBound(array1) Me.Controls("CheckBox" & array1(i)).Visible = True Next i End If If UserForm1.CheckBox2 = True Then For i = LBound(array2) To UBound(array2) Me.Controls("CheckBox" & array2(i)).Visible = True Next i End If End Sub

mai5891
質問者

お礼

回答ありがとうございました。 ・・・中学3年というワークシートへジャンプし、 Foam1・2のチェックしたのを中学3年という 文字をワークシートのA1へ出すという 処理できました。 本当にありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.6

教えろ、教えろといっているが、質問の内容の説明がまずくて、伝えるべきことが読者に判らないのだと思う。 プログラム云々の前に仕様を明確に出来ることが必要な能力だ。 ーー フォームは2つ(質問者のFoamは間違い。Formが正しい。基礎的なことですよ)考えるようだ。 ーー 各フォームにはChekBoxが複数個貼り付けられているようだ。 Form1のチェックボックスの個数と持たせた意味は固定しているようだ。しかし、そのキャプションで現す事項(働きとか意味)を全く質問に書かず、抽象的に質問するから判りにくい。仕事内容を少し出すことになるが、質問する以上やむをえないだろう。イヤなら、別のタイプの例で置き換えるとか。 ーーー Form2はForm1のチェックボックスのチェック情況によって、Form2のチェックボックスの出現を左右するのでは無いのか? そこがはっきりしない。 ーー たとえで言うと Form1に首都圏の都県のチェックボックスがある ○東京都 ○神奈川県 ○千葉県 ○埼玉県 ーー ここで神奈川県をチェックすると、Form2には ○横浜市 ○川崎市 ○相模原市 ○藤沢市 ・・・ というチェックボックスを出したいのではないか。Form1は非表示にするとしても。 こういうイメージなのか? こういう風に説明すればわかりやすいのではないか。県と市などの有様(包含関係など)が類推を助けるのだ。 ただ上記の場合だと県と所属の市名の対応データが必要で、その扱いのほうがプログラム的に扱いが難しいと思うが。 (フォームを表示したり、連動して消したりすることよりも) 上記が見当ハズレなら無視してください。当たっている面があれば補足しては。

mai5891
質問者

お礼

回答ありがとうございます。 的確に私のやりたいことが当たっていて、少し怖くなってしまいました・・・。 フォームを表示したり、連動して消したりする事は出来ました。 質問ばっかりで申し訳ありませんが、 Form1のcheckboxを選択すると、 例えば ○社会人 ○大学生 ○高校生 ○中学生 ○小学生 とあり 中学生を選択すると ○1年 ○2年 ○3年 とあり、 3年を選ぶ  (ここまでは、完了。)と、 ここから、どのように行いますか? 分かる方いましたら、ご指導よろしくお願いします。 中学3年というワークシートへジャンプし、 Foam1・2のチェックしたのを中学3年という 文字をワークシートのA1へ出すという いわゆるデータベースを作りたいのです。

mai5891
質問者

補足

下記でデータベースを作りたいと書いてしまいましたが、 データベースを教えてほしいのではなく、 ・・・ 例えば中学3年というワークシートへジャンプし、 Foam1・2のチェックしたのを中学3年という 文字をワークシートのA1へ出すという 処理が分かりません。 ずうずうしいと思いますが、分かる方いましたら、 ヒントでも構いません。 よろしくお願いします。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.5

#3です。 なんか、まだやりたいことがはっきりしませんねえ。 Myform2のチェックボックスの状態をMyform1と同じにさせたいなら、 Myform1のPrivate Sub CommandButton1_Click()の中で、 For i = 1 To 11   Myform2.Controls("CheckBox" & i).Value = Me.Controls("CheckBox" & i).Value Next i を実行します。 ただし、"チェックが入っています"のメッセージを表示した直後にチェックボックスの値をFalseにクリアしているので、その前に上記の命令を実行する必要があります。 どれかのチェックボックスがチェックされているときに、 ボタンのクリックでMyform1を非表示にしてMyform2を表示したいなら、 前半で作成したMyFlgを利用して、 If myFlg = True Then   Me.Hide   Myform2.Show End If を実行すればOKです。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.3

>具体的には、ユーザーフォーム(myfoam1)にcheckを入れ、ボタンを押すと、 >別のユーザーフォーム(myfoam2)に移り、checkboxの一覧が現れる。 ユーザーフォームにcheckを入れるとはどういう意味でしょうか? フォームの中のチェックボックスではなくて? フォームを指定する場合は、Meは不要です。 フォームの表示はShow、非表示はHideメソッドを使ってください。 あと、フォームの表示は通常はモーダル表示(別のフォームは操作できない)なので、フォームをどういう状態しておくかによって、LoadやUnload手続きも使用する必要があります。 checkがない場合は、Myform2を非表示にしたいようですが、非表示にするためには表示されていなければなりません。 Myform1とMyform2の表示状況(遷移状況)を明確にしておかないとプログラムは組めませんよ。

mai5891
質問者

お礼

回答ありがとうございます。 フォームの中のcheckboxのことでした。 フォームの表示状態は、 フォームの中のチェックボックスでは (1)ユーザーフォーム(myfoam1)フォームの中のチェックボックス(この時、myfoam2は非表示)、ボタンを押すと、 別のユーザーフォーム(myfoam2)に移り、フォームの中のチェックボックスの一覧が現れる。(この時、myfoam1は非表示に) (2)myfoam1のcheckboxを押すと、myfoam2のcheckboxがチェックした項目を関連付けて、表示させたり、非表示にさせたいんです。 (3)myfoam2のcheckboxの値を最終的には、ワークシートへ値を表示させたいと思っています。 この3つを表示させるには、どのように行いますか? その前に、やりたいことは分かりましたか? 教えて頂けると、助かります。 よろしくお願いします。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

ソースを見ましたがやりたいことが分かりません。 myfoamとはMyformのことでしょうか。 で、Myformとは何なんでしょう? 「myfoam1のソースです」とあるし、myformという名前からユーザーフォームのようですが、 Me.Myform1とあるので、フォーム上のコントロールのような感じもしますし。 「checkを入れるとmyfoamへリンクする」という意味も分かりません。 具体的に何をしたいんでしょうか?

mai5891
質問者

お礼

回答ありがとうございました。 myfoamとは、ユーザーフォームの事です。 具体的には、ユーザーフォーム(myfoam1)にcheckを入れ、ボタンを押すと、 別のユーザーフォーム(myfoam2)に移り、checkboxの一覧が現れる。 という処理をさせたいと考えています。 至らないところがあり、申し訳ありません。 上記の処理をするには、どのようにしますか? よろしくお願いします。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

どの様な事をなさりたいかが読み取れないので、回答がつかないのだと存じます。 ワークシート上のコントロールの操作については、下記をご覧ください。 コードからのコントロールの設置法も載っています。 http://www.happy2-island.com/excelsmile/smile03/capter00716.shtml 下記#3で回答しておりますが、数を減らせばxl2010でも動作しました。 http://okwave.jp/qa/q5146795.html 実用上は、あらかじめ設置しておいて、Visibleを操作する方が良いと思います。 配置等で頭を悩ませないですみますので。 Meを付けているのは、インテリセンスが効いて入力が楽だからです。 Private Sub CheckBox1_Change() If Me.CheckBox1.Value = True Then Me.CheckBox2.Visible = True Else Me.CheckBox2.Visible = False End If End Sub

mai5891
質問者

お礼

回答ありがとうございます。 mitarashiさんような事がしたいのでありません、、、 やりたいことは、 checkbox1のmyfoam1からmyfoam2へ checkを入れるとmyfoamへリンクするという 処理がさせたいのです。 漠然としていて分かりにくいと思うので、 以下、プログラムソースを載せます。 分かる方いましたら、教えてください。 教えて頂けると、助かります。 よろしくお願いします。 ___ここから____myfoam1のソースです。 Private Sub CommandButton1_Click() Dim myMSG As String Dim myFlg As Boolean, i As Integer myFlg = False For i = 1 To 11 If Me.Controls("CheckBox" & i).Value = True Then myMSG = myMSG & Me.Controls("CheckBox" & i).Caption & vbCrLf myFlg = True End If Next i If myFlg = True Then myMSG = myMSG & "にチェックが入っています" Else myMSG = "いずれにもチェックが入っていません" End If MsgBox myMSG For i = 1 To 11 Me.Controls("CheckBox" & i).Value = False Next i For i = 1 To 11 'オプションボタンの左にキャプションが配置 Me.Controls("CheckBox" & i).Alignment = fmAlignmentLeft Next i For i = 1 To 11 'サイズがキャプションの幅に自動調整 Me.Controls("CheckBox" & i).Alignment = fmAlignmentLeft Me.Controls("CheckBox" & i).AutoSize = True Next i For i = 1 To 11 '色を指定 Me.Controls("CheckBox" & i).BackColor = RGB(153, 255, 153) Next i If Me.myForm1.Value = True Then Me.myForm2.Visible = True Else Me.myForm2.Visible = False End If End Sub ___ここまで___ コンパイルエラー: myfoam1 メゾッドまたは、データメンバが見つかりません。 と表示されます。

関連するQ&A