ExcelVBAでユーザーフォームのイベント対応

このQ&Aのポイント
  • ExcelVBAを使用して、ユーザーフォーム上のComboBoxにマウスポインターを当てた際に、選択された項目に応じて説明の文字を表示する方法について教えてください。
  • ComboBox1からComboBox6までの各ComboBoxに対して同じコードを書く必要があるのか、もっと簡単な方法があるのか教えてください。
  • コード内の変数Button、Shift、X、Yの意味と役割について教えてください。
回答を見る
  • ベストアンサー

ExcelVBAでユーザーフォームのイベント対応

Excel2010です。ユーザーフォーム上に配置した6個のComboBox(1から6)があります。 それぞれのComboBox上にマウスポインターを当てた際、そこが選択されていれば(="名称" 以外であれば)同じユーザーフォーム上にあるLabel23に説明の文字を表示させたいのです。 以下のようにComboBox1からComboBox6までComboBoxの番号以外は全く同じコードを書けばそうできると思いますが、これをもっと簡単に書くことはできないでしょうか?教えてください。 あと、もう1点 下記のコードの変数(Button、Shift、X、Y)の意味と役割は何でしょうか? Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Me.ComboBox1.Value = "名称" Then Exit Sub Me.Label23.Caption = Me.ComboBox1.Value & Range(Me.ComboBox1.ControlSource).Offset(, 9).Value End Sub 途中ComboBox 2から5は省略 Private Sub ComboBox2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Me.ComboBox6.Value = "名称" Then Exit Sub Me.Label23.Caption = Me.ComboBox6.Value & Range(Me.ComboBox6.ControlSource).Offset(, 9).Value End Sub

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

  • ベストアンサー
  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.1

>これをもっと簡単に書くことはできないでしょうか? 別のプロシージャに共通部分を抜き出すのが一般的です。 ComboBox型変数にコンボボックスを格納できる事を知っていれば、後は他の共通プロシージャと同じです。 以下に例を挙げます。 ・各ボタンに設定するイベントプロシージャ。ComboBox6まで同様に設定。 Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)  Call OutputLabel(Me.ComboBox1) End Sub ・共通プロシージャ。ComboBox型変数で受ける。 Private Sub OutputLabel(ComboB As ComboBox)  If ComboB.Value = "名称" Then Exit Sub  Me.Label123.Caption = ComboB.Value & Range(ComboB.ControlSource).Offset(0, 9).Value End Sub >変数(Button、Shift、X、Y)の意味と役割 検索すればすぐに出てきますが https://docs.microsoft.com/ja-jp/office/vba/api/excel.chart.mousemove button:押されたマウスボタン。1なら左、2なら右ボタンが押されている。 Shift:Shift、Ctrl、およびAltキーが押されているか。1ならShiftキー、2ならCtrlキー、4ならAltキーが押されている。 X:マウスポインターのx座標。 Y:マウスポインターのy座標。

mocodne
質問者

お礼

ありがとうございました!とても勉強になりました。

その他の回答 (2)

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.3

クラスモジュールを理解できるなら、こちらのページが参考になります。 https://blog.goo.ne.jp/pc_college/e/9ca2b0c452e9e691cad1dbd2783868cf 電卓のボタン(CommandButtonコントール)をクラス定義し、Clickイベントを使って押されたボタンのTextを返しています。 CommandButtonコントールをComboBoxコントロールに、ClickイベントをMouseMoveイベントに置き換えればOKです。

mocodne
質問者

お礼

ありがとうございます。クラスモジュールとは初めて聞きました。勉強してみます。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.2

> 下記のコードの変数(Button、Shift、X、Y)の意味と役割は何でしょうか? 下記サイトを参考にしてください。 https://officedic.com/excel-vba-userform-mousemove-event/ > これをもっと簡単に書くことはできないでしょうか 簡単になっていないような感じですが一つの案として Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Me.ComboBox1.Value = "名称" Then Exit Sub Call Test("ComboBox", 1) End Sub Private Sub ComboBox2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Me.ComboBox2.Value = "名称" Then Exit Sub Call Test("ComboBox", 2) End Sub Function Test(ByVal CtrName As String, ByVal CtrNo As Integer) Me.Label23.Caption = Me.Controls(CtrName & CtrNo).Value & Range(Me.Controls(CtrName & CtrNo).ControlSource).Offset(, 9).Value End Function

mocodne
質問者

お礼

ありがとうございました。勉強になりました。

関連するQ&A

  • ExcelVBAのイメージコントロールについて

    こんにちは。Excel2000を使用している初心者です。 フォーム上には以下のものがあります。 Image1 Label1、Label2、Label3、Label4 CommandButton1 ・CommandButton1を押すとImage1に画像Aをロードして、次に押すと消すという動作をさせます。 ・Image1の上をマウスが動くと座標をLabel1(x)、2(y)に常に表示させます。 ・Image1をクリックするとそのときの座標をLabel3(x)、4(y)に表示させたままにします。 コードは以下の通りです。 Dim Flg As Boolean Flg = False Private Sub CommandButton1_Click() If Flg = False then Me.Image1.Picture = LoadPicture ("C:\A.jpg") Flg = True Else Me.Image1.Picture = LoadPicture ("") Flg = False End If End Sub Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer,_ ByVal X As Single, ByVal Y As Single) Me.Label1.Caption = X Me.Label2.Caption = Y End Sub Private Sub Image1_Click() Me.Label3.Caption = Me.Label1.Caption Me.Label4.Caption = Me.Label2.Caption End Sub ・・・という記述なんですが、まず画像を表示させて、次にイメージをクリックしてLabel3、4に座標を表示させた後、CommandButton1を押してもイベントを受け付けてくれません。 イメージをクリックさえしなければ、画像の表示/非表示の切り替えはできます。 何が間違っている(足りない?)のでしょうか? よろしくお願いします。

  • HTML風にマウスが上に来たテキストの文字色を変更するには?

    VB初心者です。 テキスト文字の上をマウスが通過したときにその文字の色を変更するには、 どうすればいいのでしょうか?(ブルーからレッドに) Private Sub Label1_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single) ***************** End Sub MouseMoveを工夫するといいのでしょうか? 宜しくお願いします。

  • ExcelVBAでのユーザーフォームについて

    ご回答ありがとうございました。 これといった資料がなく(探し方が悪いのかもしれませんが)、少ない経験値で複雑なというか面倒な処理のマクロ(VBA)を組まされることになり、困っているところです。当初の話だと「勉強しながらでよい」ということだったのですが、いろいろと仕事が次々と舞い込んできて、そんな余裕もなくせっぱ詰まり少ない知識で必死にやっています。 先にご回答いただいた内容で是非アドバイスをいただきたいと思い、新たに質問させていただきました。 ユーザーフォームでマルチページを作っています。そこでもコンボボックスを使うのですがそこの記述方法をアドバイス下さい。やっぱり記述場所がおかしいのか、クリックするとリストの内容がコンボボックスをクリックした分だけ繰り返してしまうことがあります。 ////////////////////////////////////////////////////// Private Sub UserForm_Initialize() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// Private Sub ComboBox1_DropButtonClick() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// とまぁ、結局コードは同じなのですが。 それと、結果をラベルに出させる場合には回答で記述いただいた ////////////////////////////////////////////////////// Private Sub ComboBox1_Change()   Dim vTgYear As Variant   vTgYear = ComboBox1.Value   Label1.Caption = vTgYear - 1 & "~" & vTgYear + 1 & "年" End Sub ////////////////////////////////////////////////////// で、よいでしょうか? よろしくお願いいたします。

  • 同じコマンドボタンからマウスカーソルがはなれたら

    フォーム上のコマンドボタンにマウスカーソルが触れたら色を付ける、 同じコマンドボタンからマウスカーソルがはなれたら 、また色を変える、 という動きをvbaで行いたいのですが、 Private Sub cmd_test_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Me.cmd_test.BackColor = RGB(255, 180, 200) End Sub で、マウスカーソルが触れたら色を付けることはできたのですが、 マウスカーソルがそのコマンドボタンから離れたら色を変えるという動きができません。 Private Sub cmd_test_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Me.cmd_test.BackColor = RGB(255, 255, 255) End Sub Private Sub cmd_test_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Me.cmd_test.BackColor = RGB(255, 255, 255) End Sub Private Sub cmd_test_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Me.cmd_test.BackColor = RGB(255, 255, 255) End Sub をしても、マウスカーソルが離れても色が白になりませんでした。

  • エクセルのuserform1上に、コントロールボタンを配置し、コントロ

    エクセルのuserform1上に、コントロールボタンを配置し、コントロールボタン上にカーソルを持っていくと、 別のuseruform2が表示されるようにしたいのですが、 コントロールボタンを消すときに、userform1が白抜きになってしまいます。 きれいにuserform2を消す方法をおしえてください。 Private Sub UserForm1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Unload userform2 End Sub

  • 8つのコマンドボタン上にそれぞれマウスカーソルを置くと、userfor

    8つのコマンドボタン上にそれぞれマウスカーソルを置くと、userform1~8(図)が表示されるようにしております。 そして、Label上にマウスカーソルを置くと、表示中のuserformが消えるようになっております。 しかし、たまにですが、 > エラー番号:50290 > "アプリケーション定義またはオブジェクト定義のエラーです。" が表示されてしまい。 下記マクロのunload userform1でとまってしまいます。 なぜなのでしょうか。 Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Unload userform1 Unload userform2 Unload userform3 Unload userform4 Unload userform5 Unload userform6 Unload userform7 Unload userform8 End Sub

  • Access VBAのイベント共有について

    こんにちは。 初めて質問をさせて頂きますcimappleと申します。よろしくお願いいたします。 現在、業務にて使用するデータベースをAccessにて作成しておりまして、VBAにてフォームの各処理を記述しています。 ちなみに、当方Access、VBAについて超初心者ですので、そもそもの誤解がある部分もあるかと思いますが、ご容赦ください。 さて、質問の内容ですが、今回フォーム上にある14個のラベルを、マウスカーソルが乗った時(MouseMoveイベント)にそのラベルの背景色を変えるコードを組みたいと考えています。 現状としては、それぞれのラベルのMouseMoveイベントに背景色を変えたり、戻したりといったコードを記述していますが、当然非効率かつ面倒なのです。 そこで、このイベントを共有化したいと考え、いろいろと検索したところ、クラスモジュール(Private WithEvents)にてそういったことができそう・・・というところまでは辿り着いたのですが、その先が全く分かりません。 Excelについてのクラスモジュールの記事はたくさん見つけて、コピーペースト見よう見まででマネてはみたのですが、当然うまくいかず、そこから先に進めないでおります。 クラスモジュールについて基礎から勉強しなさいと言われればその通りなのですが、どうかお知恵をお貸し頂きたく質問させていただきました。 よろしくお願いいたします。 以下、見よう見まねの現在のコードです。 ちなみに、フォーム名はFRM1、ラベル名はそれぞれLbl○、クラスモジュール名はCLS1となっています。 Form(FRM1)のコード ======================================================= Option Compare Database Option Explicit Dim MyLbl(14) As CLS1 Private Sub Form_Load() Dim Lbl As Access.Label Dim i As Integer For i = 1 To 14 Set Lbl = Me.Controls("Lbl" & i) Set MyLbl(i) = New CLS1 Set MyLbl(i).Label = Lbl Next End Sub ======================================================= Class(CLS1)のコード ======================================================= Option Compare Database Option Explicit Public WithEvents Label As Access.Label Private Sub Label_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Label.BackColor = 225 End Sub ======================================================= 長文かつ駄文で申し訳ありませんでした。

  • スプレッド上のマウスムーブイベント

    VB6.0について質問です。 スプレッドでマウスのカーソルがあたっている行のバックカラーを変えたいのですがうまくいきません。 MouseMoveイベントでやっています。 バックカラーを変えるところまではなんとかできたのですが その後カーソルがあたっていないところは色をもどしたいのですができません>< 今やっている処理は以下のコードです。 実現するにはどこをに何を加えたらよいですか? Private Sub spdlist_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) Dim actrow With spdlist .Col = -1 actrow = Int(y / 400) .Row = actrow .BackColor = vbred End With End Sub

  • エクセル2010のコマンドボタンついて

    MouseDownイベントでループ(Doなど)をさせた後 MouseUpイベントでStopさせるコードを作りましたが MouseUpイベントまで行かずずっとループしてしまいます (押されている間はボタンが凹んでいますが このコードにすると凹まず中断しないと 動かせないようになってしまいます) 何が原因がわからないので回答お願いします 下はコードです Private Sub CommandButton1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) Select Case Button Case 1 Range("A1") = 1 Case 2 Range("A1") = 3 End Select Do Range("A1") = Range("A1") + Range("A1") Loop End Sub Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) Stop End Sub (Select Case Button Case 1...にしても変わりませんでした)

  • LabelとTextboxの自動計算を希望

    ComboBox2のリスト選択で連動でlabel2とlabel12の数字変更 TextBox2には数字入力 Label12(数字) x TextBox2(数字) = Lavel22(乗算合計)で Label12変えないで、TextBox2の数字変えた時はLabel22の合計変動 Label12の数字変えて、TextBox2の数字変ない時はLabel22の合計変わらない現状です。 Private Sub TextBox2_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Select Case True 'TextBox2かLabel12が空白の時Label22空白 Case TextBox2.Value = "" Or Label12.Caption = "" Label22.Caption = "" Case Else 'TextBox2とLabel12が数字の時Label22はTextBox2の数字とLabel12数字を乗算する If IsNumeric(TextBox2.Value) And IsNumeric(Label12.Caption) Then _ Label22.Caption = TextBox2 * Label12 'Label22に数字がある時Label29に合計表示 Label29.Caption = Label22 End Select End Sub ComboBox2_change()作って、TextBox2_KeyUp書いてる内容を書けば動くでしょうが・・・ 同じ内容2つ書かないで動く方法があれば非常に助かります。 いい方法無さそうならComboBox2_change()作って書こうかな・・・と思ってます

専門家に質問してみよう