- ベストアンサー
Excel2007 VBA ラジオボタン セルに動的に配置
ラジオボタンをセルに合わせて配置したいです。 http://oshiete1.goo.ne.jp/qa1194660.html より 1.コピー&ペーストでアクティブセルに配置 2.数値でセルに合わせて配置 と二つの方法は理解できたのですが。 1.は一度適当なところにボタンを貼り付けなければいけない。 2.は数値による位置指定なのでやや不安定(セルの大きさが変更された場合に対応しなければならない) ですので簡潔に、 1.アクティブセルを指定 2.セルの大きさに自動的に合わせてオプションボタンを配置 といったことはできないのでしょうか。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
Excel.FormコントロールのOptionButtonは With ActiveCell .Worksheet.OptionButtons.Add .Left, .Top, .Width, .Height End With ActiveXコントロールのOptionButtonは With ActiveCell .Worksheet.OLEObjects.Add ClassType:="Forms.OptionButton.1", _ Left:=.Left, Top:=.Top, _ Width:=.Width, Height:=.Height End With どちらもActiveCelの.Left, .Top, .Width, .Height それぞれのプロパティに合わせて配置すれば良いです。 シート上に配置するのは、Formコントロールをおすすめします。 シート上にActiveXコントロールを多数配置する場合、不具合が発生する事が多いと聞きます。 Excel.Formコントロールの方が親和性が良いのだと思います。
その他の回答 (8)
- end-u
- ベストアンサー率79% (496/625)
こんばんは。Wendy02さん。お返事ありがとうございます。 なるほど、『回答する意識の違い』ですね。 ひょっとすると、こういったQ&A掲示板に対する利用ポリシーの違いとでも言えるのでしょうか。 私は別にプロではないので『教えている』という意識は薄く、そのせいかもしれませんね。 どちらかというと、ユーザーの立場でアドバイスしながら自分も勉強させてもらってる意識の方が強いのです。 最終的には、メーカーが機能を切り捨てたら方向性に従うも何もなく、使えないわけですから今からその準備をしておかなくても。 とは個人的には思いますが。 何か大げさだなあ...と思ってるところがきっと納得云々の部分なのでしょう。 VBAヘルプは確かにそういう方向性が見てとれないわけでもないですが、2007のメニュー構成や一般ヘルプにはあまりそういう方向性は感じ取れないもので。 #そう言えばココは『[技術者向] コンピューター > プログラミング > Visual Basic 』カテでした。 いずれにしても、 『ワークシート上にOptionButtonなどのコントロールを多数配置する場合、フォームコントロールの方が優れているが、 問題は発生するけれどもMicrosoftが勧めているActiveXコントロールをやむを得ず使わざるを得ない』 というのがWendy02さんのお考えですね。 先にも書いたように >経験豊富な回答者の方がフォームコントロールよりもActiveXコントロールを勧められた事例に初めて遭遇しました。 >同様なケースでのアドバイスの仕方も、そろそろ考え直さないといけない時期なのでしょうかね。 という事で私もしばらく考えてみます。 (深く考えるのは苦手なので長続きはしないかもしれませんが) お答えを頂いて、すっきりしました。ありがとうございました。 質問者のShimantoGaさん、スレッドをお借りした形になってしまったようで申し訳ありません。ありがとうございました。
お礼
>質問者のShimantoGaさん、スレッドをお借りした形になってしまったようで 一向に構いません、私も興味深く読ませていただいておりました。 以下私の感想なのですが・・・ >問題は発生するけれどもMicrosoftが勧めているActiveXコントロールをやむを得ず使わざるを得ない これは色々と問題あるのではないかと。 ActiveXがいかに将来性のある技術であろうと、現時点で問題があるのが発覚した時点でフォームコントロールを使用しなければならないでしょう。 でなければシステムとして成立しませんし、成果物として提出も出来ません。 バージョン制約を受けた場合ActiveXコントロールに問題があることは発覚しているので、フォームコントロールを使用するようにする。 Excel最新版では問題が解消されているので、将来性のあるActiveXコントロールの使用を「推奨」する。 私見ですがこんなイメージでよろしいでしょうか。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 #5に対する返事です。それは、回答する意識の違いです。 納得していただけるとは思いませんが、こちらの考え方を多少書かせていただきます。 >両方のコントロールを使ってみれば解る事で、それぞれ特性の違いがあるわけですから、その特性を把握した上で、自分のスキルと目的に応じて使い分ければ良いだけの話です。 >『現状で使えるものは、そのスタイルにこだわらず、すべて使うというのは、誰に遠慮することもなく、あたりまえのことですからね。』 それは、個人の立場でコーディングしているなら、それで良いと思います。誰にはばかることなく書けばよいと思います。VBAは、本来プライベートなものでチームで共通の書法で構築するものでもありません。(それにしては、私は、質問者さんに余計なことを書きすぎていますが、それは突っ込まないでください。)しかし、私は、一応、掲示板で教えている以上は、人に見せるコードを意識して、ある程度のMicrosoft 側の方向性には従っていくことが良いのではないかと考えています。(ただし、最近、WorksheetFunction.関数を一部Application.関数にしました。コードの無駄が多くなるからです。) 以前になりますが、掲示板では良く知られた人が、私の書いたVer.4マクロ関数を使ったものに対してと、何回も執拗に攻撃をしました。書いている内容は荒唐無稽なものでしたが、回答者として技術的に多少は自信がある人にとって、良く分からないテクニックを他人に書かれるのは面白くない、というのは心理的には分かるような気がします。 その人がOffice の知識に対しては不十分だったとしても、そうした情報を知る手段もなく、まして一般の入門者や初心者の方には、半永久的に届かないテクニックになってしまう可能性が強いと思います。 それと、Microsoft 社自身の開発の考え方というのは、仮にどんなユーザーがいたとしても、最終的には古いものは、時期が来たら切り捨てする、ということを何度もしてきていますから、現行では、Officeの開発のチームリーダが、VBAを除去しないと保証(2008年時)はしても、小出しにオブジェクトを切り捨てすることは起こりうることだ、と思います。それよりも、VBA上では、ヘルプにないということは、何よりも使ってほしくない、と解釈しています。 なお、分析ツールアドインは、Ver.5マクロのフォームを未だに使っています。そして、このアドインは、不具合もあると聞きます。 私は、Excel 2000からVBAを始めて、遡って、Ver.4 やVer.5 のテクニックは、新たに学びました。捨てがたい情報はあります。実際、このアドインはハングすると解除が面倒です。しかし、そうしたテクニックは、唯一無二のものではないようです。ただし、それを補うテクニックは、格段に難しくなることが多いのです。 Ver.5のフォーム・ツール(コントロール)の場合は、オブジェクトのプロパティは分かっても、多くの方は、メソッドまでは良く分からないと思うのです。VBAを始めたばかりの人や初心者の人たちのことを考えていくと、あえて聞かれる以外には、参考程度にしか紹介できないように思っています。事実、Office 関連やここの掲示板でも、Ver.5という認識をする人はいないとは思いますが、Ver.5 のフォーム・ツールに関する質問は極端に減ってきたと思います。 つまり、おっしゃっている >A)優れているフォームコントロールではなく、Microsoftが勧めているActiveXコントロールを使ったほうが良い。 ということを考えています。良い悪いではなく、やむをえないのです。
- end-u
- ベストアンサー率79% (496/625)
[フォームコントロール]と[ActiveXコントロール]についてはヘルプの「フォーム」の項を参照してください。 http://office.microsoft.com/ja-jp/excel/CH102509001041.aspx [フォームコントロール]も[ActiveXコントロール]も、ワークシート上に配置する時 OptionButton や CheckBox などは、必ずしもマクロが必須というわけではないのです。 手作業で配置しリンクセルを設定して、セルのデータと連携しながらセル以外の入出力手段として使えます。 VBA的に違いを把握しようとするなら[オブジェクトブラウザ]を開いてください。(VBEウィンドウで[F2]キー) [オブジェクトブラウザ]ウィンドウ内で右クリック「非表示のメンバを表示」。 検索ボックス.検索文字列に OptionButton と入力して「検索」。 非表示メンバになっている Excelライブラリの OptionButton クラスが[フォームコントロール]の OptionButton です。 シート配置する際、2003以前は[フォーム]ツールバーでした。 MSForms のライブラリの OptionButton クラスが[ActiveXコントロール]の OptionButton です。 シート配置する際、2003以前は[コントロールツールボックス]ツールバーでした。
お礼
回答ありがとうございます。 >Excelライブラリの OptionButton クラスが[フォームコントロール]の OptionButton です。 確かにExcelライブラリとMSFormsライブラリの二つにOptionButtonクラスが存在していました。(OptionButtonsなんてのもありますが) 見るとフォームコントロールのOptionButtonにはClickイベントが存在しないなど、ActiveXコントロールとは別物のようです。(今さらですが) このメンバに応じてフォームかActiveX、どちらのコントロールを使用するか決めれば良いということですね。 >シート配置する際、2003以前は[フォーム]ツールバーでした。 >2003以前は[コントロールツールボックス]ツールバーでした。 2003と2007で名前が変わっているとややこしいですね。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >ユーザーフォームに対してフォームコントロールを乗せる方法しか載っていません。 #1,2さんが書いていたことに対しても、私の書いたことにも、どうやら誤解があるようです。ご質問者さんは、フォームというのは、UserForm ツールのことをおっしゃっているのだと思います。「フォームがシートに親和性が高い」というフォームとは、開発メニュー→挿入→フォームコントロールのツールのことです。 フォーム・ツールの載っている本など、現在では売られてはいませんし、一般の方には、詳しい資料やテクニックは入手できないはずです。 http://oshiete1.goo.ne.jp/qa329690.html フォームとコントロールツールボックスの違い 一応、フォームのマクロも出しておきますが、もし、フォームについて分からないようでしたら、この件についての書き込みは忘れたほうがよいですね。 なお、 >2.セルの大きさに自動的に合わせてオプションボタンを配置 ということはありません。画面サイズに連動していますから、オプションボタンの大きさ自体は変わりません。 '------------------------------------------- Sub Test1() 'オプションボタン追加 Dim i As Long For i = 1 To 10 With Cells(i, 1) x1 = .Left + 2 y1 = .Top x2 = .Offset(, 1).Left y2 = .Offset(1).Top End With With ActiveSheet.OptionButtons.Add(x1, y1, x2 - x1, y2 - y1) .Caption = "" End With Next i With Range("A1") x1 = .Left y1 = .Top x2 = .Offset(, 1).Left y2 = .Offset(i - 1).Top End With With ActiveSheet.GroupBoxes.Add(x1, y1, x2 - x1, y2 - y1) .Caption = "1" End With End Sub '------------------------------------------- Sub Test2() 'オプションボタン削除 ActiveSheet.OptionButtons.Delete ActiveSheet.GroupBoxes.Delete End Sub '-------------------------------------------
お礼
回答ありがとうございます。 確認しましたところ、UserFormのツールボックスに存在しているアイテムはすべてフォームコントロールではなくActiveXコントロールのようですね。 失礼しました。
- end-u
- ベストアンサー率79% (496/625)
よくわかりません。 「Active X コントロールを多く使えば、外部プログラムですから、メモリの負担が多くなり問題が発生するのは言うまでもありません。」 「そういう場合は、Formツールのほうが圧倒的に優れていますが、」 ここまでは解ります。 「だから、Formツールが良いともいえません。」 なぜにそういう結びになるのかが理解できません。 本意はどこにあるのですか? ワークシート上にActiveXコントロールを多数配置する場合、問題は発生するけど A)優れているフォームコントロールではなく、Microsoftが勧めているActiveXコントロールを使ったほうが良い。 B)フォームコントロールが良いともいえず、悪いともいえず。どちらでも構わない。 C)各ユーザーが判断するのであって、アドバイスしないほうが良い。 D)その他。 答えて頂く義務はありませんが、何かすっきりしないもので。申し訳ありません。 仮に(A)だとすると、経験豊富な回答者の方がフォームコントロールよりもActiveXコントロールを勧められた事例に初めて遭遇しました。 同様なケースでのアドバイスの仕方も、そろそろ考え直さないといけない時期なのでしょうかね。 ただ、[フォームコントロール]が古いと言っても、例えば2007からExcelを始めた方は[開発]-[コントロール]タブの[挿入]で [フォームコントロール]、[ActiveXコントロール]と並んで出てくるものを古いと感じないのではないでしょうか。 挿入操作もマクロ記録できる状況で、「裏技」とは言えないでしょう。 両方のコントロールを使ってみれば解る事で、それぞれ特性の違いがあるわけですから、 その特性を把握した上で、自分のスキルと目的に応じて使い分ければ良いだけの話です。 『現状で使えるものは、そのスタイルにこだわらず、すべて使うというのは、誰に遠慮することもなく、あたりまえのことですからね。』
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 先の書き込みから、こちらを読ませていただきました。 >現在ActiveXコントロールを多く使っており、Formコントロールを使用した方が良い理由を知りたいです。 それは立場の違いだと思います。ある程度のレベルの人なら、どちらがどうということはいえないのですが、VBAを近年始めた人にとっては、古いもの(レガシー)はお勧めしません。レガシーテクニックを使わざるを得ないときはあります。しかし、それは、今では、「裏技」のような存在になってしまうと思うのです。 ActiveX コントロールのListBox のスクロールのエラーの問題は、前から聞いたことがありますが、それはバグとして認識され、改善されるべき問題であると思います。Formツールは、本来、DialogSheetに使われ、Excel Ver.5で使われていたもので、しょせん、レガシーだと思っています。その周辺のオブジェクトは、今のOffice 2000? 移行のHelp に出てきません。プロパティ自体は、ローカルウィンドウで分かるにしても、ほとんどの方は、メソッドなどは分からないと思うのです。それを、今さら、新しく始めた人たちにまで使ってください、とも言えないのです。事実上、Microsoft 側は、Active X コントロールへの移行を勧めていると思うのです。 Formツールの利点と比較すると、ActiveXコントロールは、いわゆるコレクション形式にはなっていませんので、コントロール配列の真似事などは基本的には出来ません。(使うためには、クラス・インスタンスが必要です。)また、Active X コントロールを多く使えば、外部プログラムですから、メモリの負担が多くなり問題が発生するのは言うまでもありません。そういう場合は、Formツールのほうが圧倒的に優れていますが、だから、Formツールが良いともいえません。
お礼
回答ありがとうございます。 わざわざこちらの方までご回答いただき誠に有難うございます。 つまり、「レガシーテクニックを使わざるを得ないとき」以外はActiveXコントロールでの実装を考えた方が良い、ということで宜しいでしょうか。 気になったのはExcel VBAの書籍をみると、ユーザーフォームに対してフォームコントロールを乗せる方法しか載っていません。 ActiveXコントロールを見かけるのはかなり希でした。 そもそもワークシートにコントロールを張り付ける、というやり方自体多くの書籍で紹介されていません。(ほとんどユーザーフォームに対してのみ) 私の参考にした書籍が間違っていた(悪い意味ではなく)だけでしょうか。
- imogasi
- ベストアンサー率27% (4737/17069)
シートのセルの画面上の位置とコントロールの位置は全く関係が無く、基本はコントロールを貼り付け設置する人の位置あわせの責任です。シートに浮いているようなイメージ。 でも (1)コントロールをコードから生成し(ADD) (2)そのコントロールのLeft,Top、Width、HeightをセルのLeft,Top、Width、Heightに関連付けることができる。 OptionButtonの例で Sub test02() For i = 2 To 5 l = Cells(i, "B").Left + 10 t = Cells(i, "B").Top + 5 w = Cells(i, "B").Width - 10 h = Cells(i, "B").Height - 5 With ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1") .Top = t .Left = l .Width = w .Height = h .Object.Caption = "ボタン" & (i - 1) End With Next i End Sub こういうことを聞いているのかな。 行高、列幅は適当な大きさに設定しておくこと。
お礼
回答ありがとうございます。 ExcelとActiveXを関連付ける手段が提供されているのか、と考えていたのですが。 やはり自分で位置指定してやるしかないようですね。 Dim i As Integer i = 1 For i To 2 Step 1 ActiveSheet.Cells(i, 1) 'アクティブセルに合わせてOptionButtonを配置 Next と、こんなことがしたかったんですが。 教えていただいたコードを参考にさせていただきます、ありがとうございました。
- end-u
- ベストアンサー率79% (496/625)
>宜しければ不具合の具体的な内容を教えていただけないでしょうか。 >現在ActiveXコントロールを多く使っており、Formコントロールを使用した方が良い理由を知りたいです。 ActiveXコントロール(MSForms.Control)は本来UserFormに配置して使う方が適しているのではないでしょうか。 最近のスレッドで http://oshiete1.goo.ne.jp/qa5036603.html こういうのもありました。2003sp3/vba6.5 1024でも同様に、Excelが落ちてました。 今日現在では発生しなくなりましたので更新プログラムがUpdateされていたようです。 ですので、不具合が多いといっても http://support.microsoft.com/kb/169885/ja http://support.microsoft.com/kb/211866/ja http://support.microsoft.com/kb/312949/ja http://support.microsoft.com/kb/315199/ja http://support.microsoft.com/kb/320520/ja http://support.microsoft.com/kb/330157/ja http://support.microsoft.com/kb/416344/ja http://support.microsoft.com/kb/417966/ja http://support.microsoft.com/kb/418780/ja http://support.microsoft.com/kb/823988/ja http://support.microsoft.com/kb/834685/ja http://support.microsoft.com/kb/838006/ja http://support.microsoft.com/kb/838914/ja http://support.microsoft.com/kb/842231/ja バージョンアップやサービスパック、修正パッチなどで解消されるケースも多いのでしょう。 シート配置の場合Formコントロールをおすすめしたのは、例えばオプションボタンを多数配置する時に、 『Formコントロールで事が足りるならば』 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ あえてActiveXコントロールを使わなくても良いのではないでしょうか。という意が強いです。 [フォーム]ツールバーのコントロールはExcelライブラリのものなので、 いわば別アプリのActiveXコントロールよりも、相性が良いような気がします。 不具合情報などを参考に、『そんな事もあるんだ』くらいに受け取っておけば何かの時に対処できますから、 知ってて使う分にはいいんじゃないでしょうか。強固に反対しているわけではありません。
お礼
回答ありがとうございます。 参考サイトを読ませていただきました。 Excelのバージョン制約を受ける場合、古いものほどFormコントロールを使用した方がバグが少ない、と認識しました。 Excelの最新版であればどちらでも良い、といった感じでしょうか。 大変勉強になりました、ありがとうございます。
お礼
回答ありがとうございます。 自動的にセルのLeft,Top~に合わせてはくれないようですね。 ご教授いただいた方法で実現したいと思います。
補足
>シート上にActiveXコントロールを多数配置する場合、不具合が発生する事が多いと聞きます。 調べてみたところ、以下のページを発見しました。 http://oshiete1.goo.ne.jp/qa329690.html 当時Excel2000以前でしょうか? 同じ不具合かどうかはハッキリしません。(やや古い記事ですし) 宜しければ不具合の具体的な内容を教えていただけないでしょうか。 現在ActiveXコントロールを多く使っており、Formコントロールを使用した方が良い理由を知りたいです。