エクセルVBAでシート上の結合セルに一つだけチェックボックスを作成する方法

このQ&Aのポイント
  • 結合セル内に複数のチェックボックスが出来てしまう問題を解決するためのエクセルVBAプログラムを紹介します。
  • チェックボックスを作成する際、結合セル内に一つだけチェックボックスを作成するための方法を説明します。
  • 上記の問題を解決するために、チェックボックスの作成時に結合セルの左上のセルにリンクさせる方法を使用します。
回答を見る
  • ベストアンサー

エクセルVBAで、シート上で結合されたセルに一つだけチェックボックスを

エクセルVBAで、シート上で結合されたセルに一つだけチェックボックスを作成したいです。 以前こちらの別の方の質問で、選択されているセルにチェックボックスを作成するプログラムが紹介されており、同じようにやってみたところ、セルが結合されていない場合は問題ないのですが、 セルが複数結合されている場合、結合されているセル分チェックボックスが出来てしまいます。 (例えば、エクセルのシート上で、A3セルからA6セルまでが結合されていた場合、合計4つチェックボックスが結合セル内に出来てしまいます) 結合セル内には一つしかチェックボックスを作りたくありません。 どうしたらよいでのしょうか? 以前紹介されていた、チェックボックスを作るプログラムは下記のようなものでした。 よろしくお願いいたします。 Sub sample() Dim cb As CheckBox For Each cb In ActiveSheet.CheckBoxes cb.LinkedCell = cb.TopLeftCell.Address Next cb End Sub

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

結合セルだった場合、左上のセルにだけチェックボックスを作成する……で良いのかな? For Each ss In Selection の下に If (ss.MergeArea.Column = ss.Column) * (ss.MergeArea.Row = ss.Row) Then Next の上に End If を入れて見てください。 .MergeArea.Column、.MergeArea.row は各セルが属する結合セルの基準となる列と行(左上)を返します。 IF文でそのセルの列・行が結合セルの左上と一致した場合に処理を先に進めます。 また、そのセルが結合セルで無い場合は、左上セルの位置は列・行と同じ値になりますので、その場合も処理を先に進めます。

greyseal
質問者

お礼

ありがとうございました。 無事結合セルの一番左上に1つだけチェックボックスを作成する事が出来ました。 本当に助かりました。 又何かわからない事があったらお世話になると思いますが宜しくお願い致します。

その他の回答 (1)

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.1

以前紹介されていたプログラムではなく、あなたが作った「セルが複数結合されている場合、結合されているセル分チェックボックスが出来てしま」うプログラムを提示しましょう。

greyseal
質問者

補足

上記の書き込みは業務で使う為のものなので、会社から昼間に投稿しました。今帰宅しまして、手元にそのエクセルファイルがなく、尚且つ素人なので正確にはわかりかねるのですが、 Dim ss As Excel.Range, cbx As CheckBox With Selection.Parent For Each ss In Selection Set cbx = .CheckBoxes.Add(Left:=ss.Left, Top:=ss.Top, _ Height:= 0,58, Width:= 0.82) cbx.Text = "" RowCnt = Selection.Row        '選択されているセルの行をRowCnt変数で表現 cbx.LinkedCell = "A" & RowCnt    '選択されているセルのA列にチェックボックスを作成 cbx.Display3DShading = False     '3D表示なし With cbx.ShapeRange .Fill.Solid .Fill.Visible = msoFalse       '塗りつぶしなし .Line.Visible = False         '線on,off(Trueにしたかも・・・) .Line.Weight = 0.25          '線幅 .Line.ForeColor.RGB = RGB(0, 0, 0)  '線色 End With Next End With 再度昼間私が会社で調べたサイトを調べ直し、こんな感じで会社のエクセルファイルのVBAに記載したであろうという内容を記載しました。 よって、多少違うところ(間違ってるところ)もあるかと思いますが、上記の感じです。 宜しくお願いします。

関連するQ&A

  • VBA シート上のチェックボックスの値の取得

    (作業環境 windowsXP Excel2007 作業対象のブックは.xls) シート上に1ブックにつき3000個ほどのチェックボックスがあります。 このブックが現在約1000個、すでに配布・回収されております。 これからチェックボックスの選択状況やセルに入力された値をマクロで収集するのです。 大半のチェックボックスにはすでに「リンクするセル」の設定がされており、そのセルの値を参照すればチェック状態の取得は容易なのですが、 最初にこのブックを作った方が一部のチェックボックス群(3000個中500個程度)にリンクの設定をするのを忘れていたのです。 このリンク設定のされていないチェックボックスの値の取得についてご質問です リンクセルの設定をするのであれば sub a() ActiveSheet.Shapes("Check Box 1").Select Selection.LinkedCell = "$A$1" ・ end sub でいいのでしょうが、これだとselectのはずみで チェックボックスがTrueになってしまします。 リンクせずに直接チェックボックスの値をブール型で取得しようと思い dim a as boolern a = Activesheet.checkboxes(1).value としましたが、ためしに別ブックのシート上に1つだけチェックボックスを作って実行すると、チェック状態にかかわらずTrueが返ります。 checkboxesの使い方がダメなんでしょうか? 求める回答としては (1)上記のやり方でもできるが、間違っている部分がある (2)上記以外のやり方でもっと簡単な(早い)やりかたがある のどちらかのようなアドバイスをいただけると幸甚です。 よろしくおねがいします

  • エクセルVBAで結合セルの真ん中にチェックボックスを作成する方法を教え

    エクセルVBAで結合セルの真ん中にチェックボックスを作成する方法を教えて下さい。 数個下の質問で結合されたセルに一つだけチェックボックスを作る方法を質問した者です。 度々すみません。 今度の質問ですが、結合したセルの上下左右の真ん中にチェックボックスを作る方法を教えていただけないでしょうか? 現在のプログラムは下記のようになっております。 宜しくお願い致します。 Dim ss As Excel.Range, cbx As CheckBox With Selection.Parent For Each ss In Selection If (ss.MergeArea.Column = ss.Column) * (ss.MergeArea.Row = ss.Row) Then Set cbx = .CheckBoxes.Add(Left:=ss.Left, Top:=ss.Top, _ Height:=ss.Height, Width:=ss.Width) cbx.Text = "" RowCnt = Selection.Row        '選択されているセルの行をRowCnt変数で表現 cbx.LinkedCell = "A" & RowCnt    '選択されているセルのA列にチェックボックスを作成 cbx.Display3DShading = False     '3D表示なし With cbx.ShapeRange .Fill.Solid .Fill.Visible = msoFalse       '塗りつぶしなし .Line.Visible = False         '線on,off .Line.Weight = 0.25          '線幅 .Line.ForeColor.RGB = RGB(0, 0, 0)  '線色 End With End If Next End With

  • Excel チェックボックスの配置を換えた時

    ご質問させていただきます。 Excel2007を使用しています。 sheet2のA1セルからA190セルまでチェックボックスがあり、下記のmacro1が登録されていました。 そこで、チェックボックスの位置を以下のように変更しました。 sheet2のA1~A10セルまでチェックボックスが10個、その隣のB1~B10セルにsheet1のJ2~J11列への参照式、sheet2のC1~C10セルまでチェックボックスが10個、その隣のD1~D10セルにsheet1のJ12~J21列への参照式、・・・(省略)・・・、sheet2のAK1~AK10セルまでチェックボックスが10個、その隣のAL1~AL10セルにsheet1のJ182~J191への参照式、というふうに変更しました。 変更に伴い、A1~A10セルのチェックボックスには下記のmacro1を登録し、C1~C10セルのチェックボックスには下記のmacro2を登録しました。 問題は次で起こりました。E1~E10セルのチェックボックスに下記macro3を登録したのですが、チェックボックスをONにすると「実行時エラー13 型が一致しません」と表示されてしまいます。デバックボタンを押すと、myCheck.TopLeftCell.Value = Not myCheck.TopLeftCell.Valueが黄色くなります。 そこで、myCheck.TopLeftCell.Value = Not myCheck.TopLeftCell.Valueを削除してE1セルのチェックボックスをONにしてみたところ、なぜかE1セルにSheet1のI22セルの値が表示され、チェックボックスをOFFにしてみたらE1セルに=Sheet1!I22と書かれていることがわかりました。 offsetの数値を色々と試してみたところ、macro3のoffset(0,1)の部分をoffset(0,2)にするとチェックボックスがOFFの時にちゃんとE1セルには=Sheet1!J22と記入されます。 しかし、offset(0,2)の状態でmyCheck.TopLeftCell.Value = Not myCheck.TopLeftCell.Valueを挿入して実行してみたところ、やはり「実行時エラー13 型が一致しません」と表示されてしまいます。 どこをどう直したら良いのか全くわかりません。 教えてください。 よろしくお願いいたします。 Sub macro1()  Dim myCheck As Shape  Set myCheck = ActiveSheet.Shapes(Application.Caller)  myCheck.TopLeftCell.Value = Not myCheck.TopLeftCell.Value  With myCheck.TopLeftCell.Offset(0, 1)   If myCheck.ControlFormat.Value = 1 Then    .Value = .Value   Else    .FormulaR1C1 = "=Sheet1!R[1]C[8]"   End If  End With End Sub Sub macro2() Dim myCheck As Shape Set myCheck = ActiveSheet.Shapes(Application.Caller) myCheck.TopLeftCell.Value = Not myCheck.TopLeftCell.Value With myCheck.TopLeftCell.Offset(0, 1) If myCheck.ControlFormat.Value = 1 Then .Value = .Value Else .FormulaR1C1 = "=Sheet1!R[11]C[6]" End If End With End Sub Sub macro3() Dim myCheck As Shape Set myCheck = ActiveSheet.Shapes(Application.Caller) myCheck.TopLeftCell.Value = Not myCheck.TopLeftCell.Value With myCheck.TopLeftCell.Offset(0, 1) If myCheck.ControlFormat.Value = 1 Then .Value = .Value Else .FormulaR1C1 = "=Sheet1!R[21]C[4]" End If End With End Sub

  • エクセル チェックボックスのチェックの判定の書き方

    エクセル内にチェックボックス(CheckBox1)を追加したのですが、セルの式にそのチェックが入っているかどうかをifを使って書きたいのですが、どのように書いたらよいのでしょうか。(コントロールツールボックスの書き方)ちなみに式を書くセルのシートとチェックボックスがあるシート(シート名:設定)は別になります。 現在チェックボックスのプログラムにセル内容を変えるように書いているのですが、保護するとだめなのでお願いします。

  • Excelチェックボックスのリンクするセル一括

    Excelでチェックボックスのリンクするセルを一括設定したいです。 sheet1に複数のチェックボックスを作成し、それぞれのリンクするセルをsheet2に入れたいのですが、チェックボックスが数10個あるので、1つづつやっていると手間がかかります。 例 sheet1のB2のリンクするセルをsheet2のB2 sheet1のB3のリンクするセルをsheet2のB3 sheet1のB4はsheet2のB4 … 一括でやる方法(多分VBA)はわかりますか。

  • エクセルのチェックボックスのことで

    初歩的なことですが教えてください。エクセル2003でチェックボックスを作成しました。 配置してあるセルの書式設定の保護からロックをはずしシート保護をかけるのですが、操作すると保護されています。のエラーとなってしまいます。  グループ化してオブジェクトにしてロックをはずしてもエラーとなってしまいます。 チェックボックスの場合、シート保護との関係で何かありますか? どなたかよろしくお願いいたします。 ちなみにチェックボックスの範囲が隣のセルにまたがっていることも想定しましたが違いました。  よろしくお願いいたします。

  • Excel VBA チェックボックスの判断

    下記のようなマクロでチェックボックスを作成したのですが、その作成したチェックボックスをクリックしたときに、ある処理を実行させるようにするにはどうすればいいのでしょうか? よろしくお願いします。 Dim Max as Long Dim Cell as Range Dim Check as CheckBox ・ ・ ・ For i = 0 To Max   With Cell.Offset(i)   Set Check = ActiveSheet.CheckBoxes.Add_     (Left:=.Left,Top:=.Top, Width:=.Width, Height:=.Height)   End With   With Check   .LinkedCell = Cell.Address   .Caption = ""   .Value = False   End With Next

  • フォームのCheck boxとOLEObjectのCheckboxのマクロの違い?

    エクセル2003です。 ワークシート上に複数個のチェックボックスを配置し、オンの場合、その左隣のセルの値を返すマクロを作成する場合についての質問です。 普段はフォームのCheck boxを使っています。 フォームのCheck boxなら Sub ChkBx() With ActiveSheet.CheckBoxes(Application.Caller) If .Value = xlOn Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub と、標準モジュールに一つだけプロシージャを書いて、複数個のCheck boxに同一のマクロを登録すれば簡単に出来ます。 ところがこれをOLEObjectのCheckboxでやってみようと思ったところ、フォームのように一つのプロシージャを使いまわすことができず、シートモジュールに以下のように各Checkboxごとのマクロを書かなくてはいけないようです。 Private Sub CheckBox1_Click() With OLEObjects("CheckBox1") If .Object.Value Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub Private Sub CheckBox2_Click() With OLEObjects("CheckBox2") If .Object.Value Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub Private Sub CheckBox3_Click() With OLEObjects("CheckBox3") If .Object.Value Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub 3つや4つくらいならどうってことはないのですが十数個もあるとかなり面倒です。 OLEObjectのCheckboxでももっと簡単にする方法はないのでしょうか? それともわたしが何かOLEObjectのCheckboxの使い方について思い違いをしているのでしょうか? ご教示をお願いいたします。

  • エクセルでマクロを使わずに複数のチェックボックスに一括チェックするコマンドボタンを作れますか?

    エクセルで商品管理のシートを作成しています。 10店舗ほど支店があるので、取扱店舗をチェックボックスで 選択できるようにしていますが、全店取扱の商品がかなり有るので 一括で10個のチェックボックスにチェック出来る様にしたいのです。 最初はコマンドボタンのLINKEDCELLにチェックボックスで参照している セルが連動するように数式を入れていたのですが、このやり方だと ボタンを使わずにチェックボックスを使うと参照セルの数式が 「TRUE/FALSE」に上書きされてしまい、以後ボタンと連動しなくなってしまいます。 出来ればコマンドボタンのLINKEDCELLプロパティを複数セルに指定したいのですが、可能でしょうか? ※「A1:G1」等と設定してみたのですが、連動するのは「A1」のみでした… VBAを使用すれば良いのでしょうが、まったく知識が無いので時間的に厳しい状況です。 どなたかお分かりの方がいらっしゃればご助言お願いいたします。

  • エクセル:チェックボックスで他シートの図形を操作。

    質問させていただきます。 現在、エクセルにて sheet1に帳簿内容入力画面 sheet2に入力画面の項目を反映した印刷用帳簿 というものを作成しています。 その中で、sheet1にチェックボックスを設置し、チェックONでsheet2任意の場所に オートシェイプの楕円を表示(チェックOFFで楕円は消える)させたいのですが、 うまくいきません。 試しにsheet1上にチェックボックス・楕円を設置し、 ------------------------------------------- Sub test01() With ActiveSheet If .CheckBoxes(Application.Caller).Value = xlOn Then .Shapes("楕円1").Visible = True Else .Shapes("楕円1").Visible = False End If End With End Sub ------------------------------------------- とイベント設定をしたところ、sheet1上ではチェックON/OFFで楕円の 表示/非表示ができました。 しかし、実際sheet1にチェックボックス、2に楕円と設置すると「オブジェクトが存在しません」と エラーになってしまいます。 IF関数のような(シート名!セル名)的に楕円の場所を指定しなければいけないのかな?と 思い、色々試してみたのですが実現できませんでした。 勉強不足で恐縮なのですが、詳しい方アドバイスをいただきたいです。

専門家に質問してみよう