Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2003)
2つのトグルボタンの押下状態をお互いに切りかえる方法
投稿日時: 20/01/07 13:03:25
投稿者: takodo

2つのトグルボタン[tBtn順] [tBtn逆] を作ります。
片方をクリックすると、押下状態となり、もう片方は、押されていない状態にしたいです。
次のようなコードを書いてみました。
トグルボタンのtrue,false を切りかえると、クリックイベントが発生するようなので
マウスダウンイベントで処理しようと考えました。
MsgBoxで、処理の過程を表示すると、想定どおりの動きをします。
しかし、MsgBoxをコメントアウトして、処理の過程を表示しないと
片方のトグルボタンを押しても、押下状態になりません。
 
Q1.何故、MsgBoxで処理の過程を表示させたときと、表示させないときの動作が異なるのでしょうか。
 
Q2.目的のような動作をするためにはどのように直せば良いのでしょうか。
 
Q3.また、アクセスのトグルボタンでは、オプショングループでまとめておけば、
そのオプショングループ内のトグルボタンの値が、オプショングループの値として用いられます。
また、そのオプショングループ内のトグルボタンは、その値を変えておけば自動的に
1つだけのトグルボタンが押下状態となります。
エクセルでは、アクセスのようにオプショングループにまとめることはできないのでしょうか。
 
おわかりになる方見えましたら、よろしくご教授お願いいたします。
 
 
Private Sub tBtn順_Click()
    'MsgBox "トグルボタンが順が押されました。"
    'Debug.Print "トグルボタンが順が押されました。"
End Sub
Private Sub tBtn逆_Click()
    'MsgBox "トグルボタンが逆が押されました。"
    'Debug.Print "トグルボタンが逆が押されました。"
End Sub
 
Private Function chk_tBtn(this As ToggleButton)
    Me.tBtn順.Value = False
    Me.tBtn逆.Value = False
    this.Value = True
End Function
 
 
Private Sub tBtn順_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    'MsgBox "トグルボタン順。マウスダウン。"
    'Debug.Print "トグルボタン順。マウスダウン。"
    Dim tmp
    tmp = chk_tBtn(Me.tBtn順)
End Sub
 
Private Sub tBtn順_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    'MsgBox "トグルボタン順。マウスアップ。"
    'Debug.Print "トグルボタン順。マウスアップ。"
 
End Sub
Private Sub tBtn逆_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    'MsgBox "トグルボタン逆。マウスダウン。"
    'Debug.Print "トグルボタン逆。マウスダウン。"
    Dim tmp
    tmp = chk_tBtn(Me.tBtn逆)
End Sub
 
Private Sub tBtn逆_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    'MsgBox "トグルボタン逆。マウスアップ。"
    'Debug.Print "トグルボタン逆。マウスアップ。"
End Sub
[/code]

回答
投稿日時: 20/01/07 14:18:41
投稿者: simple

イベントプロシージャがなぜこんなにたくさん必要なのか不明なので、
原因の追及はさておいて、こんな風にするとよいのでは?
 

Option Explicit
Dim flag As Boolean
Private Sub tBtn順_Click()
    If flag Then Exit Sub
    flag = True
    Me.tBtn逆.Value = False
    flag = False
End Sub

Private Sub tBtn逆_Click()
    If flag Then Exit Sub
    flag = True
    Me.tBtn順.Value = False
    flag = False
End Sub

そもそも、二者択一なら、普通は、グループ化された
オプションボタンを使いませんか?

回答
投稿日時: 20/01/07 14:55:55
投稿者: WinArrow
投稿者のウェブサイトに移動

二者択一の条件に、なぜトグルボタンを使用するのでしょうか?
オプションボタンで充分機能すると思いますが・・・・
こんなにややこしいこと考えなくてすみます。
 
もっとシンプルにしましょう。

回答
投稿日時: 20/01/07 15:05:23
投稿者: WinArrow
投稿者のウェブサイトに移動

どうしてもトグルボタンで・・・・とお望みなら
 
Private Sub tgl逆_Click()
    With Me.tgl逆
        If .Value Then
            Me.tgl順.Value = False
        End If
    End With
End Sub
 
Private Sub tgl順_Click()
    With Me.tgl順
        If .Value Then
            Me.tgl逆.Value = False
        End If
    End With
End Sub
 
これではダメ?

回答
投稿日時: 20/01/07 15:41:29
投稿者: sk

引用:
トグルボタンのtrue,false を切りかえると、クリックイベントが発生するようなので
マウスダウンイベントで処理しようと考えました。
MsgBoxで、処理の過程を表示すると、想定どおりの動きをします。
しかし、MsgBoxをコメントアウトして、処理の過程を表示しないと
片方のトグルボタンを押しても、押下状態になりません。

トグルボタンの MouseDown イベント(で呼び出している chk_tBtn のコード)で
変更されたトグルボタンの値が、その後に発生する MouseUp イベントが
完了した後に反転する(=本来の変更操作によって元に戻る)ため。
 
引用:
Q1.何故、MsgBoxで処理の過程を表示させたときと、
表示させないときの動作が異なるのでしょうか。

Click イベントにメッセージボックスの表示を割り込ませたことによって
イベント遷移の流れや順番が変わった結果、(処理全体としては)
トグルボタンの MouseDown イベントの完了時点でコードの実行が終了し、
トグルボタンの MouseUp 以降のイベントが発生していない
(本来の変更操作が事実上キャンセルされている)ため。
 
引用:
Q2.目的のような動作をするためにはどのように直せば良いのでしょうか。

トグルボタンを使うことに拘る理由がないなら、
フレームコントロールとオプションボタンコントロールを
使用なさればよいでしょう。
 
引用:
Q3.また、アクセスのトグルボタンでは、オプショングループでまとめておけば、
そのオプショングループ内のトグルボタンの値が、オプショングループの値として用いられます。
また、そのオプショングループ内のトグルボタンは、その値を変えておけば自動的に
1つだけのトグルボタンが押下状態となります。
エクセルでは、アクセスのようにオプショングループにまとめることはできないのでしょうか。

MSForms において、フレームコントロール上に配置されたトグルボタンは
択一形式の入力に対応していません(そういう仕様)。

回答
投稿日時: 20/01/07 15:42:31
投稿者: よろずや

トグルボタンが2個だけなら、こんな感じ。
 
Private Sub tBtn逆_Click()
    Me.tBtn順.Value = Not Me.tBtn逆.Value
End Sub
 
Private Sub tBtn順_Click()
    Me.tBtn逆.Value = Not Me.tBtn順.Value
End Sub

投稿日時: 20/01/07 19:05:09
投稿者: takodo

よろずやさん、早速のレスありがとうございます。
極めて快適動き、単純なコードで、恐れ入りました。
これ、しっかり使えます。
投稿時の質問へハッキリと記載しなくて誤解を与えてしまうのも当たり前ですが、
最終的には、アクセスのオプショングループでの動作を目指しています。
つまり、複数のトグルボタンがグループ内で唯一選択されている状態です。
初めから、その様に書けよ。
と、いわれそうです。
まとまりきらないでの投稿。ご容赦願います。
とても参考になりました。ありがとうございました。

投稿日時: 20/01/07 19:16:52
投稿者: takodo

skさん。とてもわかりやすい解答をありがとうございます。
私、アクセスのVBAは長期にわたり扱ってきましたが、
エクセルのVBAは、エクセルの単純な操作自体からしてほとんど扱ってきませんでした。
同じ、VBAだからコントロールの挙動など類似なものだろうと思ってコーディングを始めました。
しかし、どうも違う。見た目に同じコントロールでもかなり違う。
 
そんななかで
MsgBoxにかかわる挙動の説明には、その明快な説明によりすっきりしました。
 
>フレームコントロールとオプションボタンコントロールを使用なさればよいでしょう。
そのとおりですよね。ただ、アクセスでトグルボタンの扱いがとても快適だったものでその操作性の良さにいつまでも捕らわれてしまっています。
 
>MSForms において、フレームコントロール上に配置されたトグルボタンは択一形式の入力に対応していません(そういう仕様)。
ハイ。そうですか。と、いうしかにようですね。
明快な解答をありがとうございます。

投稿日時: 20/01/07 19:21:13
投稿者: takodo

 WinArrowさん。丁寧なレスをありがとうございます。
きれいなコードの紹介をありがとうございます。
当初の投稿時に2つのトグルボタンと特定してしまった形にしまして申し訳ありません。
2つができれば、3つ以上も同様にできると考えて単純化しすぎて投稿してしまいました。
ご提示いただいたコードはとても参考になりました。
ありがとうございました。

投稿日時: 20/01/07 19:24:51
投稿者: takodo

 WinArrowさん、ご回答ありがとうございます。
>オプションボタンで充分機能すると思いますが・・・・
そのとおりですよね。
トグルボタン上に、その機能を表示できるという形を頭に描いてしまったもので、
先の、お礼にも書かせて頂いたようにアクセスでは、簡単にできたものですの
その様な表示形式にこだわってしまいました。

投稿日時: 20/01/07 19:28:22
投稿者: takodo

simpleさん、ご丁寧な解答をありがとうございます。
先のお礼にも書かせて頂いたですが、やりたかったことは複数のトグルボタンについての唯一選択の方法です。
2つのオブジェクトに対する操作がわかれば、3つ以上も簡単かな。
と、思ったですが。2つ、と、3つ以上は違ってきますよね。
ご紹介頂いたコードはとても参考になりました。
ありがとうございました。

回答
投稿日時: 20/01/07 20:18:28
投稿者: WinArrow
投稿者のウェブサイトに移動

私が作成したアプリ(カレンダーフォーム)で使っている
コードを紹介します。
 
Option Explicit
 
 
Dim datflag As Boolean
Dim OldCname As String
 
Private Sub tgl01_Click()
    Call tglCtrl_Proc(Me.tgl01.Name)
End Sub
 
Private Sub tgl02_Click()
    Call tglCtrl_Proc(Me.tgl02.Name)
End Sub
 
Private Sub tgl03_Click()
    Call tglCtrl_Proc(Me.tgl03.Name)
End Sub
 
 
Public Sub tglCtrl_Proc(cName As String)
Dim tglCtrl As MSForms.ToggleButton
 
    Set tglCtrl = Me.Controls(cName)
    If tglCtrl.Value = True Then
        If OldCname <> "" Then
            If tglCtrl.Name <> OldCname Then
                Me.Controls(OldCname).Value = False
            End If
        End If
        OldCname = tglCtrl.Name
    End If
End Sub
 
※tgl01_Click,tgl02_Click,tgl03_Clickは、全部で42個あるので、クラスモジュールで対応しています。
 

回答
投稿日時: 20/01/07 20:26:29
投稿者: WinArrow
投稿者のウェブサイトに移動

追加コメント
 
2つのトグルボタンの場合は、別のトウルボタンをTRUEにすればよいが
複数のトグルボタンを操作する場合、
TRUEのトグルボタンをFALSEにしたとき、
他のどのトグルボタンをTRUEにするのか、わかりませんので
組み込んでありません。

回答
投稿日時: 20/01/08 00:58:01
投稿者: hatena
投稿者のウェブサイトに移動

takodo さんの引用:

最終的には、アクセスのオプショングループでの動作を目指しています。
つまり、複数のトグルボタンがグループ内で唯一選択されている状態です。

 
ユーザーフォーム上にフレームを配置します。
そのフレーム上にトグルボタンを任意数配置します。
 
Option Explicit
Dim flgEvent As Boolean

Private Sub tglSelect()
    If flgEvent Then Exit Sub
    flgEvent = True
    
    Dim frm As MSForms.Frame
    Set frm = Me.ActiveControl
    Dim tgl As MSForms.ToggleButton
    Set tgl = frm.ActiveControl
    
    If tgl.Value Then
        If frm.Tag <> "" Then
            If frm.Tag <> tgl.Name Then
                Me.Controls(frm.Tag).Value = False
            End If
        End If
        frm.Tag = tgl.Name
    Else
        tgl.Value = True
    End If
 
    flgEvent = False
End Sub

Private Sub ToggleButton1_Click()
    Call tglSelect
End Sub

Private Sub ToggleButton2_Click()
    Call tglSelect
End Sub

Private Sub ToggleButton3_Click()
    Call tglSelect
End Sub

Private Sub ToggleButton4_Click()
    Call tglSelect
End Sub

 
上記のコードで、アクセスのオプショングループでの動作とほぼ同じになります。
複数のフレームを配置しても、各フレーム毎に択一選択になります。
 
ボタン数が多くなればクラスモジュールにするといいでしょう。

回答
投稿日時: 20/01/08 09:40:54
投稿者: simple

ご返事拝読。
> 先のお礼にも書かせて頂いたですが、
> やりたかったことは複数のトグルボタンについての唯一選択の方法です。
> 2つのオブジェクトに対する操作がわかれば、3つ以上も簡単かな。
> と、思ったですが。2つ、と、3つ以上は違ってきますよね。

 
そう言われても困る。
最初からそのように説明してもらわないと、そんな話には読めないですよ。
 
そもそもですが、トグルとは2値を管理するものだから、
「順」と「逆」は、ひとつのトグルボタンで実現するんじゃないですか?
押したらCaptionが「逆」となるような。
 
複数から選択するなら、まさにオプションボタンの機能そのものです。
アクセスがどうかは知らないが、Excelなんだから、Excelに備わった機能を
使った方がよいでしょう。ご自分だけで使うならご自由ですが、
他のユーザーもいるなら、Excelの流儀に合わせた方がよいと思います。

回答
投稿日時: 20/01/08 11:26:32
投稿者: WinArrow
投稿者のウェブサイトに移動

 
前レスで紹介したコードの簡略版
  
・前レスでは、サブルーチンに引数(トグルボタン名)を設けてありましたが、
サブルーチンへの引数を省きました。
  
Option Explicit
   
 Dim OldCname As String
     
  Private Sub tgl01_Click()
      Call tglCtrl_Proc
  End Sub
     
  Private Sub tgl02_Click()
      Call tglCtrl_Proc
  End Sub
     
  Private Sub tgl03_Click()
      Call tglCtrl_Proc
  End Sub
     
     
  Public Sub tglCtrl_Proc()
  Dim tglCtrl As MSForms.ToggleButton
     
      Set tglCtrl = Me.ActiveControl
      If tglCtrl.Value = True Then
          If OldCname <> "" Then
              If tglCtrl.Name <> OldCname Then
                  Me.Controls(OldCname).Value = False
              End If
          End If
          OldCname = tglCtrl.Name
      End If
  End Sub
 
 

回答
投稿日時: 20/01/08 16:05:06
投稿者: 角田
投稿者のウェブサイトに移動

参考までに汎用ツールを紹介しておきます。
 
『ラベルコントロール & クラスモジュール』でトグルボタンを代替できます。
 
AddinBox/トグルラベル クラスモジュール
http://addinbox.sakura.ne.jp/Excel_Tips10.htm
 
clsBpcaTglLblクラスモジュールは汎用化してありますので
クラスモジュールのマクロコードを変更する必要は一切ありません。
 
排他機能 および ON/OFF時の自動カラー変更 などが備わっていますので
パラメータ指定でご希望の動作は実現できますよ。
上記サイト内の動画リンクでサンプル動画が視れます。

投稿日時: 20/01/08 16:28:35
投稿者: takodo

simpleさん、重ねてのレスをありがとうございます。
>Excelなんだから、Excelに備わった機能を使った方がよいでしょう。
そのとおりですよね。
そもそもVBAでの処理ということで基本的にはアクセスと同じような処理ができるだろうという気持ちで取り組んでいましたので。どうも、かなり違うようで、とまどっています。
気持ちを切りかえます。
 
hatenaさん。
ありがとうございます。
これだ。と、思い早速使ってみましたが、
>ユーザーフォーム上にフレームを配置します
フレームと、グループボックスの違いがどうもわからない。
そのためか
>Set tgl = frm.ActiveControl
のところでActiveControlのようなオブジェクトは無いというようなエラーが出て動作しないでいます。
なんとか、操作方法、及びその原因がわかるよういろいろと調べています。
 
角田さん。レスをありがとうございます。
早速試してみようと取り組みましたが、即理解するには難しそうでした。
じっくりと、取り組ませて頂きます。
どうも、ありがとうございました。
 
 

回答
投稿日時: 20/01/08 17:31:47
投稿者: hatena
投稿者のウェブサイトに移動

takodo さんの引用:

>ユーザーフォーム上にフレームを配置します
フレームと、グループボックスの違いがどうもわからない。
そのためか
>Set tgl = frm.ActiveControl
のところでActiveControlのようなオブジェクトは無いというようなエラーが出て動作しないでいます。

ツールボックスに「フレーム」というのがありますので、それをユーザーフォーム上に配置して、
その上にトグルボタンを配置してください。
 
こちらでサンプルを作成して動作確認してますので動作するはずです。

投稿日時: 20/01/08 18:23:42
投稿者: takodo

hatena さんの引用:

ツールボックスに「フレーム」というのがありますので、それをユーザーフォーム上に配置して、
その上にトグルボタンを配置してください。

ツールボックスに「フレーム」が見当たらなくて当惑しています。
エクセル2003です。
どうも仕様が異なるのか。
そもそも、私が全く見当違いのことをしているのか。
ツールボックスには、以下のものがあります。
「でアインモード」「プロパティ」「コードの表示」「チェックボックス」「テキストボックス」「コマンドボタン」「オプションボタン」「リストボックス」「コンボボックス」「トグルボタン」「スピンボタン」「スクロールバー」「ラベル」「イメージ」「コントロールの選択」「ツールバーオプション」
フレームはありません。
 
フォームの方には、
「ラベル」「エディットボックス」「グループボックス」「ボタン」「チェックボックス」「オプションボタン」「リストボックス」「コンボボックス」「リストエディットコンボボックス」「ドロップダウンコンボボックス」「スクロールバー」「スピンボタン」「コントロールノプロパティー」「コードの編集」「グリッド」「ダイアログの実行」「ツールバーオプション」
となっています。
 
かなり基本的なところで迷走しているのではないかというような気がします。
なんとか、解決に向けて頑張ります。
 

回答
投稿日時: 20/01/08 18:31:34
投稿者: sk

ユーザーフォーム上にトグルボタンを配置されているのではなく、
任意のワークシート上にトグルボタンを配置されているのでしょうか。

投稿日時: 20/01/08 18:39:50
投稿者: takodo

sk さんの引用:
ユーザーフォーム上にトグルボタンを配置されているのではなく、
任意のワークシート上にトグルボタンを配置されているのでしょうか。

はい。そうです。

回答
投稿日時: 20/01/08 19:51:28
投稿者: hatena
投稿者のウェブサイトに移動

takodo さんの引用:
sk さんの引用:
ユーザーフォーム上にトグルボタンを配置されているのではなく、
任意のワークシート上にトグルボタンを配置されているのでしょうか。

はい。そうです。

ワークシート上でしたか。
なら、フレームはないみたいですね。
私の回答はユーザーフォーム限定です。

回答
投稿日時: 20/01/08 19:53:19
投稿者: WinArrow
投稿者のウェブサイトに移動

takodo さんの引用:
sk さんの引用:
ユーザーフォーム上にトグルボタンを配置されているのではなく、
任意のワークシート上にトグルボタンを配置されているのでしょうか。

はい。そうです。

 
そうなの?
 
今まで、ユーザーフォームのトグルボタンだと思ってレスしていました。
提示したコードは、使えません。

回答
投稿日時: 20/01/08 19:57:59
投稿者: WinArrow
投稿者のウェブサイトに移動

ワークシート上のトグルボタン
でしたら、コードはべつですが、
右クリックのシュートカットメニューに「グループ化」というメニューがありましょ。

回答
投稿日時: 20/01/08 20:19:03
投稿者: mattuwan44

ここまできてシート上の話と判明するとは。。。
まぁ、仕方ないといえば仕方ないかもですが、
回答側の労力を思うとトホホですね><
 
機能はオプションボタン、
見た目はトグルボタンでやりたいんですか?
 
ならば、
オプションボタンの上にトグルボタンを配置しリンクさせればいいのでは?
 
2番のトグルボタンクリック→2番のオプションボタンをTrue→チェックボックスを巡回して、
対応するオプションボタンの状態を対応するトグルボタンに写す
 
みたいな流れが作りやすくないですか?

投稿日時: 20/01/09 08:41:30
投稿者: takodo

WinArrow さんの引用:

そうなの?
 今まで、ユーザーフォームのトグルボタンだと思ってレスしていました。
提示したコードは、使えません。

どうも、私AccessもExcelもVBAで扱うツールオブジェクトは同様なものと
考えてコーディングにかかったのですが、
かなり様子が異なるようで。
 
WinArrow さんの引用:

ワークシート上のトグルボタン
でしたら、コードはべつですが、
右クリックのシュートカットメニューに「グループ化」というメニューがありましょ。

グループ化とフレーム内へ納めることは違うことの様な気がして。
 
いろいろと教えて頂き、迷惑をおかけしましたが、
かなり、エクセルVBAで扱うツールについて理解できてきたような気がします。
自分で、もう少し一から調べ直します。
ありがとうございました。

投稿日時: 20/01/09 08:52:10
投稿者: takodo

mattuwan44 さんの引用:
ここまできてシート上の話と判明するとは。。。
まぁ、仕方ないといえば仕方ないかもですが、
回答側の労力を思うとトホホですね><
 
機能はオプションボタン、
見た目はトグルボタンでやりたいんですか?
 
ならば、
オプションボタンの上にトグルボタンを配置しリンクさせればいいのでは?

どうも基本的なところがわかっていなくて迷惑をかけてしまったようで。
その分、お陰といっては何ですが、かなりわかってきたつもりです。
ユーザーフォームと、ワークシート上のツールオブジェクトの違いとか、
そもそも、ユーザーフォームなんて知りませんでした。
ワークシートとは別のところでコントロールを配置しているという画像は見かけていましたが、
それほど、意味のあるもののように思えませんでした。
 
コントロールツール一覧があるから、そこからオブジェクトを選択して
ワークシート上のツールオブジェクトへ配置しアクセスのようにコーディングすれば良い。
と、いうことでとりかかっていました。
 
多くの方に、こんなに早いレスをたくさん頂き感謝しています。
本当にありがとうございます。
お陰で、私なりに、大きく前進できた思いで一杯です。

回答
投稿日時: 20/01/09 10:13:46
投稿者: sk

hatena さんの引用:
ワークシート上でしたか。
なら、フレームはないみたいですね。

takodo さんの引用:
ツールボックスには、以下のものがあります。
デザインモード」「プロパティ」「コードの表示」「チェックボックス」「テキストボックス」「コマンドボタン」「オプションボタン」「リストボックス」「コンボボックス」「トグルボタン」「スピンボタン」「スクロールバー」「ラベル」「イメージ」「コントロールの選択」「ツールバーオプション」

1. [コントロールの選択]ダイアログを開く。
 
2. 「Microsoft Forms 2.0 Frame」を選択し、
   [OK]ボタンをクリックする。
 
3. 細線十字カーソルのまま、ワークシート上の任意の位置で
   マウスを左クリック(またはドラッグアンドドロップ)し、
   フレームコントロールを挿入する。
 
4. デザインモードのまま 3 で挿入したフレームコントロールを選択し、
   マウス右クリック -> [フレーム オブジェクト] -> [編集]をクリックする。
 
5. ツールボックスを使ってフレーム上にトグルボタンを任意の数だけ挿入する。
 
-----------------------------------------------------------------
 
という手順で「トグルボタンを子コントロールとするフレーム」を
ワークシート上に挿入することが一応は出来ますが、この場合
各トグルボタンのイベントを検知するには WithEvents 変数を使う必要が
あります。
 
「 Access のオプショングループでの動作」を Excel 上で疑似的に再現し、
かつそれを汎用的なコードとして落とし込みたいのであれば、既に提案が
なされているように、最終的にはクラスモジュールを使用することになるでしょう。
 
takodo さんの引用:
ユーザーフォームと、ワークシート上のツールオブジェクトの違いとか、
そもそも、ユーザーフォームなんて知りませんでした。

Office アプリケーション全般で言えば、むしろ Access が特殊なんですよ。
( Access だけが VBE でユーザーフォームの作成/デザインを行なうことが出来ない)

回答
投稿日時: 20/01/09 11:42:51
投稿者: hatena
投稿者のウェブサイトに移動

ご参考までに、下記でシート状に複数コマンドボタンを配置して、それをグループ化して択一選択を表現するクラスモジュールのコード例がありますので、参考にしてください。
トグルボタンではなく、コマンドボタンの背景色を変更して選択状態を表現しています。
ここをトグルボタン用に書き換えればいいでしょう。
あるいは、ラベルにして立体表示の浮き上がり/沈み込みを切り替えて選択状態を表現するように書き換えてもいいかも。こちらの方が書き換えは簡単そうです。
 
VBA - VBAのボタンの色に関して|teratail
https://teratail.com/questions/162580#reply-243205

回答
投稿日時: 20/01/09 13:47:22
投稿者: WinArrow
投稿者のウェブサイトに移動

>そもそも、ユーザーフォームなんて知りませんでした。
 
知らないのは仕方ありませんが、
 
Accessで入力用画面を作成するのは、「フォーム」です。
(Accessには、ワークシートなんてありませんよね?)
 
Excelでは、その機能に最も近いのは、「ユーザーフォーム」です。
 
ですから、質問から、推察すると、「ユーザーフォーム」のトグルボタンだと
解釈するのは自然の流れだと思います。
 
ユーザーフォームは知らなくても
ワークシートに配置するトグルボタンは、ActiveXコントロールです。
ActiveXには、フレームというコントロールがありません。
(Accessでは、オプショングループをウイザードで定義する場合、フレームから始めます)
この段階で、VBAに行く前に、グループ化できないことに気が付くのではないだろうか?
そうすると質問の仕方も内容も全く違うものになっていたのではないでしょうか?
 

投稿日時: 20/01/09 14:11:15
投稿者: takodo

sk さんの引用:
Office アプリケーション全般で言えば、むしろ Access が特殊なんですよ。
( Access だけが VBE でユーザーフォームの作成/デザインを行なうことが出来ない)

そうなんですか。
AccessのVBAは自分なりにかなり使い込んだつもりでした。
その便利さに、エクセルを使うことはほとんどありませんでした。
エクセルは、至極簡単な集計計算をすることには用いてきましたが、
わざわざマクロなどで自動化する必要の無いような処理だけに使っていました。
 
Access が特殊なんですよ。
で、驚きでした。
教えて頂きありがとうございました。
エクセルの見方が変わります。

投稿日時: 20/01/09 14:13:34
投稿者: takodo

hatena さんの引用:
VBA - VBAのボタンの色に関して|teratail
https://teratail.com/questions/162580#reply-243205

早速見させてもらいました。
とても興味深いです。
じっくりと研究させてもらいます。
ありがとうございました。

投稿日時: 20/01/09 14:23:25
投稿者: takodo

WinArrow さんの引用:

Accessで入力用画面を作成するのは、「フォーム」です。
(Accessには、ワークシートなんてありませんよね?)
Excelでは、その機能に最も近いのは、「ユーザーフォーム」です。

このことが、お陰でわかりました。
 
WinArrow さんの引用:

ユーザーフォームは知らなくても
ワークシートに配置するトグルボタンは、ActiveXコントロールです。
ActiveXには、フレームというコントロールがありません。
(Accessでは、オプショングループをウイザードで定義する場合、フレームから始めます)
この段階で、VBAに行く前に、グループ化できないことに気が付くのではないだろうか?
そうすると質問の仕方も内容も全く違うものになっていたのではないでしょうか?

グループ化できないことに気が付きました。
そこで、方法が間違っているのか。
やり方を知らないからなのか。
と、いう方向へ行ってしまいました。
 
>ActiveXには、フレームというコントロールがありません。
このこともようやくわかりました。
 
>(Accessでは、オプショングループをウイザードで定義する場合、フレームから始めます)
もう既に作成してあるフォームを元に次を作成するということばかりしていたので
初めのことを意識しないで考えてしまう状態になっていました。
 
的外れな質問をする、こんな初心者に、このように丁寧に教えて頂きありがとうございます。
当初質問したことにも、自力でなんとか解決できる自信がつきました。