[[20081128174400]] 『空白にのみ文字を表示』(みかん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『空白にのみ文字を表示』(みかん)

できるのかどうかわかりませんが、教えて下さい(マクロは初心者です)。
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


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.