- ベストアンサー
エクセルVBAで2種類のCheckboxについて
ワークシート上に配置したチェックボックスですが、 フォームから挿入したものなら Sub TEST01() ActiveSheet.CheckBoxes.Value = xlOn End Sub で、全てのチェックボックスがオンになります。 コントロールツールボックスから貼り付けたチェックボックスの場合はどのように記述するのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
エキスパートさん、こんにちは。 KenKen_SPさんにお任せすれば解決でしょうが、横からちょこっとお節介。。 >Sheets("Sheet1").OLEObject(CheckBox & i).Value = x Sheets("Sheet1").OLEObjects("CheckBox" & i).Object.Value = x 一行のコードに3ヶ所のミス。 やりましたね、日本新記録!!。(^o^)/~~
その他の回答 (5)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >きっとシート上では、ActiveX コントロールではなく、フォームのチェックボックスなどを使ったほうがいいということなんでしょうね。 私のは役に立たない話かもしれませんが、 フォームのコントロールって、もともと、Ver.5 スタイルで、ダイアログシートで使うものですね。それは、それなりに便利ですし、MS-Wordのフィールドと良く似ていますし、表現力もあります。 そういうわけで、コントロールツール側とフォーム側とが、両方共存している形で、10年以上も続いているのですが、MS側は、どういう考えを持っているのか、はっきりは読めないですね。ただ、MSは、突然に換えるということを過去してきましたから、安心はできません。 確かに、いまひとつ、OLEObjectは、一般的には使いづらいような気がします。Shapes コレクションからも取れるからこそかもしれませんが。 私は、なるべくは、古い形式で書く方法は、避けようとは思っているのですが、フォームツールは、時に、便利だと思うことは多いですね。 ゆくゆくは、ダイアログシートと共に、フォーム側が、廃れていく運命にあるのではないか、と思っています。しかし、マクロにしても、古い形式のものが、Excel 2007 でも、残っているわけです。ある方が、ここのカテゴリで削除覚悟(結果は削除された)で質疑応答とは関係がなく書いていた、古い形式のコードや書き方は撤廃すべきだとは、本筋の論理としては正しいけれど、その実態を知っていればこそ、他人には、一方的に勧められません。少なくとも、現状で使えるものは、そのスタイルにこだわらず、すべて使うというのは、誰に遠慮することもなく、あたりまえのことですからね。
お礼
Wendy02さん、いつもありがとうございます。 やはり、OLEObjectを使いこなせないとまずいですね。 これから少しずつ勉強します。 先日エクセル2007に触る機会があったのでさっそく試したところ、ダイアログシートを使うと2007形式では保存が出来なくなっていました!(2003互換形式ではもちろん保存OKですが) いよいよ、苦手なユーザーフォームにも取り組まなくてはならないようです。ふぅ~。
- KenKen_SP
- ベストアンサー率62% (785/1258)
> 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段階の手続きを取る必要があるということです。
お礼
有難うございます。 わかりました。きっとシート上では、ActiveX コントロールではなく、フォームのチェックボックスなどを使ったほうがいいということなんでしょうね。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 少し、ちゃんとした書き方をすれば、こうなりますね。 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
お礼
いつもありがとうございます。 TypeOf関数ですか、はじめて知りました。ありがとうございます。 勉強になります。
- KenKen_SP
- ベストアンサー率62% (785/1258)
CheckBox コントロールだけのコレクションを取得するプロパティーが ないみたいですね。For ~ Next で回すしかないと思います。
お礼
ありがとうございます。 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)
CheckBox1.Visible = True で、いいのかな?。
お礼
> CheckBox1.Visible = True 一個のときはそれでいいのですが、例えば11個あった場合はどうでしょうか? x = Sheets("Sheet1").CheckBox1.Value MsgBox x For i = 2 To 11 Sheets("Sheet1").CheckBox(i).Value = x Next では実行時エラーなんです。
お礼
> やりましたね、日本新記録!!。(^o^)/~~ 阿茶! 前の2つはほんとお恥ずかしい・・・。 最後の1つは、Objectと入れなければいけないんですね。でもどうしてなんでしょう? Sheets("Sheet1").OLEObjects("CheckBox" & i)だけでオブジェクトなんじゃないんですか?