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

excel2010

フレーム内のオプションボタン状態の取得方法について教えてください。

従来、オプションボタンの状態はLinkedCellにセルアドレスを設定(H2と設定)すれば、
下記の様に設定すれば、チェックが入っているかどうかを確認できました。

If Range("H2") = True Then …(1)

今回、オプションボタンを大きく設定したかったので、
excel2010の
開発→挿入→コントロールの選択で
Microsoft Forms 2.0 Frame を選択し、フレームを作成。
フレームオブジェクト→編集でZOOMを200に設定。
ツールボックスからオプションボタンを選択し配置。
これで通常の2倍の大きさのオプションボタンを配置できました(OpitonButton1)。

このオプションボタンのプロパティを見ると、LinkedCellという項目がありません。

このフレーム内に設定したオプションボタン(OptionButton1)が選択されているかどうかを
確認する方法を知りたいのです。

ホームページで調べたのですが、(1)の部分がどういう書式に代わるかを教えていただきたく。
尚、オプションボタンはフレーム内に2ケ(OptionButton1,OptionButton2)配置しています。

A 回答 (5件)

こんにちは。

お邪魔します。

> フレーム内のオプションボタン状態の取得方法について教えてください。

> このフレーム内に設定したオプションボタン(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プロパティを直接に取得するようにすれば解決するのではないでしょうか。
    • good
    • 1

#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()を再度実行する必要があります。

追加レス、以上です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/03/14 14:52

#1の回答者です。



#2,#3を読んで、ご質問を、間違った解釈に取ってしまった気がしましたので、あえて書かせていただきます。あくまでも、Frame内の、オプションボタンの値を取るという方法なら、アクセス・オン・マクロ(マクロで、その場所にアクセス)すれば取得は可能です。

#2さんがお書きになった例をみれば分かるとおりです。

私は読み違えたのは、ワークシート上に、大きなオプションボタンがあり、それから、結果(True, False)を、ワークシートに出すということに対して、イベント発生について代替え案を書いたわけです。

そのあたりの内容を把握せず、オプションボタンの「ズーム」という観点から、代替え案を出させていただいたのです。質問者さんの趣旨を把握せずに、回答を書いたことは、当方の間違えでした。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/03/14 14:51

#2、cjです。


ちょっと解り難いことを書いていたので補足説明、追記です。

> そもそも、オプションボタンの状態は、LinkedCellを介さずとも
> If OptionButton1.Value = True Then
> とか
> If OptionButton2.Value = True Then
> のように取得するのが標準です。

この記述は、オプションボタンをフレーム上ではなくて、シート上に直接配置していた場合の
オプションボタンの状態を取得する方法を説明したものです。

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

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

お礼日時:2014/03/14 14:51

こんばんは。



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
'//
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/03/14 14:49

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A