dポイントプレゼントキャンペーン実施中!

自分なり解決法をさがしたのですが
どうしても分からないので質問しました。
宜しくお願いします。

OS:WindowsXP SP3
Office:Microsoft Office Excel 2007

1.Worksheet上にActivX Frameコントロール(Microsoft Forms 2.0 Frame)を挿入
2.項番1で挿入したFrame上にActivX OptionButtonコントロールを2つ挿入
(フレームオブジェクト(O)→編集(E)後のツールボックスで挿入)

OptionButtonをクリックしたらイベントで"~する"ということをしたいのですが
デザインモード状態でFrameコントロール内のOptionButtonをダブルクリックしても反応無し
右クリックの"コードの表示..."もグレー表示で選択できません。

仕方ないのでFrameのClickイベントやMouseMoveイベントで対処していますが
出来るならOptionButtonのイベントで処理したいと思い質問しました。

ActivXではなくフォームコントロールのFrameに変えたり
ユーザーフォームでやれば可能ですが・・・

対処法あれば
宜しくお願い致します。

「EXCELのActivXコントロールにつ」の質問画像

A 回答 (3件)

#1、2、cjです。



この課題は運用の仕方の方が難しく感じる人多いかな、と思い直したので、
サンプルを改めます。

ブックを開けば、Frame上に配置した OptionButtonのイベントが有効になるような
簡易版のサンプルです。

' ◆◆ や ' ◆ で示した行の
各オブジェクト名には注意して必要なら書き換えるようにしてください。

特に' ◆◆ の行、Sheet1 2カ所については、注意!
シート名ではなくて、
VBAプロジェクトでのオブジェクト名です。
VBE画面の左側にあるプロジェクトエクスプローラを見ると
 ■ Sheet1 (Sheet1)
 ■ Sheet2 (Sheet2)
 ■ Sheet3 (Sheet3)
 □ ThisWorkbook
のような感じで表示されていると思いますが。
シートモジュールについては
 ■ オブジェクト名 (シート名)
のような表示になっています。
オブジェクト名、シート名、ともに、それぞれ独立して、
ユーザーが名前を付けられるようになっていますし、
シートの削除などあると命名規則にずれが生じて
 ■ Sheet1 (Sheet3)
 ■ Sheet2 (Sheet1)
 ■ Sheet3 (Sheet2)
こんな↑ことになる可能性もあります。
なので、オブジェクト名を知るには、
()の中のシート名を探して、
マッチしたら、()の外、左側にあるオブジェクト名を採るようにします。

以下はより実用に近いテスト用簡易サンプルです。
本格派志向なら、新規にクラスモジュールを挿入して書いてみたいですね。
こういう場合、特にコントロールの数が多い場合なんかは、
別にクラスモジュール用意した方が却って扱い易いかも知れません。

試す時は、新規のブックで、必要最小限のことだけして
動作を確認した方が紛れがなくなります。
準備出来たら、保存しておいて、再度開いた時から、機能するようになります。


' ' =====ThisWorkbook モジュール=====

Private Sub Workbook_Open()
  Call Sheet1.SetEvOPB  ' ◆◆ Sheet1 ?
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Call Sheet1.SetEvOPB(True)  ' ◆◆ Sheet1 ?
End Sub


' ' =====Sheet1 モジュール=====

Private WithEvents myOptionButton1 As MSForms.OptionButton
Private WithEvents myOptionButton2 As MSForms.OptionButton

Private Sub myOptionButton1_Click()
  MsgBox "Frame上に配置した OptionButton1 がクリックされました。"
End Sub

Private Sub myOptionButton2_Click()
  MsgBox "Frame上に配置した OptionButton2 がクリックされました。"
End Sub

Sub SetEvOPB(Optional ByVal Clear As Boolean)
  If Clear Then
    Set myOptionButton1 = Nothing
    Set myOptionButton2 = Nothing
  Else
    Set myOptionButton1 = Frame1.Object("OptionButton1")  ' ◆ Frame1 ? OptionButton1 ?
    Set myOptionButton2 = Frame1.Object("OptionButton2")  ' ◆ Frame2 ? OptionButton2 ?
  End If
End Sub
「EXCELのActivXコントロールにつ」の回答画像3
    • good
    • 0

#1、cjです。


書き忘れましたが、
Private Sub Worksheet_Activate()

Private Sub Worksheet_Deactivate()
は、
あくまでもテスト用(掲示用)のサンプルですので実用向きではありません。
実際には
ThisWorkbookモジュールの、Workbook_OpenやWorkbook_BeforeClose
などのイベントで、設定、解放するようにした方がいいと思います。

また、今回に限った話ではありませんが、
ActiveXコントロールを扱う上で、
ActiveXコントロールにフォーカスが残っている場合に、
Applicationのメソッドが実行時エラーになることもあるので
そんな時は一旦ActiveCell.Activate等の処理をしてから
シートをアクティブにして、メソッドに進むようにしてください。
ここら辺の挙動はバージョンごとに細かく変化しているらしいのですが、
実は私はExcel 2007はあまりよく知らないのです。
滅多にあることではありませんけれど、記憶の隅にでも置いておいてください。

以上です。
    • good
    • 0
この回答へのお礼

連絡遅れてすいません。
回答ありがとうございました。

教えて頂いた内容通り実施しましたら
オプションボタンでのイベント処理が可能になりました。

ありがとうございました。

お礼日時:2013/09/24 09:50

こんな感じでしょうか?


一応、VBEのコードペイン上部左にある[オブジェクト]にも
myOptionButton1 が表示されるようになりますので、
各種イベントはその右にある[プロシージャ]を参照してください。

' ' シートモジュール先頭、宣言部に以下
Private WithEvents myOptionButton1 As MSForms.OptionButton

' ' シートモジュールに続けて
Private Sub myOptionButton1_Click()
  MsgBox "Frane上に配置したOptionButton1がクリックされました。"
End Sub

Private Sub Worksheet_Activate()
  Set myOptionButton1 = Frame1.Object("OptionButton1")
End Sub

Private Sub Worksheet_Deactivate()
  Set myOptionButton1 = Nothing
End Sub
    • good
    • 0

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