Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12742 / 13644 ツリー ←次へ | 前へ→

【8886】指定位置のグラフ要素を取得するには・・・・・。 イチロー 03/11/7(金) 13:05 質問
【8904】Re:指定位置のグラフ要素を取得するには・・... kein 03/11/7(金) 21:35 発言
【8908】Re:指定位置のグラフ要素を取得するには・・... ichinose 03/11/7(金) 21:55 回答

【8886】指定位置のグラフ要素を取得するには・・...
質問  イチロー E-MAIL  - 03/11/7(金) 13:05 -

引用なし
パスワード
   どうもはじめましてです。このホームページで次に書いてるのを見ました

*********************************************************
『Chartでイベント処理を行う−指定位置のグラフ要素を取得するには』( Exc
el97,2000 ) 
グラフ上でのマウス操作によりグラフ上の要素を指定して処理を行うとき、
GetChartElementメソッドやBeforeDoubleClickイベントを使用します。

サンプルでは、棒グラフ上のデータ系列上のデータ要素1つをクリック
したときに、対象となるデータ要素の項目と値を取得しています。

※X,Y座標を利用するため、MouseUpイベントを用いています。

(サンプル1)
※グラフシートのモジュールに貼り付けて棒グラフをクリックしてください。

Private Sub Chart_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
Dim Var As Variant
Dim Msg As String

'GetChartElementメソッドを用いてクリックしたデータ系列を取得。
'第三引数以降に対象オブジェクトの情報が格納される
’※データ系列の場合は第四引数:SeriesIndex,第五引数:PointIndex
ActiveChart.GetChartElement x, y, ElemID, Arg1, Arg2

'変数ElemIDに格納されたElementIDにより処理を分岐
Select Case ElemID '定数値の詳細はヘルプを参照
  
  Case xlSeries 'データ系列
  'GetChartElementの第五引数に格納された情報(ここではPointIndex)
  'をもとにSeriesオブジェクトから項目名と値を取得
  Var = ActiveChart.SeriesCollection(Arg1).XValues
  Msg = "要素:" & Var(Arg2)

  Var = ActiveChart.SeriesCollection(Arg1).Values
  Msg = Msg & vbCrLf & "値:" & Var(Arg2)

  MsgBox Msg

Case Else
  'その他の処理

End Select

End Sub
*********************************************************

これは、グラフシートのモジュールに貼り付けてください!と書いてあります
が、自分は標準モジュールに貼り付けたいのです。
実際、グラフシートは始めは存在しないため、グラフシートのモジュールにプ
ログラムを張ることが出来ません。VBAを実行する事でグラフシートを新規に
作成し、そのグラフシートにおいてクリックして要素を読み込みたいのですが
、標準モジュールに貼り付けても動作してくれません。
何か良い方法は無いでしょうか?

ごちゃごちゃしましたけどよろしくお願いします。

【8904】Re:指定位置のグラフ要素を取得するには・...
発言  kein  - 03/11/7(金) 21:35 -

引用なし
パスワード
   Excelファンクラブの方へ、回答しておきました。

【8908】Re:指定位置のグラフ要素を取得するには・...
回答  ichinose  - 03/11/7(金) 21:55 -

引用なし
パスワード
   ▼イチロー さん:
こんばんは。

>これは、グラフシートのモジュールに貼り付けてください!と書いてあります
>が、自分は標準モジュールに貼り付けたいのです。
ご提示された Chart_MouseUpは、イベントプロシジャーですから、標準モジュールには
記述する事が出ません。
これは、クラスモジュールに記述する事で可能となります。
クラスモジュール(クラス名は、既定名のClass1にしておきます)に
'======================================================
Public WithEvents cht As Chart
'===================================================================
'↓以下のコードは、イチローさんがご提示されたコードをほんのちょっとだけ
'変更した内容です。

Private Sub cht_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
  Dim Var As Variant
  Dim Msg As String


  cht.GetChartElement x, y, ElemID, Arg1, Arg2
'  ↑このオブジェクト変数の変更
   Select Case ElemID '定数値の詳細はヘルプを参照
 
   Case xlSeries 'データ系列
     Var = cht.SeriesCollection(Arg1).XValues
     '   ↑このオブジェクト変数の変更

     Msg = "要素:" & Var(Arg2)
     Var = cht.SeriesCollection(Arg1).Values
     Msg = Msg & vbCrLf & "値:" & Var(Arg2)
     MsgBox Msg

   Case Else
  'その他の処理

   End Select

End Sub


次に標準モジュールに、
'======================================================
Public cht_class As Class1
'=====================================================
Sub main()
  
  Call サンプル作成(Sheets("Sheet1"))
  
  Charts.Add
  With ActiveChart
    .ChartType = xlColumnClustered
    .SetSourceData Source:=Sheets("Sheet1").Range("A1:B7"), PlotBy:= _
    xlColumns
    .Location Where:=xlLocationAsNewSheet
    .HasTitle = True
    .ChartTitle.Characters.Text = "身長(cm)"
    .Axes(xlCategory, xlPrimary).HasTitle = True
    .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "氏名"
    .Axes(xlValue, xlPrimary).HasTitle = False
  End With
  Set cht_class = New Class1
  Set cht_class.cht = ActiveChart
End Sub
'================================================================
Sub サンプル作成(sht As Worksheet)
  With sht
    .Range("a1:a7") = WorksheetFunction.Transpose(Array("氏名", "A", "B", "C", "D", "E", "F"))
    .Range("b1:b7") = WorksheetFunction.Transpose(Array("身長(cm)", 150, 160, 170, 180, 145, 155))
    End With
End Sub

としてみて下さい。
標準モジュールのMainを実行してみて下さい(Sheet1という名前のシートは作っておいて下さいね)。
チャートシートが作成されるはずですから、そこでイベントが実行されるかどうか
試してみて下さい。


>実際、グラフシートは始めは存在しないため、グラフシートのモジュールにプ
>ログラムを張ることが出来ません。VBAを実行する事でグラフシートを新規に
>作成し、そのグラフシートにおいてクリックして要素を読み込みたいのですが
>、標準モジュールに貼り付けても動作してくれません。
>何か良い方法は無いでしょうか?
>
>ごちゃごちゃしましたけどよろしくお願いします。

12742 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free