
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も見ています
-
エクセルVBA オプションボタンのチェックを外したい
Excel(エクセル)
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
エクセルVBAでOptionButtonのオンオフ取得
Excel(エクセル)
-
-
4
Excel-VBA>コントロールをグレイアウトするには?
Excel(エクセル)
-
5
Excel ラジオボタンのリセットを作りたい
Excel(エクセル)
-
6
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
7
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
8
エクセルVBAでUserFormを起動した時
Excel(エクセル)
-
9
【エクセル】オプションボタンにセルの値を反映させるには
Visual Basic(VBA)
-
10
UserForm1.Showでエラーになります。
工学
-
11
オプションボタンを別シートに連動
Excel(エクセル)
-
12
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
13
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
14
ユーザーフォームに別シートからデータを反映させたい。
Visual Basic(VBA)
-
15
VBAでユーザーフォームを再表示させたい。
Excel(エクセル)
-
16
エクセルVBA/フォームのオプションボタンを元に戻す
Excel(エクセル)
-
17
エクセルVBAマクロのオプションボタンについて
Excel(エクセル)
-
18
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
19
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
20
Enterキーでマクロを起動さす。
その他(ソフトウェア)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの文字数列関数と競馬...
-
エクセルでフィルターした値を...
-
表計算ソフトでの様式の呼称
-
エクセルシートの見出しの文字...
-
エクセルに写真が貼れない(フ...
-
【マクロ】実行時エラー '424':...
-
【画像あり】【関数】指定した...
-
Office2021のエクセルで米国株...
-
【関数】3つのセルの中で最新...
-
LibreOffice Clalc(またはエク...
-
Excelで4択問題を作成したい
-
【画像あり】オートフィルター...
-
空白のはずがSUBTOTAL関数でカ...
-
エクセルのVBAで集計をしたい
-
Excelに貼ったXのURLのリンク...
-
エクセルのライセンスが分かり...
-
【マクロ】excelファイルを開く...
-
エクセルの複雑なシフト表から...
-
エクセルのリストについて
-
【関数】=EXACT(a1,b1) a1とb1...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【マクロ】実行時エラー '424':...
-
エクセルのVBAで集計をしたい
-
Office2021のエクセルで米国株...
-
【画像あり】オートフィルター...
-
vba テキストボックスとリフト...
-
他のシートの検索
-
【マクロ】【相談】Excelブック...
-
【マクロ】【配列】3つのシー...
-
【マクロ】元データと同じお客...
-
【マクロ】数式を入力したい。...
-
【マクロ】左のブックと右のブ...
-
エクセルの関数について
-
エクセルのリストについて
-
【マクロ】変数に入れるコード...
-
エクセルシートの見出しの文字...
-
【マクロ】excelファイルを開く...
-
【関数】3つのセルの中で最新...
-
エクセルの複雑なシフト表から...
-
【マクロ】【画像あり】❶ブック...
-
LibreOffice Clalc(またはエク...
おすすめ情報