- ベストアンサー
Excel VBA スピンボタンの使い方
- Excel VBA初心者のためのSpinButtonの使い方について解説します。
- ActiveXでシート上に配置したSpinButtonの値をコードで設定した場合のChangeイベント発生について、異なる方法があるかどうかについて考えます。
- SpinButton1.Enabled = FalseはグレーアウトさせるだけでChangeイベントは発生しますが、コードからの設定でChangeイベントを発生させない方法についても検討します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
希望されているイベントが起きないようにはできないと思いますが フラグを使えば、 希望のタイミングではイベントを空振りさせることはできます。 後記コードはいかがでしょうか。 Option Explicit Dim MyFlg As Boolean Private Sub Worksheet_Activate() MyFlg = False End Sub Private Sub 初期設定() MyFlg = True 'ここでSpinButton1.Enabled = False を入れてもグレーアウトするのみでChangeイベントは発生する Dim N As Long N = 20 SpinButton1.Value = N '↑TextBox1.Valueが<>Nの時でも 'ここでChangeイベントに飛ばさない方法はあるでしょうか? MyFlg = False End Sub '↓通常はこの動作 Private Sub SpinButton1_Change() If MyFlg = True Then Exit Sub MsgBox "イベント 起きたよ" TextBox1.Value = SpinButton1.Value 'さらにこのあと数値増減による処理有り End Sub
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
#2です。#2では,難しいことを言ってしまったが、個人的興味でやってみた。シートのセルの値を決めるために使うなら、参考に。 こういうのが普通に予想される使い道では? しかし直接数値を打ち込む方が早い。スピンボタンの用途について、小生は貴人的に、懐疑的です。 ・1列(下記の例ではB列)の連続複数セル(2-10行)に、セルの値を「入力する」!目的の場合 ・隣の列にボタンが表示されます。これ以外を考え付かなかった。 ーーー Sub test01() Worksheets("Sheet1").DrawingObjects.Delete For i = 2 To 10 t = Cells(i, "B").Top l = Cells(i, "B").Left h = Cells(i, "B").Height w = Cells(i, "B").Width Set sp = Worksheets("Sheet1").Spinners.Add(l + w, t, w / 3, h) sp.LinkedCell = "$B$" & i sp.Value = 1 sp.SmallChange = 1 sp.Max = 20 Next i End Sub ’=== ・Worksheets("Sheet1").DrawingObjects.Deleteは、一部を変えて、テスト時用には、便利です。 ・sp.LinkedCell = "$B$" & i は、他にスマートな書き方があるかも。
お礼
再度のご説明ありがとうございました。 今回のスピンボタンはセルの値を決めるためではないのですが、おっしゃることは理解できました。 コントロールをシートのセルにリンクさせるとか、動的に配置させるとかいうときの方法として非常に役に立ちそうです。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
初心者で勉強中なのだろうが、どういう場面で使う、使えるのか、社会経験やシステム経験がないあっても 意識しないと、勉強しても仕方がないと思う。 スピンボタンはクリックした都度 シートモジュールで Private Sub SpinButton1_Change() MsgBox "MOVED 値は" & SpinButton1.Value End Sub で捉えられるが、押した都度捉えて、何かをするのか?値変動で変化する、グラフ画像などで、変化を 楽しみたい、などなら考えられるかもしれないが、普通は別に入力(利用)の最終のタイミングの VBAの箇所で、その最終の値で、何か処理をするものと違うかな。 その為には、入力終了のコマンドボタンのようなものを作って置き、それの押し下げのタイミングでスピンボタンの値を取るのでは。だからChangeイベントはあるにしても、普通は使わないのではないか? ーー このイベントの反応の抑止は、 標準モジュールなどで Sub test01() Worksheets("Sheet1").SpinButton1.Enabled = False End Sub とやるが、ブックを開いたときのTRUEにして、何かの使い終わった段階でFalse にするのでは。 1回だけ有効というなら Private Sub SpinButton1_Change() MsgBox "MOVED 値は" & SpinButton1.Value Worksheets("Sheet1").SpinButton1.Enabled = False End Sub は「あり」だろうが、実用上は、あり得ない。 == またシートにコントロールを張り付けるのは、用途的に限られ、普通は UserFormの上で使うのが主流だと思う。 == イベントの抑止は、イベントモジュール以外!で(VBAで)記述するのが普通ではないか。 ブックのopenの初期化のところや、用済みが決まる標準モジュール中のVBAコードの中などで。 === 上記は見当はづれという惧れもあるが、上記を読んで再考して、 スピンボタンで、どういうことをしたいのか、冷静に考えて、文章で質問に補足でもしたらどうか。
お礼
詳細なご説明ありがとうございました。 何点かのご指摘心に留めておきます。 『スピンボタンで、どういうことをしたいのか、冷静に考えて』と感じさせてしまいましたこと、大変失礼致しました。問題点を具体的に記述していないので冒頭の『勉強しても仕方がない』と言われることになったと感じています。大変申し訳ありませんでした。 私がやろうとしているのは『押した都度捉えて』その数字をもとに計算させるプログラムなのですが、自分が直面していた問題点は別の方法で一応クリアされたために具体的に問題点を書けませんでした。 しかし今後のことを考えて質問を投稿した次第です。 知りたかったのは、『コードで操作してもイベントの発生を止める方法があるか』と言うことで、直面したSpinButtonのChangeイベントを使って質問を投稿した次第です。 提示いただいたコードでもChangeイベントを発生させないようにはできませんでしたが、質問の仕方が悪いようなので今回の質問はこれで終了にします。 ご検討いただきありがとうございました。
- kkkkkm
- ベストアンサー率66% (1719/2589)
初期設定()の中で Application.EnableEvents = False を利用して試してみてください。 イベントを無効にして処理を高速化する https://hensa40.cutegirl.jp/archives/6182
お礼
お礼が届いていないようなので改めて再送します。 次の回答者様のお礼の中に書きましたが、本質問は終了させていただきます。 ----------------- ご回答ありがとうございました。 『初期設定()の中で Application.EnableEvents = False』 を試してみましたがやはりSpinButtonのChangeイベントは発生しました。 理由はわかりません。 使用方法をもう少し理解する必要がありそうです。
お礼
ご回答ありがとうございました。 Changeイベントの停止ができなくても、プログラムを飛び越えることによってその動作を避けており、私が望んでいたことが実現できていることを確認しました。 『フラグを使って空振りさせる』このやり方、いろんなところに使えそうで覚えておきたいと思います。 ありがとうございました。