• ベストアンサー

エクセルVBAで2種類のCheckboxについて

ワークシート上に配置したチェックボックスですが、 フォームから挿入したものなら Sub TEST01() ActiveSheet.CheckBoxes.Value = xlOn End Sub で、全てのチェックボックスがオンになります。 コントロールツールボックスから貼り付けたチェックボックスの場合はどのように記述するのでしょうか?

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

  • ベストアンサー
回答No.3

エキスパートさん、こんにちは。 KenKen_SPさんにお任せすれば解決でしょうが、横からちょこっとお節介。。 >Sheets("Sheet1").OLEObject(CheckBox & i).Value = x Sheets("Sheet1").OLEObjects("CheckBox" & i).Object.Value = x 一行のコードに3ヶ所のミス。 やりましたね、日本新記録!!。(^o^)/~~  

merlionXX
質問者

お礼

> やりましたね、日本新記録!!。(^o^)/~~ 阿茶! 前の2つはほんとお恥ずかしい・・・。 最後の1つは、Objectと入れなければいけないんですね。でもどうしてなんでしょう? Sheets("Sheet1").OLEObjects("CheckBox" & i)だけでオブジェクトなんじゃないんですか?

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんばんは。 >きっとシート上では、ActiveX コントロールではなく、フォームのチェックボックスなどを使ったほうがいいということなんでしょうね。 私のは役に立たない話かもしれませんが、 フォームのコントロールって、もともと、Ver.5 スタイルで、ダイアログシートで使うものですね。それは、それなりに便利ですし、MS-Wordのフィールドと良く似ていますし、表現力もあります。 そういうわけで、コントロールツール側とフォーム側とが、両方共存している形で、10年以上も続いているのですが、MS側は、どういう考えを持っているのか、はっきりは読めないですね。ただ、MSは、突然に換えるということを過去してきましたから、安心はできません。 確かに、いまひとつ、OLEObjectは、一般的には使いづらいような気がします。Shapes コレクションからも取れるからこそかもしれませんが。 私は、なるべくは、古い形式で書く方法は、避けようとは思っているのですが、フォームツールは、時に、便利だと思うことは多いですね。 ゆくゆくは、ダイアログシートと共に、フォーム側が、廃れていく運命にあるのではないか、と思っています。しかし、マクロにしても、古い形式のものが、Excel 2007 でも、残っているわけです。ある方が、ここのカテゴリで削除覚悟(結果は削除された)で質疑応答とは関係がなく書いていた、古い形式のコードや書き方は撤廃すべきだとは、本筋の論理としては正しいけれど、その実態を知っていればこそ、他人には、一方的に勧められません。少なくとも、現状で使えるものは、そのスタイルにこだわらず、すべて使うというのは、誰に遠慮することもなく、あたりまえのことですからね。

merlionXX
質問者

お礼

Wendy02さん、いつもありがとうございます。 やはり、OLEObjectを使いこなせないとまずいですね。 これから少しずつ勉強します。 先日エクセル2007に触る機会があったのでさっそく試したところ、ダイアログシートを使うと2007形式では保存が出来なくなっていました!(2003互換形式ではもちろん保存OKですが) いよいよ、苦手なユーザーフォームにも取り組まなくてはならないようです。ふぅ~。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

> Sheets("Sheet1").OLEObjects("CheckBox" & i)だけでオブジェクト > なんじゃないんですか? Sheets("Sheet1").OLEObjects("CheckBox" & i) で取得されるのは、 オブジェクトには違いありませんが、コントロールそのものではなく、 OLEObject です。  # ややこしいですね... 【参考】Excel VBA ヘルプ [シートで ActiveX コントロールを使用する] 難しい事が書いてありますが、要は CheckBox コントロールの Value や Caption といったコントロール特有のプロパティーを操作したい 場合はまず > Sheets("Sheet1").OLEObjects("CheckBox" & i) で取得した OLEObject に対して、さらに Object プロパティを使用し て実際の CheckBox コントロールオブジェクトを取得してから... といった2段階の手続きを取る必要があるということです。

merlionXX
質問者

お礼

有難うございます。 わかりました。きっとシート上では、ActiveX コントロールではなく、フォームのチェックボックスなどを使ったほうがいいということなんでしょうね。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 少し、ちゃんとした書き方をすれば、こうなりますね。 Sub TestSample() Dim o As Object  For Each o In ActiveSheet.OLEObjects  If TypeOf o.Object Is MSForms.CheckBox Then     o.Object.Value = True  End If  Next o End Sub

merlionXX
質問者

お礼

いつもありがとうございます。 TypeOf関数ですか、はじめて知りました。ありがとうございます。 勉強になります。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

CheckBox コントロールだけのコレクションを取得するプロパティーが ないみたいですね。For ~ Next で回すしかないと思います。

merlionXX
質問者

お礼

ありがとうございます。 For ~ Next で回そうと、 x = Sheets("Sheet1").CheckBox1.Value MsgBox x For i = 2 To 11 Sheets("Sheet1").OLEObject(CheckBox & i).Value = x Next としてもエラーです。

  • Nayuta_X
  • ベストアンサー率46% (240/511)
回答No.1

CheckBox1.Visible = True で、いいのかな?。

merlionXX
質問者

お礼

> CheckBox1.Visible = True 一個のときはそれでいいのですが、例えば11個あった場合はどうでしょうか? x = Sheets("Sheet1").CheckBox1.Value MsgBox x For i = 2 To 11 Sheets("Sheet1").CheckBox(i).Value = x Next では実行時エラーなんです。

関連するQ&A

  • エクセルVBAで xlOn xlOff の切替

    エクセル2000です。 ワークシート上に配置したオブジェクトのVisibleのTrue Falseについては、test01の方法で切り替えることが出来ます。 では、Test02でIfで判定している、xlOn xlOff の切替についても同様にNOTを使って簡単に記述することはできないでしょうか?xlOn xlOff はTrue False ではないから無理なのでしょうか? Sub test01() Dim o As Object For Each o In ActiveSheet.Buttons o.Visible = Not o.Visible Next o End Sub Sub test02() Dim o As Object For Each o In ActiveSheet.CheckBoxes If o.Value = xlOn Then o.Value = xlOff Else o.Value = xlOn End If Next o End Sub

  • エクセルVBAでOptionButtonのオンオフ取得

    ワークシート上に貼り付けてあるオプションボタンの状態の取得ですが、フォームのオプションボタンなら 例えば、 MsgBox ActiveSheet.OptionButtons("Option Button 44").Value で、オンなら1、オフなら-4146が返ります。 またActiveSheet.OptionButtons("Option Button 44").Value=xlOnで オンに出来ます。 ところがフォームじゃないコントロールツールボックスのオプションボタンは MsgBox ActiveSheet.Shapes("OptionButton30").Valueでも MsgBox ActiveSheet.Controls("OptionButton30").Valueでもエラーになります。 どうやって取得すればいいのでしょうか? どうやてOn Off を指示すればいいのでしょうか?

  • フォームの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の使い方について思い違いをしているのでしょうか? ご教示をお願いいたします。

  • エクセルVBAで For Each をまとめる方法

    ワークシート上にフォームで作成したチェックボックス、グループボックス、オプションボタンだけをまとめて削除するVBAです。 以下のように、種類ごとに分けて記述することは出来るのですが、3種類まとめて書く方法がわかりません。 CheckBoxes,GroupBoxes,OptionButtons と並べてもだめのようです。 ご教示ください。 Sub delete_test() With ActiveSheet For Each cb In .CheckBoxes cb.Delete Next For Each gb In .GroupBoxes gb.Delete Next For Each ob In .OptionButtons ob.Delete Next End With End Sub

  • VBAにてフォームコントロールの変更

    VBAでフォームコントロールのチェックボックスのON・OFFを変更することは可能でしょうか。 具体的にはA.xlsmのマクロを実行して、 A.xlsmのセルA1が0ならB.xlsの"チェック 1"がOFF状態に。1ならON状態になる。 以上のような仕組みを作りたいです。 (フォームコントロールなのは様式(B.xls)がフォームコントールで作成されており、変更不可のため) ですが、同じシート内でもチェックボックスのON・OFFができずに挫折しそうです。 まずは同一シート内で作ってみようと思い下記コードを作成したのですが、 ”SubまたはFunctionが定義されていません”となってしまいます。 Public Sub test() If Range("A1") = 0 Then CheckBoxes("チェック 1").Value = False ElseIf Range("A1") = 1 Then CheckBoxes("チェック 1").Value = True Else MsgBox "無効な値が設定されています" End If End Sub エラーは”CheckBoxes”のところで出てしまいます。 どなたかご教授ねがいます。

  • EXCELでチェックボックスの一括オンオフ

    EXCEL2000を使用してます。 アンケート作成をしており、設問毎にチェックボックスで複数選択できるようにしていますが、1つの設問にチェックボックスが8~10等多くあるため、設問毎にチェックボックスの一括オンオフができるようにしたいのです。 今は、次の記述で、ある設問のみ全てのチェックボックスにレが入りますが、はずす事ができません。 Sub チェック11_Click() ActiveSheet.CheckBoxes(Array(1, 2, 3)).Value = True End Sub どうすれば、チェック11のボックスで、オンオフができるのでしょうか? どうか教えて頂きますよう、よろしくお願い致します。

  • VBAで作ったCheckBoxesの名前を知りたい。

    VBAでCheckBoxeを3個作りsub checkをコールできる用にしました。 このsub checkのなかで今どのCheckBoxeがクリックされたか調べたいのですがどうすればいいでしょうか、 Sub main() With ActiveSheet.CheckBoxes.Add(10, 10, 20, 20) .Name = "CheckBox " & .Index .Caption = "" .OnAction = "check" End With With ActiveSheet.CheckBoxes.Add(10, 50, 20, 20) .Name = "CheckBox " & .Index .Caption = "" .OnAction = "check" End With With ActiveSheet.CheckBoxes.Add(10, 100, 20, 20) .Name = "CheckBox " & .Index .Caption = "" .OnAction = "check" End With End Sub Sub check() '// クリックされたcheckboxの番号が知りたい// End Sub

  • ExcelのVBA動作中の再計算禁止について

    ワークシート上に多数のチェックボックスを設置し、 一括管理のために簡単なVBAを記述しました。 Sub チェックボックス一括TRUE() With Application .ScreenUpdating = False .Calculation = xlCalculationManual CheckBoxes.Value = True .Calculation = xlCalculationAutomatic End With End Sub これだと瞬間で処理が完了するのですが、当初は .Calculation = xlCalculationManual .Calculation = xlCalculationAutomatic の二行をそれぞれ EnableCalculation = False EnableCalculation = True としていて、これは相当遅くなります(後者が遅い)。 速度の違いから両社は明らかに異なる動作をしていると思いますが、 調べてはみたものの自分にはそれぞれの処理の意味がよく理解できていません。 どなたかご教授いただければ。

  • エクセルでObjectがあるセル番地を取得するマクロは?

    エクセルのワークシート上にフォームのチェックボックスが多数配置されています。そのチェックボックスのTOPにあたる位置がセル番地で言えばどこになるのかを取得する方法はないでしょうか? TOP位置は以下のようにチェックボックスに登録したマクロで簡単に取得できるのですが・・・。 セル番地を取得して、やりたいことは、そのセルの右隣のセルの値を取得することです。もし、そのセルの右隣のセルの値を簡単に取得できるなら別にTOP位置のセル番地が取得できなくともかまいません。 Sub test01() MsgBox ActiveSheet.CheckBoxes(Application.Caller).Top End Sub

  • エクセルVBAでフォームの無効化

    エクセル2000です。 ワークシート上に配置した、フォームのDropDown (コンボボックス)を一定の条件下で無効にしようと思い、下記のTEST1のようにやってみました。 Sub TEST1() ActiveSheet.Shapes.Range(Array("Drop Down 7", "Drop Down 8", "Drop Down 9")).Select Selection.Enabled = False End Sub うまくいきました。そこで Sub TEST2() ActiveSheet.Shapes.Range(Array("Drop Down 7", "Drop Down 8", "Drop Down 9")).Enabled = False End Sub のように書き換えたところ実行時エラーがでました。 下記のようにばらせばうまくいきますが、どうしてTEST2ではダメなのかわかりません。 ご教示ください。 Sub TEST3() With ActiveSheet .DropDowns("Drop Down 7").Enabled = False .DropDowns("Drop Down 8").Enabled = False .DropDowns("Drop Down 9").Enabled = False End With End Sub

専門家に質問してみよう