VBAのイベントについて質問

このQ&Aのポイント
  • VBAでマクロを組んでおります。mouseupイベント、GetChartElementをもちいて散布図の中のグラフ要素の値を取得したいのですが、これらのコマンドはグラフシートにしか適用できないでしょうか?
  • クラスモジュールClass1にて、myChart_MouseUpイベントを使用して散布図のグラフ要素の値を取得したい。
  • 標準モジュールにInitializeChartサブプロシージャを追加し、myClass.myChartにActiveChartを設定しています。
回答を見る
  • ベストアンサー

vbaのイベントについて質問

vbaでマクロを組んでおります。 mouseupイベント、GetChartElementをもちいて散布図の中のグラフ要素の値を取得したいのですが、 これらのコマンドはグラフシートにしか適用できないでしょうか?グラフシートではうまくいくのですが埋め込みグラフに対して行うとうまくいきません。分かる方いらっしゃいましたら、お願いいたします。 クラスモジュールClass1にて↓ Public WithEvents myChart As Chart Private Sub myChart_MouseUp _ (ByVal Button As Long, _ ByVal Shift As Long, _ ByVal x As Long, _ ByVal y As Long) Dim ElemID As Long, Arg1 As Long, Arg2 As Long myChart.GetChartElement x, y, ElemID, Arg1, Arg2 Select Case ElemID Case xlSeries MsgBox ("データ系列") '⇒データ系列と認識されればメッセージボックスがでるはず Case Else MsgBox ("その他") End Select End Sub 標準モジュールに入力↓ Dim myClass As New Class1 Sub InitializeChart() Set myClass.myChart = ActiveChart End Sub

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

  • ベストアンサー
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

Classモジュールを使って、グラフシートのMouseUpイベントを使おうとしているのですか? どうも意図通りにイベントが発生していないようです。 シートモジュールでグラフシートのイベントを使う例があります。 下記ページで、kanabunさんが in 2010/05/30(日) 22:31:15 に投稿がされています。 そっくり、そのままで使えます。 ≪参考≫ グラフ要素を取得する方法 http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+201005/10050112.txt Clasモジュールでやる方法も探せば見つかると思います。

braviass
質問者

お礼

回答ありがとうございます。 参考のホームページも一度みたことがあります。この中では、Selectイベントを使用していますね。質問のやり方(Classモジュールと標準モジュールを用いた書き方)で、Selectイベントは埋め込みグラフでもうまくいくのですが、MouseUpでやろうとするとうまくいかないのです。 質問でかいたプログラムを起動→埋め込みグラフ上でデータ系列以外を選択した場合、「その他」と表示されているので、イベント自体は発生しているとは思うのですが、データ系列を選択しても反応してくれません。何か足りないのでしょうか?

braviass
質問者

補足

解決しました。 どうやらMouseUpではそもそもうまくいかないようです。 MouseDownを用いてみたらうまくいきました。

その他の回答 (1)

  • MRT1452
  • ベストアンサー率42% (1392/3296)
回答No.1

あくまで、推測ですが。 WithEvents は、フォーム限定のキーワードではないかと思います。 なので、シート上のオブジェクトは認識できないのではないのかと。 元々WithEvents はVBのキーワードですし。

braviass
質問者

お礼

ご回答ありがとうございます。 今回のようにmouseupを用いる場合は、うまくいかないのですがselectを用いると、同様の書き方でうまくいくのです。(つまり、myChart_select)この場合もWithEventsを使用しているのですが、何が違うのでしょうか? ちなみに、質問のプログラムを起動すると、データ系列以外は、認識していて、「その他」とメッセージボックスで表示されます。ただ、データ系列だけはうまく認識できていないようです。

braviass
質問者

補足

ごめんなさい。同じ書き方ではありませんでした。selectイベントを用いた場合では、witheventsは使用していますが、GetChartElementは使用していませんでした。

関連するQ&A

  • Excel 2007 <VBAでグラフの操作(Seriescollec

    Excel 2007 <VBAでグラフの操作(Seriescollectionの移動> あるチャートに系列が4つあります。 それぞれの名前を順に系列(1)、系列(2)、系列(3)、系列(4)とします。 これを系列(1)、系列(4)、系列(2)、系列(3)としたいのですが、 以下の記述では無理(オブジェクトはこのメソッドをサポートしていないとのこと)でした。 どのような記述になるでしょうか。 ご教示方よろしくお願いします。 Sub Temp6()   Dim myChart As Chart   For Each myChart In Charts     myChart.SeriesCollection(4).Move after:=myChart.SeriesCollection(1)   Next End Sub

  • VBAのシートイベントで教えてください

    シートのN4以下で、既に同じ番号があれば「既に同じ番号があります」 と表示するようにしたく、下のように書きましたが、肝心な部分 の、どのように同じ番号をみつけるようにすのかわかりませんでした。 教えていただけないでしょうか。宜しくお願いします。 Private Sub worksheet_change(ByVal target As Range) Dim 範囲左 As Integer Dim 範囲右 As Integer Dim 範囲上 As Integer 範囲左 = 1 範囲右 = 16 範囲上 = 4 With target 'if '指定した範囲の列Nに既に同じ番号や文字列があれば MsgBox "既に同じ番号があります。" End If End With End Sub

  • VBAで画像ファイルをダウンロードしたいけどうまく

    VBAで画像ファイルをダウンロードしたいけどうまく行かない・・・ XPで、オフィス2003です。 http://officetanaka.net/other/extra/tips01.htm を参考に、画像ファイルをダウンロードする練習をしているのですが "エラーが発生しました"になってしまいます。 標準モジュールに --------------------------------------------------------- Option Explicit Public Declare Function URLDownloadToFile Lib "urlmon" _ Alias "URLDownloadToFileA" (ByVal pCaller As Long, _ ByVal szURL As String, ByVal szFileName As String, _ ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long Sub Sample() GetImageFile "http://www.officetanaka.net/sample.jpg", "C:\sample.jpg" End Sub Sub GetImageFile(ImgName As String, SaveName As String) Dim SaveFileName As String, DownloadFile As String, Ret As Long Ret = URLDownloadToFile(0, DownloadFile, SaveFileName, 0, 0) If ImgName = "" Then Exit Sub SaveFileName = SaveName DownloadFile = ImgName Ret = URLDownloadToFile(0, DownloadFile, SaveFileName, 0, 0) If Ret = 0 Then MsgBox "ダウンロードできました" Else MsgBox "エラーが発生しました" End If End Sub --------------------------------------------------------- を貼り付けました。 Retが0にならなくてはいけないみたいですが、 自分の場合は、-2147221020になってしまいます。 どう修正すればいいのか教えてください。

  • エクセル2010のvbaについて

    押されたコマンドボタンの名前を取得したいです (調べてみましたがエラーになり取得できませんでした) 後コマンドボタンがたくさんあり、コードも長く とても邪魔なので省略したいのですができますか? (左クリックと右クリックで違う処理をした後       MouseDown コマンドボタンの名前で少し処理を変えるコードです) 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") = 2 End Select End Sub Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) If (コマンドボタンの名前を取得) = "aaa" Then Range("A1") = Range("A1") + 1 Else Range("A1") = Range("A1") - 1 End If End Sub

  • 0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題

    0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題ですが、一つの数字しか計算が出来ません 5と12の場合は String "5 12" から型 'Long' への変換は無効です。と出てきてしまいます。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n As Long Dim f As Long n = CLng(TextBox1.Text) ←ここにエラーが出ます。 TextBox2.Text = CStr(Recur(n)) End Sub Public Function Recur(ByVal arg As Long) As Long If arg = 1 Then Recur = arg Exit Function End If Recur = arg * Recur(arg - 1) End Function End Class というプログラムです。分かる方よろしくお願いします。 実行エラーです。

  • EXCEL2007 VBA グラフサイズ修正バグ?

    下記のようなグラフのサイズ調整するVBAプログラムをEXCEL2007で動かしました。 VBEで実行すると正常に動作します。 シートに図形を設置し、その図形にマクロを登録して実行すると、 グラフが3画面位広がってしまいます。 図形にマクロ登録してグラフ調整を正常に動かすことはできないのでしょうか? ----------------------------------------------------- 'グラフの再調整を行うサブルーチン Sub chartRerange()  Dim wb As Workbook  Dim strWbName As String  Dim myRng1, myRng2, myRng3 As Range  Dim myChart As Shape  Dim rngTarget As Range      '開いているすべてのワークブックを処理対象とする  For Each wb In Workbooks   strWbName = wb.Name      '「月度」が含まれているならば処理   If InStr(strWbName, "月度") <> 0 Then    Set myRng1 = wb.Worksheets(2)    Set myRng2 = wb.Worksheets(3)        For Each myChart In myRng1.Shapes     'グラフならば     If (TypeOf myChart.OLEFormat.Object Is ChartObject) Then            Select Case myChart.Name       Case "chart1"        Set rngTarget = Range("B24:AG42")      End Select             'グラフを指定したエリアに配置する      With myChart        .Top = rngTarget.Top        .Left = rngTarget.Left        .Width = rngTarget.Width        .Height = rngTarget.Height      End With     End If    Next   End If  Next      MsgBox "処理完了"      Set wb = Nothing   Set myRng1 = Nothing   Set myRng2 = Nothing   Set myChart = Nothing   Set rngTarget = Nothing End Sub

  • vbaでmsgboxの位置を指定

    http://okwave.jp/qa/q5253604.html を参考に、http://homepage1.nifty.com/rucio/main/technique/MsgBox.htmをやってみたのですが うまくいきません。 検証はエクセル・アクセス2007で行いました。 ////////////////////////////////////////////////////////////////// Option Explicit Dim App As Object Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _ (ByVal idHook As Long, _ ByVal lpfn As Long, _ ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long Private Declare Function UnhookWindowsHookEx Lib "user32" _ (ByVal hHook As Long) As Long Private Declare Function SetWindowPos Lib "user32" _ (ByVal hwnd As Long, _ ByVal hWndInsertAfter As Long, _ ByVal x As Long, _ ByVal y As Long, _ ByVal cx As Long, _ ByVal cy As Long, _ ByVal wFlags As Long) As Long Const WH_CBT = 5 Const HCBT_ACTIVATE = 5 Public Const SWP_NOSIZE = &H1 '「サイズを指定しない」オプション Public Const SWP_NOZORDER = &H4 '「Zオーダーを指定しない」オプション Public Const SWP_NOACTIVATE = &H10 Dim HookHandle As Long '元のCBTProcプロシージャへのハンドル Dim m_Left As Long 'メッセージボックスのX座標 Dim m_Top As Long 'メッセージボックスのY座標 Public Sub SetMsgBox(Left As Long, Top As Long) m_Left = Left m_Top = Top HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, App.Hinstance, App.ThreadID) End Sub Private Function CBTProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim Ret As Long If nCode = HCBT_ACTIVATE Then Ret = SetWindowPos(wParam, 0, m_Left, m_Top, 0, 0, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE) Ret = UnhookWindowsHookEx(HookHandle) End If CBTProc = Ret End Function ////////////////////////////////////////////////////////////////// を標準モジュールに貼りつけました。 Dim App As Objectについては、参考のページにはありませんでしたが エラーになるので勝手にObjectにしました。 そしてこのコードを書いた標準モジュールに Sub test() SetMsgBox 0, 0 MsgBox "この例では左上に表示されます。" End Sub を足しました。 そして実行すると、 HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, App.Hinstance, App.ThreadID) の部分で オブジェクト変数または With ブロック変数が設定されていません。(Error 91) になります。 VBAでの位置の指定方法を教えてください!!!

  • 自作クラスのイベントを外部ハンドラでスレッドセーフ

    ■.NETモジュールプロジェクト(DLL) Public Class MyClass   Public Event hoge( ByVal sender As Object, ByVal e As EventArgs )   Private WithEvents Timer As Timers.Timer   Private Sub New()     Timer = New Timers.Timer : Timer.Interval = 10 : Timer.Start()   End Sub   Private Sub fuga( ByVal sender As Object, ByVal e As EventArgs ) Handles Timer.Elapsed     RaiseEvent hoge( Me, New EventArgs ) ' 一定時間ごとにイベントを発生させる   End Sub End Class ■上の.NETモジュールを参照している Windows Form アプリケーションプロジェクト(EXE) Public Class Form1   Private WithEvents foo As MyClass.MyClass   Public Sub New()     InitializeComponent()     foo = New MyClass.MyClass   End Sub   Private Sub bar() Handles foo.hoge     TextBox1.Text = "baz" ' TextBox1 は デザイナで Form1 に貼り付け済み   End Sub End Class という 2 プロジェクトを含むソリューションを作成しました。実行すると、 有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'TextBox1' がアクセスされました。 というエラーが出てきます。 foo が MyClass ではなく、system.windows.forms.dll などに入っている Button や Form といったコントロールの場合は、上記の bar() のような書き方でもスレッドセーフに扱えるので、MyClass もForm1 のコードを修正する事なく、利用できたらなと思っています。 その場合、どのように MyClass を書けばいいでしょうか。環境は VS2008 で、.NET2.0 ベースです。

  • VBAでワイルドカードを使った文字列検索

    初めて投稿いたします。 環境は、WinXP Access2000 下記のVBAモジュールで、文字列検索がヒットしません。 数字の比較でヒットするのはナゼでしょうか? ちなみに、変数に導入したのは、全角半角どちらも入れてみました。 この疑問・・・どなたか解決お願いします。 Sub TEST() Dim AAA As String Dim BBB As String Dim YYY As String AAA = "0" BBB = "2" YYY = AAA & BBB Select Case YYY Case "0*" MsgBox "ココを通り過ぎないで!" Case "15" MsgBox "やったね" Case Is > 0 MsgBox "なぜかココでヒットします??" End Select End Sub

  • 0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題

    0から12までの値nを入力し、nと階乗n!の値を表示しなさいという問題です。 前にこのプログラムで複数個、同時には計算できない問題を自分で解決したのですがこんどは0が計算できないようです。 System.StackOverflowException' のハンドルされていない例外が WindowsApplication1.exe で発生しました。 とでます Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n As Long Dim f As Long n = CLng(TextBox1.Text) TextBox2.Text = CStr(Recur(n)) End Sub Public Function Recur(ByVal arg As Long) As Long ←ここにエラーが If arg = 1 Then Recur = arg Exit Function End If Recur = arg * Recur(arg - 1) End Function End Class というプログラムです。分かる方よろしくお願いします。 実行エラーです。

専門家に質問してみよう