• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フレーム内のオプションボタン状態取得方法について)

フレーム内のオプションボタン状態取得方法

このQ&Aのポイント
  • Excel2010でフレーム内のオプションボタン状態を取得する方法について教えてください。
  • 従来の方法ではLinkedCellにセルアドレスを設定していましたが、フレーム内のオプションボタンにはLinkedCellの項目が存在しません。
  • フレーム内に配置したオプションボタンの選択状態を確認する方法を知りたいです。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

こんにちは。お邪魔します。 > フレーム内のオプションボタン状態の取得方法について教えてください。 > このフレーム内に設定したオプションボタン(OptionButton1)が選択されているかどうかを > 確認する方法を知りたいのです。 直接的な回答として。 Microsoft Forms 2.0 Frame のオブジェクト名がFrame1だとして、 (各名前は運用に合わせて修正してください) Frameオブジェクトを配置しているシートのシートモジュールに記述する場合は   If Frame1.Controls("OptionButton1").Value = True Then とか   If Frame1.Controls("OptionButton2").Value = True Then とか。 他のモジュールから参照する場合は、   If Sheets("シート名").Frame1.Controls("OptionButton1").Value = True Then とか   If Sheets("シート名").Frame1.Controls("OptionButton2").Value = True Then とか。 そもそも、オプションボタンの状態は、LinkedCellを介さずとも If OptionButton1.Value = True Then とか If OptionButton2.Value = True Then のように取得するのが標準です。 オプションボタンの状態を間接的に取得する目的だけで LinkedCellプロパティを設定していたのであれば、それは不要です。 他の目的でLinkedCellプロパティを用いたい、というようなお話ではないようですから、 オプションボタンの.Valueプロパティを直接に取得するようにすれば解決するのではないでしょうか。

その他の回答 (4)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.5

#2、3、cjです。追加レスです。 もしかして、LinkedCell設定と同様の機能をVBAで実現させたい、ということもお考えの場合の為に、 参考として、簡易簡略な方法を一例挙げておきます。 解り易さの為、ThisWorkbook モジュールだけで纏めるように書いたサンプルです。 (シート名、  フレームのオブジェクト名、  オプションボタンのオブジェクト名、  リンクさせるセルの番地  は、適切に指定し直してください) ' ' 〓〓〓〓〓〓 ' ' ThisWorkbook モジュール ' ' ============ Option Explicit Private WithEvents myOptBtn1 As MSForms.OptionButton ' ' ============ Private Sub myOptBtn1_Change()   Sheets("Sheet1").Range("H2").Value = myOptBtn1.Value End Sub ' ' ーーーーー Private Sub SetOptBtnEv()   Set myOptBtn1 = Sheets("Sheet1").Frame1.Controls("OptionButton1") End Sub ' ' ============ Private Sub Workbook_Open()   Application.OnTime Now, "ThisWorkbook.SetOptBtnEv" End Sub ' ' ーーーーー Private Sub Workbook_BeforeClose(Cancel As Boolean)   Set myOptBtn1 = Nothing End Sub ' ' 〓〓〓〓〓〓 なお、 コントロールの追加や編集を行う際など、デザインモードに切り替わったり、VBAプロジェクトを中断したりすると、 リセットされてしまい機能しませんので、その場合は、Private Sub SetOptBtnEv()を再度実行する必要があります。 追加レス、以上です。

3620313
質問者

お礼

参考マクロありがとうございます。

回答No.4

#1の回答者です。 #2,#3を読んで、ご質問を、間違った解釈に取ってしまった気がしましたので、あえて書かせていただきます。あくまでも、Frame内の、オプションボタンの値を取るという方法なら、アクセス・オン・マクロ(マクロで、その場所にアクセス)すれば取得は可能です。 #2さんがお書きになった例をみれば分かるとおりです。 私は読み違えたのは、ワークシート上に、大きなオプションボタンがあり、それから、結果(True, False)を、ワークシートに出すということに対して、イベント発生について代替え案を書いたわけです。 そのあたりの内容を把握せず、オプションボタンの「ズーム」という観点から、代替え案を出させていただいたのです。質問者さんの趣旨を把握せずに、回答を書いたことは、当方の間違えでした。

3620313
質問者

お礼

いろいろお気づかいいただきありがとうございます。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.3

#2、cjです。 ちょっと解り難いことを書いていたので補足説明、追記です。 > そもそも、オプションボタンの状態は、LinkedCellを介さずとも > If OptionButton1.Value = True Then > とか > If OptionButton2.Value = True Then > のように取得するのが標準です。 この記述は、オプションボタンをフレーム上ではなくて、シート上に直接配置していた場合の オプションボタンの状態を取得する方法を説明したものです。 補足、以上です。

3620313
質問者

お礼

はい、上記がシート上の状態ということは把握していました。

回答No.1

こんばんは。 Microsoft Forms 2.0 Frameで、その中のオブジェクトを拡大するのは、たぶん、裏ワザだとは思いますが、その後が、続かないように思います。 もちろん、Frame内のオプションボタンの値自体は、取得できますが、それは、[マクロの実行]という方法、言い換えれば、オプションボタン側から、クリック時にイベントを発生し、値を返してくれるわけではないので、ユーザー側からのアクセスが必要になってしまいます。 実際、そういう場合は、新たに、APIタイマーを使ってイベントを設けることにはなるのですが、今度は、そのイベント自体が、不安定というか、Excel全体に波及してしまうので、私自身の経験としてはお勧めできないわけです。これも裏ワザです。ただし、Excel 2010 では試したことがありません。一部の人は考えるかもしれませんが、たぶん、クラス・イベントは、元が認識していないので、無理だと思います。どなたか、試してみても良いかとは思います。 私としては、もうマクロも長い間書いたことがありませんので、簡単な、オートシェイプでの代用品を考えてみました。図形の「丸」を選んで、それに、マクロの登録をしてあげます。 不格好なマクロかもしれませんが、丸の数は、いくつ作ってもオプションボタンのようになります。 図形の枠線の書式を太くしたりして整えれば、オプションボタンらしくなります。 '//標準モジュールが良い Sub OptionalShape()  Dim i As Long  Dim Acshp As Shape  Dim Nm As String  Dim flg As Boolean  Const xlOff As Integer = 7 '枠線だけ  Const xlOn As Integer = 9 '塗りつぶし  Set Acshp = ActiveSheet.Shapes(Application.Caller)  Acshp.DrawingObject.ShapeRange.ShapeStyle = xlOn  For i = 1 To ActiveSheet.Shapes.Count   With ActiveSheet.Shapes(i).DrawingObject.ShapeRange    If .AutoShapeType = msoShapeOval Then     If Not .Name Like Acshp.Name Then      .ShapeStyle = xlOff     End If     Cells(i, 8).Value = IIf(.ShapeStyle = xlOn, True, False) '出力--要調整(H列)    End If   End With  Next i  Set Acshp = Nothing End Sub '//

3620313
質問者

お礼

回答ありがとうございます。 記載いただいたマクロは、違う用途で試させていただきます。