• ベストアンサー

【ExcelVBA】commandButtonをクラスモジュールで制御するには

お世話になります。 エクセルVBAで、ワークシートに置いたコマンドボタンの制御を、クラスモジュールから 行いたいと考えています。 制御といっているのはボタンの使用可不可、イベントの実行などです。 いろいろ調べてみたのですが、フォームからのイベントをクラスモジュールで行っているのは 見つけたのですが、ワークシート上に直接配置したボタンなどの制御は見つけることが出来ませんでした。 使用しているEXCELにバージョンは2003です。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

出来ますが 必要なプロパティの公開などが結構面倒ですよ # コードの字下げには全角スペースを使用しています ClassモジュールをMyButtonとして作成 Dim WithEvents objBtn as MSForms.CommnadButton Public Event Click() Private Sub Class_Initialize()   ' クラスモジュールとシート上のコマンドボタンをつなぐ   Set objBtn = ActiveSheet.Shapes("CommandButton1").DrawingObject.Object End Sub Private Sub objBtn_Click()   ' ボタンが押されたときに呼び出されるプロシージャ RaiseEvent Click   ' Clickイベントを呼び出してユーザーのBtn_Clickなどを呼び出す End Sub   ' Enabledプロパティの公開 Public Property Let Enabled(bValue As Boolean)   ' 左辺の場合   objBtn.Enabled = bValue End Property Public Property Get Enabled() As Boolean   ' 右辺の場合   Enabled = objBtn.Enabled End Property といった具合にします シートモジュールなどで Dim WithEvents MyBtn as myButton Sub Init()   Set MyBtn = New myButton   myBtn.Enabled = True End Sub Sub MyBtn_Click()   MsgBox "Classモジュールからの呼び出し " & myBtn.Enabled   myBtn.Enabled = False End Sub といった具合です

その他の回答 (1)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

リンク先にワークシート上に動的に配置したコントロールの配列の制御方法が回答されています。予め配置したコントロールなら、ワークシートのActivateイベントなどにクラス生成を記述しても良いと思います。 ご参考まで。 http://okwave.jp/qa4033874.html

関連するQ&A

  • クラスモジュール

    私は5年位vbaをやっていますが 標準モジュールとフォームモジュールしか使った事が有りません。 エクセルだったらシートモジュールはあります。 クラスモジュールの存在は知って、 学ぼうと思ったのですが 意味がよくわからない為挫折しました。 でも今自分がやりたい事はクラスモジュールがなくても出来ています。 クラスモジュールを学んで使うと もっと作業が捗るのでしょうか? クラスモジュールを使う事のメリットを教えていただけますか?

  • ExcelVBAのユーザフォームに関する質問です

    エクセル画面のシート1にユーザフォームを呼び出して、そのユーザフォームに設置してあるコマンドボタンを 押下するといくつかのセルの情報をテキストファイルに書き出すプログラムを作ってます。 例えば、 Private Sub CommandButton1_Click() End Sub の間にテキストファイル作成のコードを記述すればうまくいくとは思うのですが、現段階でテキストファイル作成の関数を シート1のワークシートモジュールにprivateな関数として書き込んであります。 その関数の中の引数などもprivateな変数としていくつか宣言してあり、改めて標準モジュールに関数を書き換えて、そこから ボタンイベントの中で呼び出すように作り変えるのは作業として大変に感じられました。 そこで無理かとも思うのですが、シート1のワークシートモジュールの中でコマンドボタンが押されたというイベントを拾って、 そこでファイル作成の関数を呼び出すといった作りに換えることは可能なのでしょうか? 例えばユーザフォーム内に設置したラベルは Userform1.Label1.Top = Userform1.Label1.Top + 10 といったように位置の変更がシート1から制御できたりしますが、そのような要領でできないものなのかなと思いました。 初心者なもので的外れな質問をしてしまっているかもしれませんが、ご容赦ください。 詳しい方がいらっしゃれば、ご教授お願いいたします。

  • フォームモジュールが作られない

    アクセスです。 新規でフォーム1を作成し、何もしないで(いじらないで)保存し、 VBE画面でフォーム1のForm_Loadイベントにコードを記述しようと思っても、  画像のようにフォームモジュールがありません。 フォームのデザインビューから適当に何かのイベントプロシージャーのボタンを押せば、 フォームモジュールが生成されます。 これは仕様でしょうか? エクセルは最初からシートモジュールやブックのモジュールがありますよね。

  • クラスモジュールを使わないとできないこと

    エクセル、アクセスでvbaを利用しています。 現在はすべて標準モジュールに記載しているのですが 「クラスモジュールを使わないとできないこと」もあるのでしょうか? クラスモジュールの使い方、必要性がいまいちわかりません。 まだ初心者な為複雑なコードは作っていません。 よろしくお願いします。

  • ExcelVBAでユーザーフォームが勝手に閉じてしまいます。

    ExcelVBAでユーザーフォームが勝手に閉じてしまいます。 ExcelVBAを独学で始めてまだ2週間足らずの超初心者です。 Excelワークシートにコマンドボタン配置してそのコマンドボタンを押すとユーザーフォーム1が開き、ユーザーフォーム1に配置してあるリストボックスからリストをダブルクリックで選択すると、ユーザーフォーム2が開くように設定しています。ただ、ユーザーフォーム1のリストをダブルクリックして選択した時点でユーザーフォーム1が勝手に閉じてしまいます。ユーザーフォーム1を勝手に閉じさせないでコマンドボタンで閉じるようにしたいのですがどうしたらよいのでしょうか。レベルの低い質問かもしれませんが困っています。宜しくお願い致します。

  • クラスモジュールを使う事によって何が出来るようにな

    クラスモジュールを使う事によって何が出来るようになるのですか? 私は今標準モジュールとフォームモジュールでしかコードを書いた事がないのですが クラスモジュールの使い方やクラスモジュールにコードを書くことによって出来ることがわかりません。 今の所、クラスモジュールを使わなくても業務が問題なく遂行されているのですが クラスモジュールを使う事によってどんなメリットがあるのでしょうか? エクセルです。

  • ExcelVBA2010 マクロが動作しない

    Excel2010のVBAについて質問します。 ブックAとブックBがあり、ブックAにはVBAのモジュールの記述がります。 そのブックAの中にあるシート1にコマンドボタンを作成し、このボタンにモジュールが登録されています。 ブックAを起動すると、ブックAの中にあるシート1をブックBにコピーします。 ブックBにコピーされたシート1のコマンドボタンに登録されているボタンをクリックすると、ブックAのVBAのモジュールが起動され動作されるはずですが、なぜかブックB内のシート1のコマンドボタンのモジュール先がブックAでは無くブックB内のリンク先に変更されてしまい、VBAが動作しません。 パソコンAでは動作し、パソコンBでは上記のエラーになってしまいます。 Excel本体の設定等を見比べましたが、一向にわかりません。 どうかご教授をお願いいたします。

  • エクセルVBA コントロールの制御

    エクセルのシート上にコマンドボタンを貼り付けています。このシートを縦横にスクロール移動してもコマンドボタンは常に同じ位置(たとえば画面中央)に在るようにプロパティかVBAで制御できないでしょうか。 エクセルは2003Pro、WindowsはXpProです。

  • EXCELVBAからVB6.0への制御の戻し方

    EXCEL VBAに関する質問です。 1.VB6.0からEXCELファイル(test.xls)を開く 2.VBAにて決定ボタンをEXCELに作成、表示 3.test.xlsを編集する 4.決定ボタンを押すと編集していたtext.xlsを 保存し、選択しているSHEETをVBに返す 5.VBに制御を戻す 上記のことを行いたいと考えています。 4.5.についてのやりかたがわからないので お教えいただければと思います。 よろしくお願いします。 :とりあえず VB側にPUBLIC FUNCTION BACK_FROM_EXCEL() というのを作って VBA Private Sub BTN_KETTEI() Call BACK_FROM_EXCEL END SUB という感じで試してみたのですが・・・ 案の定だめでした。

  • アクセスで「モジュールがありません」となってしまいます

    ACCESS2000を使用しています。 メニュー用のフォームに、データ照会用のフォームを 呼び出すコマンドボタンを追加し、フォームビューに切り替え 試しにクリックしていみたら実行時えら'2001';となりました。 どうみても記述に間違いはないとおもわれるのですが、そうこう しているうちに」ほかのイベントプロシージャを設定してある コマンドボタンをクリックすると「モジュールがありません」 (こうなる前までは正常に動作していました)となって動作 しなかったり、照会用のフォームにいたってはデザインビューで も開かなくなってしまいました。 元に戻すことはできるでしょうか? 助けてください。

専門家に質問してみよう