- ベストアンサー
エクセルVBAでmeに相当するものは?
コマンドボタンやラベルの自分自身の情報を得る汎用的な方法はないでしょうか。 例えばCommandButton1のCaptionを表示する場合、以下のようにコーディングしています。 Private Sub CommandButton1_Click() MsgBox CommandButton1.Caption End Sub CommandButton1.Captionと書いておりますが、CommandButton1と書かずに自分自身を指定する方法はないでしょうか? 遥か昔マッキントッシュのハイパーカードでは、自分自身の名称を得る時に「name of me」で可能でしたが、このmeに相当するものはエクセルではどのようになるのでしょうか? よろしくお願い申し上げます。
- believe_me
- お礼率82% (556/675)
- オフィス系ソフト
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 > MsgBox CommandButton1.Caption いったい、どこのボタンか判別がつきにくいです。コマンドボタンやラベルは、いくつか種類のものがあるからです。 >コマンドボタンやラベルの自分自身の情報を得る汎用的な方法はないでしょうか。 コントロールツールの場合は、ありません。 必要なら、インスタンスを設けるしかないと思いますが、あまり実務的ではありませんね。ただ、通常、入力の際には、インテリセンスがありますから、その入力自体の問題はないと思いますが。 #1 さんのActiveControl は、UserFormだけのものだと思います。 コントロールツールの場合: '---------------------------------------------------- '標準モジュール Private myCol As Collection Sub Auto_Open() Call myButtonClass_Setting End Sub Sub myButtonClass_Setting() Dim objOLE As Object Dim i As Integer Dim myClass As Class1 Set myCol = New Collection For Each objOLE In ThisWorkbook.Worksheets("Sheet1").OLEObjects If TypeOf objOLE.Object Is MSForms.CommandButton Then Set myClass = New Class1 Set myClass.myBtn = objOLE.Object myCol.Add myClass End If Next End Sub 'Class1 Public WithEvents myBtn As MSForms.CommandButton Private Sub myBtn_Click() MsgBox myBtn.Caption End Sub '---------------------------------------------------- 'なお、フォーム・ツールですと、Application.Caller が使えます。 '標準モジュール Sub MyFormButton_Click() MsgBox ActiveSheet.Shapes(Application.Caller).Name End Sub '----------------------------------------------------
その他の回答 (2)
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。 > CommandButton1と書かずに自分自身を指定する方法はないでしょうか? Me キーワードはモジュール(主に Form、Class、Sheet)自信の代替として 使用します。コントロールのレベルで Me に相当するようなキーワードは VB には用意されていないと思います。 私見ですが、その必要性を感じません。なぜなら、コードの可読性が著しく 損なわれそうな気がするからです。 ご質問の背景として考えられそうな点から回答すると... ▼コントロールの名前を入力するのが面倒 コントロールの名前を CB1 とでも短いものにすれば良いのでは? あるいは、例えば Com まで入力してから、[Ctrl] + [Space] で VBE の 入力補完機能を使えば手間は省けますよ。 ▼プロシージャに汎用性を持たせたい(共通化したい) サブプロシージャを設けて、引数で渡せば良いのでは? Private Sub CommandButton1_Click() Call Test(CommandButton1) End Sub Private Sub CommandButton2_Click() Call Test(CommandButton2) End Sub ' // サブプロシージャ Private Sub Test(ByVal Cb As MSForms.CommandButton) MsgBox Cb.Caption End Sub ご参考までに。
お礼
回答ありがとうございます。 実は既にサブモジュールは使っております。 ただし呼び出し側でCaptionをストリングに取り出してサブモジュールに渡していました。 回答していただいた方法の方が、よりすっきりしますね。
- masa_019
- ベストアンサー率61% (121/197)
こんにちは。 こんなのとか? Private Sub CommandButton1_Click() MsgBox ActiveControl.Caption End Sub
お礼
あのう・・・ コマンドボタンを作りそこに教えていただいたコードをいれて 実行すると次のエラーがでますが、そちらでは問題なく動いた のでしょうか? 実行時エラー'424': オブジェクトが必要です。
関連するQ&A
- [Q:VBA] 現在のオブジェクトの参照(JavaScriptのthisキーワードに相当するもの)
こんにちは。 Excel VBAで現在のオブジェクトの参照をすることはできますでしょうか?(JavaScriptのthisキーワードに相当するものはあるのでしょうか?) 下記のようなことをしたいのですが(コード自体に意味はありません。検証用です)。 よろしくお願い致します。 -- Private Sub CommandButton1_Click() キャプション = CommandButton1.Caption MsgBox(キャプション) End Sub Private Sub CommandButton2_Click() キャプション = CommandButton2.Caption MsgBox(キャプション) End Sub ・・・×数十個 ↓↓↓ Private Sub CommandButton1_Click() funcCaption End Sub Private Sub CommandButton2_Click() funcCaption End Sub ・・・×数十個 Sub funcCaption() キャプション = this.Caption MsgBox(キャプション) End Sub
- ベストアンサー
- Visual Basic
- 自身のコントロール名を取得するコード エクセル
シート上のアクティブエックスコントロールのコマンドボタンで、 自身のコントロール名を取得するコードを押してください。 Private Sub CommandButton1_Click() MsgBox Me.ActionControl.Name End Sub だと、エラーになってしまいます。 「CommandButton1」を返したいです
- ベストアンサー
- オフィス系ソフト
- EXCEL VBAのユーザーフォームに引数を渡す方法について
すいません、EXCEL VBAのユーザーフォームに引数を渡す方法についてご質問があります。 シート上にコマンドボタンを2つ用意する。 コマンドボタン1を押すと変数mは1 コマンドボタン2を押すと変数mは2 としてユーザーフォームを呼び出す。 Public m As Integer Private Sub CommandButton1_Click() m = 1 Call フォーム呼び出し(m) End Sub Private Sub CommandButton2_Click() m = 2 Call フォーム呼び出し(m) End Sub Sub フォーム呼び出し(m As Integer) UserForm1.Show End Sub 次にユーザフォームにコマンドボタンを1個置き、 ボタンを押したとき、mが1であれば「ボタン1」 mが2であれば「ボタン2」 とメッセージボックスを出し、ユーザーフォームを閉じる。 Private Sub CommandButton1_Click() If m = 1 Then MsgBox "ボタン2" ElseIf m = 2 Then MsgBox "ボタン2" End If Unload UserForm1 End Sub プロシージャ間の引数渡しは色々なテキストに載っているのですが ユーザーフォームに引数を渡す方法はどうも見つからず、 Private Sub CommandButton1_Click(m) としても、コンパイルエラーとなってしまいます。 よろしくご教示をお願いいたします。
- ベストアンサー
- オフィス系ソフト
- 今発生しているイベントのコントロール名を取得
エクセルです 例えば、シートにコマンドボタンを一つ設置して、クリックイベントで Private Sub CommandButton1_Click() MsgBox "CommandButton1が押されました" End Sub こうしたら、コマンドボタン1を押した時に、 "CommandButton1が押されました"が表示されますが、 CommandButton1の部分を変数みたいなのにすることはできますか? MsgBox Me.Name & "が押されました" だとシート名が取得されるし MsgBox Me.Control.Name & "が押されました" や MsgBox Me.ActionControl.Name & "が押されました" だとエラーになります。
- ベストアンサー
- オフィス系ソフト
- Excel VBAについて
Excel VBAにおいて、Sheetの選択した行によって値を表示するUserFormを変更したいと思っています。 現在以下のようにしたのですが、実行すると「SubまたはFunctionが定義されていません」というエラーが表示されます。 「Controls("UserForm" & x).Label1.Caption =」のところをどのようにしたらよいのでしょうか。 Private Sub CommandButton1_Click() If ActiveCell.Row = 5 Then UserForm1.Show x = 1 ElseIf ActiveCell.Row = 6 Then UserForm2.Show x = 2 End If End Sub Private Sub Worksheet_Selection Change(Byval Target As Range) Controls("UserForm" & x).Label1.Caption = ・・・
- ベストアンサー
- Visual Basic
- [Excel VBA]コマンドボタンの入力待ち方法
コマンドボタンの入力を待つ方法についてご教示願います、 以下に詳しい状況と、具体的な質問を記載します。 【構成】 ・ユーザーフォーム上に5つのコマンドボタン(CommandButton1~CommandButton5) 【やりたいこと】 ・CommandButton1を押したらスタート ・1ラウンドにつき1回、CommandButton2~CommandButton5のいずれかのボタンが押せる。 そして、押されたボタンが何かを毎ラウンド判定する。 これを10ラウンドまで繰り返す。 (つまり、どのボタンが押されたかを10回判定する) なお、「ボタンが押されるまでは勝手にループしないこと」。 【コード】(UserFrom1に記載。質問用として、変数名は仮に日本語にしてあります) Public 押された As Long Dim 現在のラウンド As Long Dim 最終ラウンド As Long Private Sub ラウンド処理() 最終ラウンド = 10 For 現在のラウンド = 1 To 最終ラウンド ボタン判定 Next 現在のラウンド End Sub Private Sub ボタン判定() MsgBox 現在のラウンド & ":" & 押された End Sub Private Sub CommandButton1_Click() ラウンド処理 End Sub Private Sub CommandButton2_Click() 押された = 2 End Sub Private Sub CommandButton3_Click() 押された = 3 End Sub Private Sub CommandButton4_Click() 押された = 4 End Sub Private Sub CommandButton5_Click() 押された = 5 End Sub 【詰まっている点】 ボタンの入力待ちになるような文が入っていないため、 「1:0」「2:0」「3:0」…「10:0」とmsgboxが出るだけの状態です。 (当然ですが…) VBAの 【質問】 毎ラウンドごとにボタンの入力待ちのような状態を 「できるだけこの形を崩さずに」組み込むためには、どのような処理を加えればいいでしょうか。
- 締切済み
- Visual Basic
- エクセルVBAでフォームのボタンとコントロールツールボックスのコマンドボタン
エクセルVBAでフォームのボタンとコントロールツールボックスのコマンドボタンについて教えてください。 実はこれまでフォームしか使ったことがないのですが、フォームのボタンですと、下記のように一つのプロシージャを多数のボタンから呼び出し、呼び出したボタンにより異なった指示が出来ます。 Sub test() x = Application.Caller Select Case x Case "ボタン 1" MsgBox 1 Case "ボタン 2" MsgBox 2 Case "ボタン 3" MsgBox 3 Case "ボタン 4" MsgBox 4 End Select End Sub コントロールツールボックスは Private Sub CommandButton1_Click() MsgBox 1 End Sub Private Sub CommandButton2_Click() MsgBox 2 End Sub のようにコマンドボタンごとにひとつずつ書くしかないのでしょうか?
- ベストアンサー
- オフィス系ソフト
- VBA スタック容量が足りない・・・
こんばんわ! エクセルのVBAを使った管理システムを作ろうと思うのですが、色々考えて下記のような状態にしてみたのですが、ユーザーフォームをモードレスにするとスタック容量が足りなくなります。 Sub aaa_date() If Range("a1") = 1 Then bbb_date.Show ElseIf Range("a1") = 2 Then ccc_date.Show ElseIf Range("a1") = 3 Then ddd_date.Show End If Call aaa_date End Sub bbb_date(ユーザーフォーム)に↓ Private Sub CommandButton1_Click() Range("a1") = 2 Unload Me End Sub Private Sub CommandButton2_Click() Range("a1") = 3 Unload Me End Sub ccc_date(ユーザーフォーム)に↓ Private Sub CommandButton1_Click() Range("a1") = 1 Unload Me End Sub Private Sub CommandButton2_Click() Range("a1") = 3 Unload Me End Sub ddd_date(ユーザーフォーム)に↓ Private Sub CommandButton1_Click() Range("a1") = 1 Unload Me End Sub Private Sub CommandButton2_Click() Range("a1") = 2 Unload Me End Sub ※bbb_dateとccc_dateとddd_dateはそれぞれにあるボタンを押すとA7セルの値を変更するようにして、aaa_dateでどのフォームを表示するのかを選択しています。 ※実際にはもっと沢山ユーザーフォームがあります。 上記の状態では動作するのですが、エクセルの表に値を入力したいので、bbb_dateとccc_datとddd_datをvbModeless(モードレス状態)にすると、スタック容量が足りませんと出ます。 別のやり方でもよいですので、ユーザーフォームを切り替える良い方法があったらお願いします。
- ベストアンサー
- その他MS Office製品
- Visual Basic 6.0でのLabelについて質問です。
Visual Basic 6.0でのLabelについて質問です。 今、Labelが100個あるとして、 どのラベルが押されても同じ処理をさせたい場合、どのようにプログラムを組めばよいかわかりません・・・ そこで、 Private Sub Label2_Click() Label1.Caption = "停止" End Sub Private Sub Label3_Click() Label1.Caption = "停止" End Sub Private Sub Label4_Click() Label1.Caption = "停止" End Sub ・ ・ ・ Private Sub Label101_Click() Label1.Caption = "停止" End Sub のように100個繰り返しても良いのですが、だらだら長くなってしまうので、スマートに 処理できる方法を探しています。 もしご存知の方がいらっしゃいましたら教えていただけないでしょうか? よろしくお願いします。
- ベストアンサー
- Visual Basic
お礼
回答ありがとうございます。 シートにボタンをつけています。 簡単にできる方法を探していたのですが、かなり面倒ですね。 その都度、ボタン名、ラベル名を書く方が簡単なようですね。 エクセルはボタンやラベルにコードを設定できてハイパーカードに良く似ていると思っていましたが、そこまでオブジェクト化されていないようですね。 大昔68030の時代マックでエクセル(VBAではありませんでした)とハイパーカードを良く利用していました。