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

このQ&Aのポイント
  • ExcelVBAでイメージコントロールを使用する方法について教えてください。
  • マウスの動きやクリックに応じて座標を表示させる方法を知りたいです。
  • CommandButtonを押すと画像の表示/非表示を切り替える方法を教えてください。
回答を見る
  • ベストアンサー

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を押してもイベントを受け付けてくれません。 イメージをクリックさえしなければ、画像の表示/非表示の切り替えはできます。 何が間違っている(足りない?)のでしょうか? よろしくお願いします。

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

  • ベストアンサー
回答No.1

Repaint メソッドで再描画するといいんじゃない? CommandButton1_Click() ------ ------ Me.Repaint    ←追加 End Sub

takoyaki0320
質問者

お礼

いけました!! ForestRainさんありがとうございます、感謝です!

関連するQ&A

  • 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

  • VBA DoEvents関数の働きと使い方を知りたい

    下記のような UserForm上の Module コードを書いてももらったのですが、DoEvents の働きが分からないのです。どなたか分かりやすく説明していただけませんでしょうか? Private i As Integer Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Me.TextBox1.Value = Me.Label1.Caption Then Me.Label2.Caption = "正解です" Else Me.Label2.Caption = "不正解です" End If DoEvents If i < 20 Then i = i + 1 Label_Up Me.TextBox1.Value = "" Cancel = True Else MsgBox "終了です" End If End Sub Private Sub UserForm_Initialize() i = 1 Label_Up End Sub Private Sub Label_Up() Me.Label1.Caption = Sheets("Sheet1").Range("A1:A20").Cells(i).Value DoEvents End Sub

  • マウスのある個所の色

    お世話になります よろしくお願いします Pictureboxをクリックされたときに そのPictureboxがクリックされた箇所の色を16進数で取得したいのですが うまくいきません どこが間違っているのか教えてもらえないでしょうか? ソースは Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Type POINTAPI x As Long y As Long End Type Private Sub Picture1_Click() Dim Poi As POINTAPI Dim iro As Long GetCursorPos Poi iro = GetPixel(Me.Picture1.hdc, Poi.x, Poi.y) Me.Label2.Caption = Poi.x Me.Label3.Caption = Poi.y Me.Label1.Caption = iro CloseHandle (Me.Picture1.hdc) End Sub GetPixcelの引数に-1しか入りません あと、もし数値で取れたとして それを16進数にする方法を教えてください よろしくお願いします

  • 「○秒」のところの表示を消したい

    ●質問内容 下記のコードを用いてユーザーフォーム上で ストップウォッチに時間を計測できるフォームを 作成しました。 添付の画像において計測時間は「0:02:29」となっていますが、 これを「0:02」としたいと考えています。 コードをどのように書き換えればよいでしょうか? ちなみに「○秒」のところは全て切り捨てにするつもりです。 ご存知の方ご教示願います。 ●コード Option Explicit Dim inProcess As Boolean ' True なら計測中を表す Private m_Kaishi As Date Private m_Syuryo As Date '開始時間をクリックするとラベル22が時間に変わる Private Sub CommandButton6_Click() Select Case inProcess Case False ' 計測を開始する inProcess = True m_Kaishi = Time Label22.Caption = FormatDateTime(m_Kaishi, vbShortTime) Label23.Caption = "" Label24.Caption = "" CommandButton6.Caption = "作業終了" Case True ' 計測を終了してインターバルを表示 inProcess = False m_Syuryo = Time Label23.Caption = FormatDateTime(m_Syuryo, vbShortTime) Label24.Caption = CDate(m_Syuryo - m_Kaishi) CommandButton6.Caption = "作業開始" End Select End Sub Private Sub UserForm_Initialize() CommandButton6.Caption = "作業開始" Label22.Caption = "" Label23.Caption = "" Label24.Caption = "" End Sub

  • 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 = ・・・

  • VBAのDoEventsが上手く動きません

    お世話になります。 ExcelのVBAで印刷処理をしているのですが、印刷枚数が多いのでDoEventsイベントを入れ、印刷中断処理を行いたいのですが、上手くできません。 印刷中ダイアログが表示されるのが原因なのでしょうか?それともコードの書き方が悪いのでしょうか?よろしくお願いします。 コードは以下のとおりです。 ************************************************ Public Can_flg As Boolean ************************************************ Private Sub CommandButton1_Click()   Can_flg = True End Sub ************************************************ Private Sub UserForm_Activate()   Dim ms As String   Dim j As integer   Can_flg = False   For j = 1 To 31    DoEvents    If Can_flg = True Then      ms = MsgBox("印刷を中止します。", vbOKCancel)        If ms = vbOK Then         Exit For        Else         Can_flg = False        End If    End If    Me.Label1.Caption = "印刷中です… (" & j & "/" & i & "ページ)"    Sheets("テスト").PrintOut   Next j   Unload Me End Sub

  • VBAで ScreenToClient を使いたい

    Excel VBA で、ユーザーフォームをクリックしたときのポインタのクライアント座標を取得し、フォーム上のラベルに表示するというスクリプトを作ろうと思っています。 ウェブで探し当てたVBのソースなどを参考にして、スクリーン座標を取得するところまではうまくいきましたが、「ScreenToClient」関数の書式がVB のソースと同じでは動かないようで、「コンパイルエラー:メソッドまたはデータメンバがみつかりません」というエラー表示が出て止まってしまいます(「Me」を「UserForm1」に代えても結果は同じでした)。 以下は実際のVBAソースです。どのようにすれば動くようになるのか、ご教示頂けませんでしょうか。宜しくお願いします。 'カーソルの位置座標をスクリーン座標で取得するAPI関数 Private Declare Function GetCursorPos Lib "user32" _ (lpPoint As POINT) As Long 'カーソルの位置座標をスクリーン座標からクライアント座標へ変換するAPI関数 Private Declare Function ScreenToClient Lib "user32" _ (ByVal hWnd As Long, lpPoint As POINT) As Long 'カーソルの位置座標用変数 Private CuP As POINT '位置座標を受け取る構造体 Private Type POINT x As Long y As Long End Type Private Sub UserForm_Click() 'スクリーン座標を取得 GetCursorPos CuP Label1.Caption = "クリック位置のスクリーン座標 X=" & CuP.x & " Y=" & CuP.y '↑ここまではうまく動いています 'クライアント座標に変換 ret = ScreenToClient(Me.hWnd, CuP) Label2.Caption = "クリック位置のクライアント座標 X=" & CuP.x & " Y=" & CuP.y End Sub

  • 2つの時間から作業時間を算出したい

    ●質問の主旨 「開始時間」と「終了時間」を予め表示させておき、 「終了時間」-「開始時間」=「作業時間」とするには、 どのようなコード記述をすれば良いでしょうか?ご教示願います ●質問の補足 1.「作業開始」ボタンを押すと、「開始時間」が現在の時間に変わります。 2.「作業終了」ボタンを押すと、「終了時間」が現在の時間に変わります。 3.「作業終了」の処理が終わると同時に、赤色の部分が、   「終了時間」-「開始時間」=「作業時間」の時間計算を行い、計算結果を    表示させたいと考えています。 4.時間計算の上、表示を「0:00」(○時間○分)としたいと考えています。 5.現在のコードでは計算がされておらず、常に「0:00:00」が表示されます。 ●コード '開始時間をクリックするとラベル22が時間に変わる Private Sub CommandButton6_Click() With Me.CommandButton6 Me.Label22.Caption = FormatDateTime(Time, vbShortTime) End With End Sub '終了時間をクリックするとラベル23が時間に変わる Private Sub CommandButton7_Click() With Me.CommandButton7 Me.Label23.Caption = FormatDateTime(Time, vbShortTime) End With Call sagyoujikan End Sub '作業時間の算出 Private Sub sagyoujikan() Dim kaishi As Date Dim syuryo As Date kaishi = DateDiff("h", Label22, Label23) syuryo = DateDiff("m", Label22, Label23) Me.Label24.Caption = kaishi + syuryo End Sub 以上よろしくお願い申し上げます。使用機種はWindowsVistaで、 Excel2007です。私はVBA初心者です。

  • Word2000文書でのコントロールツールの使い方が(初心者)

    Word文書のコントロール(CommandButton1)を押して、 Label1に文字を表示させたいのですが、 いろいろヘルプを読んでも分かりません。助けてください。 Word文書に コントロールツールボックス から CommandButton1 と Label1 をオブジェクトとして置きました。 コントロールツールボックス の デザインモードをクリックして、 CommandButton1 をクリックして、 Microsoft Visual Basic のウィンドウを開きました。 コードを以下のように記述しました。 Private Sub CommandButton1_Click() Label1.Caption = "文字を表示します" End Sub コントロールツールボックス の デザインモードを終了しまして、 CommandButton1 を クリックすると、 Label1 には確かに、「文字を表示します」と表示されました。 ・・・ここまではいいのですが、 このWord文書を名前をつけて保存したあと再び開くと、 CommandButton1 を押しても、何もおこりません。 どうしてでしょうか?

  • Elseifのコードが分かりません。(至急)

    急ぎのため再度の質問失礼します。 3つの数字すべてが7のとき、メッセージ1を出し、 どれか2つだけが7のときは、メッセージ2を出し、 どれか1つだけが7のときは、メッセージ3を出し、 どこにも7が含まれていないときは、メッセージ4を出すようにEndifを使って書きたいのですが、正しいコードを教えて下さい。 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Randomize() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click PictureBox1.Visible = False Label4.Visible = False Label1.Text = CStr(Int(Rnd() * 10)) Label2.Text = CStr(Int(Rnd() * 10)) Label3.Text = CStr(Int(Rnd() * 10)) If End If End Sub Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click End Sub Private Sub Label3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label3.Click End Sub Private Sub Label5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label5.Click End Sub End Class よろしくお願いします。

専門家に質問してみよう