電子書籍の厳選無料作品が豊富!

エクセルの複数シートに同じ内容のチェックボックスが配置(仮に縦に3つ)されています。

 シート1のチェックボックス(仮に上から2番目)を選択したら、すべてのシートの同じ配置(上から2番目)のチェックボックスにチェックが入るようにしたいです。

 タイトルはマクロとしましたが、マクロでなくても可能であれば、その方法を教えてください。

A 回答 (2件)

少しお邪魔します。


ワークシートのチェックボックスがどういうスタイルになっているかにもよるかと思います。たぶん、#1さんの方法のほうが管理は楽だと思います。多少のセルが必要なのと、アンタッチャブルな領域が出てくるということだけだと思います。

ただ、私はマクロで少しシュミレートしてみました。ActiveXコントロールの場合は、たぶん、インスタンスが必要かなと思っているのですが、まだ手をつけていません。というか面倒なのです。結局、取り付け方から教えるということも、また面倒です。

フォームコントロールは、クリックした時にオブジェクトの固有の名前を保持しているのですが、ActiveXコントロールは、固有の名前を保持していないので、名前を付けてあげなくてはならない、というやや面倒な手間が必要なのです。

これらのマクロの利点はアンタッチャブルな領域が、ワークシート上では存在しない、設定は一瞬で済むということです。ただ、既存のものにつける以上、多少複雑なものなります。

一度、シュミレートしてみることをお薦めします。
理屈は、既存でついている名前を、シートごとに1から順に同じ名前に統一していくというものです。

'既存のチェックのボックス向けです。
Sub ChangeCheckBoxesName()
  Dim sh As Worksheet
  Dim i As Long, j As Long, t As Long, k As Long
  Dim Chk As CheckBox
  For Each sh In Worksheets  'ブック全体で探す
    t = sh.Shapes.Count
    If t > 0 Then
      j = 1
      For i = 1 To t
        If TypeName(sh.Shapes(i).DrawingObject) = "CheckBox" Then
          Set Chk = sh.Shapes(i).DrawingObject
          Chk.Caption = "" 'キャプションの非表示
          On Error Resume Next
          Chk.Name = "chk_" & j
          If Err.Number > 0 Then
            Do
              Chk.Name = CStr(k) '臨時の名前付け
              DoEvents
              k = k + 1
            Loop Until Err.Number = 0
            Chk.Name = "chk_" & j
          End If
          On Error GoTo 0
          Chk.OnAction = "OnOff_ChkBox" 'マクロをつける
         '' Chk.TopLeftCell.Offset(, 2).Value = Chk.Name '名前の確認
          Set Chk = Nothing
          j = j + 1
        End If
      Next
    Else
      MsgBox "このシートにはオブジェクトが見当たりません。", vbExclamation
    End If
    j = 0
    k = 0
    Application.ScreenUpdating = True 'シートを活性化する
  Next sh
End Sub
'------------------------
'これが、実際のチェックボックスに使われるマクロ
Sub OnOff_ChkBox()
Dim n As String
Dim obj As Object
Dim indx As String
Dim bln As Long
Dim sh As Worksheet
n = Application.Caller
indx = ActiveSheet.Shapes(n).Name '名前取り
bln = ActiveSheet.Shapes(n).DrawingObject.Value  '値取り
Call allCheckes(indx, bln)  'シート全体で同じものを探す
End Sub

Sub allCheckes(ByVal indx As String, bln As Long)
Dim sh As Worksheet
  For Each sh In Worksheets
   If ActiveSheet.Name <> sh.Name Then
    On Error Resume Next
    sh.Shapes(indx).DrawingObject = bln
    On Error GoTo 0
   End If
  Next sh
End Sub
'========================
オマケの実験用マクロです。

'シュミレート用のサンプルチェッボックス 1行ずつ入ります。
Sub AddChkBoxes()
'テスト用のチェックボックス設置
Dim sh As Worksheet
Dim Chk As CheckBox
Dim i As Long

For Each sh In Worksheets
 For i = 1 To 10
   With sh.Cells(i, 2)
    Set Chk = sh.CheckBoxes.Add(.Left + 3, .Top, .Width, .Height)
    Chk.Caption = ""
    Chk.Name = "chk_" & i  'チェックボックスの名前の偏向
    Chk.OnAction = "OnOff_ChkBox" 'マクロを取り付ける
    'Chk.LinkedCell = .Offset(, 2).Address 'リンクするセル
    '.Offset(, 3).Value = Chk.Name '名前をセルに出す
   End With
   Application.ScreenUpdating = True 'シートを活性化する
 Next i
Next sh
   MsgBox "シート" & Worksheets.Count & "枚にすべてのチェックボックスを付けました。", vbInformation
   On Error GoTo ErrHandler
   Call OnOff_ChkBox
   Exit Sub
ErrHandler:
   If Err.Number = 1004 Then
        MsgBox "OnOff_CheckBox のマクロが必要です。", vbExclamation
   Else
        MsgBox "設定は正常に終わっています。"
   End If
End Sub

Sub ObjectDelte()
'チェックボックスの削除用
  Dim sh As Worksheet
  Dim obj As Object
  For Each sh In Worksheets
    On Error Resume Next
    For Each obj In sh.Shapes
      If TypeName(obj.DrawingObject) = "CheckBox" Then
        ''obj.TopLeftCell.Offset(, 3).ClearContents  '名前を出している時
        obj.Delete
      End If
    Next obj
  Next sh
End Sub
    • good
    • 1
この回答へのお礼

記述していただいたマクロを実行したのですが、いまいち何をしているのか理解できませんでした。理解できるよう努力します。
さっそくの回答ありがとうございました。返事遅くなりすみません。

お礼日時:2016/04/23 05:48

使っているチェックボックスは、[フォームコントロール]のものですか?


それとも、[ ActiveX コントロール]のものですか?

[フォームコントロール]だったら[プロパティ](コントロールの書式設定)を
選択し、[コントロール]タブにある[リンクするセル]で特定のセルを指定
すれば、[TRUE]または[FALSE]でチェックの有無を指定できます。
[ Sheet1 ]のチェックボックスへとチェックすると、リンクするセルの値が
[TRUE]または[FALSE]になりますので、関連したチェックがすべて連動
します。
http://www4.synapse.ne.jp/yone/excel2010/faq/inp …

[ ActiveX コントロール]の場合は、[プロパティ]で[ LinkedCell ]の項目に
セル番号を指定すれば、同じように連動します。
http://www4.synapse.ne.jp/yone/excel2010/excel20 …

リンクするセルに[TRUE]または[FALSE]が表示されるのが嫌なら、その
[セルの書式設定]で[ユーザー定義]としてセミコロン3つ「;;;」を入力し、
[OK]すれば非表示になります。
http://www.relief.jp/itnote/archives/003300.php
http://www4.synapse.ne.jp/yone/excel2010/excel20 …

リンクしたセルの列幅を狭くするなどしてを見えないようにしておけば、
気にならなくなると思います。

マクロを使わなくても連動しますので、試してみてください。
    • good
    • 0
この回答へのお礼

さっそくの回答ありがとうございました。
無事やりたい作業ができるようになりました。
回答はすぐ確認させていただき、問題は解決したのですが、お礼が遅くなり申し訳ありませんでした。

お礼日時:2016/04/23 05:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!