No.6
- 回答日時:
merlionXXさん、こんにちは。
Enabled に関しては、フォームでも、コントロールツールでも、同じだと思います。それよりも、むしろ、そのイベントをどこで取るかということだと思います。新たにボタン等を設けるのでしょうか?
#2 で書いたとおりで、イベントを発生させたコントロールで Enabled =False にしたら、そのコントロールでは、復帰はできなくなります。
もちろん、ワークシート・イベントやコマンド・ボタンなど外部に、イベントを取ればよいだけのことですが、そのキーになる部分は書かれていませんから、私は、コントロールそのものでイベントを考えました。
その点で、フォームのほうが、VBAでも取り扱いが易しいです。私は、フォームのコントロールを多用します。コントロールツールの場合は、イベントの種類が豊富ですが、通常、VBAからではイベントを簡単に設定することが出来ないようです。ですから、クラス/インスタンスで、以下のような可能ですが、かなり取り扱いが面倒です。
>Shapes(OBname).DrawingObject.Value = Empty ではオプションボタンのリンク先セルが0になってしまい、前の状態が保持されなくなってしまいます。
>選択できないようにはするけど、前の状態は保持したいのです。
これ自体は、LinkedCellを空にしたら、OnAction で値を出力するか、しないかだけのことではありませんか?
前回とそっくり入れ替えです。
'<Sheet1 モジュール>
Option Explicit
Sub TestSampe1()
Dim OB As OptionButton
Dim i As Long
i = 1
For Each OB In OptionButtons
OB.OnAction = "Sheet1.MyOBAction"
'コントロールの名前を変更
OB.Name = "OB" & i
i = i + 1
Next
End Sub
Private Sub MyOBAction()
Dim OBname As String
OBname = Application.Caller
If Range("A1").Value = False Then
Shapes(OBname).DrawingObject.Value = Empty
Else
'リンク先セル
Range("F1").Value = Mid(OBname, InStr(OBname, "OB") + 2)
End If
End Sub
'-----------------------------------------------------
同じスタイルで、コントロールツールのコントロールを擬似コントロール配列にして、インスタンスを作りました。こちらは、Index を新しいプロパティとして付け加えています。Excelでは、ふだんは使わないコードですが、これも一興かもしれません。
'<標準モジュール>
Option Explicit
Option Base 1
Dim myClass1() As New Class1
Sub TestSample2()
Dim myBtns As New Collection
Dim ctrl As Object
Dim i As Integer
Dim mySh As Worksheet
Set mySh = Worksheets("Sheet1")
For Each ctrl In mySh.OLEObjects
If TypeOf ctrl.Object Is MsForms.OptionButton Then
With myBtns
.Add Item:=ctrl.Object
End With
End If
Next ctrl
For i = 1 To myBtns.Count
ReDim Preserve myClass1(i)
Set myClass1(i) = New Class1
With myClass1(i)
.mProperty = myBtns(i)
.Index = i
End With
Next
Beep
End Sub
'<Class1 モジュール>
Private WithEvents myOBtn As MsForms.OptionButton
Private myIndex As Integer
Public Property Get OBtn() As MsForms.OptionButton
Set OBtn = myOBtn
End Property
Public Property Let mProperty(ByVal OBtnNewValue As MsForms.OptionButton)
Set myOBtn = OBtnNewValue
End Property
Public Property Get Index() As Integer
Index = myIndex
End Property
Public Property Let Index(ByVal intNewValue As Integer)
myIndex = intNewValue
End Property
Private Sub myOBtn_Click()
If Worksheets("Sheet1").Range("A1").Value = False Then
myOBtn.Value = Empty
Else
'リンク先
Worksheets("Sheet1").Range("F1").Value = myIndex
End If
End Sub
ありがとうございました。
今回はNo5さんの方法であっけなく解決しました。
今回はボタン操作で行うマクロですのでイベントは考えなくて良かったのです。
最初からそう書いておけばよかったですね、お手数をおかけしました。
すみません。
No.4
- 回答日時:
こんばんは。
なぜ、メソッド、プロバティが多くあるコントロールツールボックスを使わないのですか?
で、Sheet1上にコントロールツールボックスのオプションボタンをいくつか配置。
但し、OptionButton1を無効にするタイミング(イベント)が書いてないのでコードは標準モジュール。
A1に値があれば(True)、OptionButton1 を有効にし、
何も入ってなければ(False)、無効とする。
-------------------------------------------------
Sub Test()
With Sheets("Sheet1")
If .Range("A1").Value Then
.OLEObjects("OptionButton1").Enabled = True
Else
.OLEObjects("OptionButton1").Enabled = False
End If
End With
End Sub
------------------------------------------------
ま、これでは汎用性がないので、ボタンの番号部分を変数にしてサブルーチン化等した方がいいかも知れませんね。
.OLEObjects("OptionButton" & N).Enabled = False
以上です。
ありがとうございます。
コントロールツールボックスならEnabled = Falseでいけるんですね。
今までフォームばっかりつかってきたので残念ながらコントロールツールボックスの方はうといんです。
No.3
- 回答日時:
#2 の追伸です。
また、サンプルコードを考えてみました。
以下は、フォーム独特だと思います。コントロールツールの場合は、OLEObjectsで制御しますので、この点で違ってきます。(と言って、まだ考えていません。まったく、違うコードのような気がします。)
Sheet1 の A1 に、
=IF(A2=0,FALSE,TRUE)
としてして、A2 に、数値を入力して、TRUE/FALSE を表示します。
'<Sheet1 モジュール> または、
'<ThisWorkbook モジュール>の Private Sub Workbook_Open()に登録
Private Sub Worksheet_Activate()
Dim OB As OptionButton
For Each OB In OptionButtons
OB.OnAction = "Sheet1.MyOBAction"
Next
End Sub
'<Sheet1 モジュール>
Private Sub MyOBAction()
Dim OBname As String
OBname = Application.Caller
If Range("A1").Value = False Then
Shapes(OBname).DrawingObject.Value = Empty
End If
End Sub
これで、試してみてください。
Wendy02 さん、いつもありがとうございます。
Shapes(OBname).DrawingObject.Value = Empty ではオプションボタンのリンク先セルが0になってしまい、前の状態が保持されなくなってしまいます。
選択できないようにはするけど、前の状態は保持したいのです。
現在はリンク先のセルの前の状態を別セルにコピーしておき、オプションボタンを押された場合、別セルの値をリンク先にコピーして対応しています。
No.2
- 回答日時:
merlionXX さん、こんばんは。
Wendy02 です。しばらく考えてみましたが、二つのロジックが考えられます。
(ちょっとお話がむつかしくなるかと思いますが)
最初に、そのオプションボタンを無効にするという、Range("A1")に、True/False を与えるものは、入力なのですか?式なのですか?それによって、設定が出来るような気がしています。式ですと、やっかいですね。それ自体には、イベントを発生させることはできませんので、常に、Now で Calculateイベントを発生させなくてはならなくなります。実用性が今ひとつ落ちます。
それから、もうひとつは、そのオプションボタンのイベントのコードは、OnAction ですね。だから、OnAction で、オプションボタンそのものを Enabled= False にするというのはできますが、それを、今度はEnabled =True と復帰する方法がなくなりますから、この選択はできませんが、少なくとも、OnAction で出力値そのものは、無効にすることが出来ますね。
どれか、ひとつで出来るはずです。この方法は、コントロールツール側でも、大きく変わることはないはずです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
エクセルVBA オプションボタンのチェックを外したい
Excel(エクセル)
-
Excel ラジオボタンのリセットを作りたい
Excel(エクセル)
-
Excel-VBA>コントロールをグレイアウトするには?
Excel(エクセル)
-
-
4
Excelのラジオボタンにチェックが入らないようにするには?
Excel(エクセル)
-
5
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
6
エクセルVBAでOptionButtonのオンオフ取得
Excel(エクセル)
-
7
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
8
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
9
ラジオボタンのオンとオフ
Excel(エクセル)
-
10
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
11
マクロボタンをある条件の時にだけ、表示させたいのですが・・・
その他(Microsoft Office)
-
12
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
13
エクセルのチェックボックスを保護対象から外すには
Windows Vista・XP
-
14
Excelのシートを保護してオプションボタンの選択のみ可能にしたい
Excel(エクセル)
-
15
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
16
ユーザーフォームに入力したデータを保持する方法
Visual Basic(VBA)
-
17
UserForm1.Showでエラーになります。
工学
-
18
VBAでのコントロール操作
Visual Basic(VBA)
-
19
メッセージボックスに表示する文字を大きくしたい
Excel(エクセル)
-
20
オプションボタンによっての表示/非表示
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カメラスクロールするのを動画...
-
エクセル・VBA CheckBoxのオブ...
-
ACCESS2010のVBAでフォーム内ク...
-
vb.netで画面のコントロールId...
-
コンボボックスの文字によるif...
-
エクセルVBAでオプションボタン...
-
チェックボックスをオンにした...
-
RefEditで完全にハマっています。
-
EXCELでactivexコントロールを...
-
VBAのエラーについて、”実行時...
-
ActiveX DLL と ActiveXコント...
-
C#でJAVAアプレットを作る
-
フォーム上の現在アクティブな...
-
excel vbaでユーザーフォームに...
-
コントロール配列と同じような...
-
VB.NETでフォーム上にエクセル...
-
(VBA)スピンボタンの大量...
-
C# FlowLayoutPanelにて
-
vb.net メニューをダブルクリッ...
-
VB.NET開発。ラジオボタンとコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カメラスクロールするのを動画...
-
エクセル・VBA CheckBoxのオブ...
-
エクセルVBAでオプションボタン...
-
ExcelVBAでListViewが使用できない
-
vb.netで画面のコントロールId...
-
変数をコントロール型で使用す...
-
コントロールを移動できない
-
EXCELでactivexコントロールを...
-
VBAのエラーについて、”実行時...
-
コンボボックスの文字によるif...
-
C#で角が丸いテキストボックス
-
VBA ユーザーフォームの Keypre...
-
chr関数の呼び出しで「プロ...
-
ListViewのチェックボックスに...
-
Groupboxの配下のコントロール...
-
OCXって何ですか?
-
ユーザーフォームで動的(Me.Con...
-
Labelコントロールの(左右)余...
-
Excel VBA で Richtextboxを使...
-
ExcelVBAのコントロールの種類...
おすすめ情報