[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『空白にのみ文字を表示』(みかん)
できるのかどうかわかりませんが、教えて下さい(マクロは初心者です)。
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.