[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『空白にのみ文字を表示』(みかん)
できるのかどうかわかりませんが、教えて下さい(マクロは初心者です)。
WindowsXP,Excel2003を利用しています。
A B C D
1 □有 □無 X−X
2 □有 □無
3 □有 □無
□はチェックボックスです。
有のチェックボックスにチェックをつけるとD1、D2に文字が表示されるようにマクロで設定しています。
A1がチェックされたらX−X、B1だとY−Y、C1だとZ−Zが表示されるように設定してます。
3つすべてチェックが入ることはありませんが、2つ以下でチェックが入ることはあります(組み合わせ自由)。
どれか1つだけチェックしたのであればD1だけに、2つチェックをしたのであればD1、D2にそれぞれその文字を表示させたいです。
(例)A1、C1にチェックつけたらD1にX−X、D2にZ−Zと表示したい。)
上記のような設定は可能なのでしょうか?
宜しくお願い致します。
例には、A,B列にあるチェックボックスがC列にもあるということですか?
それから、このチェックボックスは、コマンドバー「フォーム」のそれですか? それともコマンドバー「コントロールツールボックス」のそれですか?
>有のチェックボックスにチェックをつけるとD1、D2に文字が表示されるようにマクロで設定しています。 >A1がチェックされたらX−X、B1だとY−Y、C1だとZ−Zが表示されるように設定してます。
でしたら、そのコードを提示してください。
と、記述の足りない点がいくつかあります。
ひとつのコード例です。新規ブックにて、試してみてください
標準モジュールに
'================================================================================ Sub mk_chkbox() Dim g0 As Long Dim r As Range With ActiveSheet For g0 = 0 To 2 Set r = Cells(1, g0 + 1) With .CheckBoxes.Add(r.Left, r.Top, r.Width, r.Height) .Name = "Checkbox" & g0 .Caption = "Checkbox" & g0 .OnAction = "checkbox_chk" End With Next End With End Sub '================================================================================ Sub checkbox_chk() Dim g0 As Long, g1 As Long Dim chknum As Long Dim chkbx As CheckBox If TypeName(Application.Caller) = "String" Then With ActiveSheet Set chkbx = .CheckBoxes(Application.Caller) g0 = Replace(chkbx.Name, "Checkbox", "") g0 = g0 \ 3 chknum = 0 If chkbx.Value = xlOn Then
For g1 = g0 * 3 To g0 * 3 + 2 If .CheckBoxes("Checkbox" & g1).Value = xlOn Then chknum = chknum + 1 End If Next If chknum >= 3 Then chkbx.Value = xlOff End If End If If chknum < 3 Then Range("d" & g0 + 1 & ":d" & g0 + 2).Value = "" ReDim setstr(g0 * 3 To g0 * 3 + 2) setstr(g0 * 3) = "x−x" setstr(g0 * 3 + 1) = "Y−Y" setstr(g0 * 3 + 2) = "Z−Z" chknum = 0 For g1 = g0 * 3 To g0 * 3 + 2 If .CheckBoxes("Checkbox" & g1).Value = xlOn Then Range("d" & chknum + 1).Value = setstr(g1) chknum = chknum + 1 End If Next End If End With End If End Sub
これで、mk_chkboxを実行してみてください。
アクティブなシートのセルA1、B1、C1にチェックボックスが作成されます。
このチェックボックスにチェックを入れて動作を確認してみてください。
尚、コードは、コマンドバー「フォーム」のチェックボックスを採用しました。
ichinose
回答ありがとうございます。
チェックボックスはコントロールチェックボックスを使っています。
>有のチェックボックスにチェックをつけるとD1、D2に文字が表示されるように
マクロで設定しています。
といいましたが、すみません、D1しか表示できるようにしか
設定していなかったです。
↓今組んでいる設定です↓
''-------------------------------------------
Private Sub CheckBox1_Click()
Application.EnableEvents = False If CheckBox1.Value = True Then Range("D1") = "x-x" Else Range("D1") = "" End If Application.EnableEvents = True End Sub ''-------------------------------------------- Private Sub CheckBox2_Click() Application.EnableEvents = False If CheckBox2.Value = True Then Range("D1") = "y-y" Else Range("D1") = "" End If Application.EnableEvents = True End Sub ''------------------------------------------- Private Sub CheckBox3_Click() Application.EnableEvents = False If CheckBox3.Value = True Then Range("D1") = "z-z" Else Range("D1") = "" End If Application.EnableEvents = True End Sub
このコードでD2を設定するとD1、D2両方とも入力されて
しまいますので使えないのかなとは思っています。
大変申し訳ございませんが、宜しくお願い致します。
(みかん)
3個のチェックボックスのオブジェクト名を名前を CheckBox1、CheckBox2、CheckBox3 と命名されているとします。
当該シートモジュールに
'============================================================ Private Sub CheckBox1_Click() Application.EnableEvents = False Call checkbox_chk(OLEObjects("CheckBox1"), "CheckBox") Application.EnableEvents = True End Sub ''-------------------------------------------- Private Sub CheckBox2_Click() Application.EnableEvents = False Call checkbox_chk(OLEObjects("CheckBox2"), "CheckBox") Application.EnableEvents = True End Sub ''------------------------------------------- Private Sub CheckBox3_Click() Application.EnableEvents = False Call checkbox_chk(OLEObjects("CheckBox3"), "CheckBox") Application.EnableEvents = True End Sub ''------------------------------------------------------------ Sub checkbox_chk(chkbx As OLEObject, prefixstr As Variant) Dim g0 As Long, g1 As Long Dim chknum As Long With ActiveSheet g0 = Replace(chkbx.Name, prefixstr, "") - 1 g0 = g0 \ 3 chknum = 0 If chkbx.Object.Value Then For g1 = g0 * 3 + 1 To g0 * 3 + 3 If .OLEObjects(prefixstr & g1).Object.Value Then chknum = chknum + 1 End If Next If chknum >= 3 Then chkbx.Object.Value = False End If End If If chknum < 3 Then Range("d" & g0 + 1 & ":d" & g0 + 2).Value = "" ReDim setstr(g0 * 3 + 1 To g0 * 3 + 3) setstr(g0 * 3 + 1) = "x−x" setstr(g0 * 3 + 2) = "Y−Y" setstr(g0 * 3 + 3) = "Z−Z" chknum = 0 For g1 = g0 * 3 + 1 To g0 * 3 + 3 If .OLEObjects(prefixstr & g1).Object.Value Then Range("d" & chknum + 1).Value = setstr(g1) chknum = chknum + 1 End If Next End If End With End Sub
一長一短は、ありますが、シート上に同一コントロールが多数あるときは、 コントロールツールボックスのコントロールより、フォームにあるExcelコントロールの方が 扱いが楽ですよ!! 安定性という面からもフォームにあるExcelコントロールのほうが安定していると 思います。
ichinose
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.