[[20080311152300]] 『エクセルグラフ内データのポップアップ表示』(ひろ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『エクセルグラフ内データのポップアップ表示』(ひろ)

 エクセルでグラフを作成し、グラフ中の点にマウスを重ねるとポップアップウインドウが出て値が表示されますが、
 データの値ではなく任意の文字列を表示させることは出来ますか? 
 散布図の各点にマウスを持って行くと、その点の別の列の文字列が表示させるようにしたいのです。
 例えば、打率とホームランをX軸とY軸にした散布図を描き、それぞれの点にマウスを持って行くと、
 バッターの名前がポップアップで表示されるようにしたいのです。

 Excel 2004 for macです。よろしくお願いします


 散布図のラベル表示の問題のようですね。
 下記のプラグインをインストールすると、任意の文字列(バッターの名前)をラベルとして表示できます。
 XY Chart Laberer
http://www.appspro.com/Utilities/ChartLabeler.htm
 (wisemac21)

 ありがとうございます。
点(サンプル)の数が多くて、常時ラベルを表示していると、グラフがとても混雑してしまいます。
出来ればポップアップが良いのですが、何か方法がないでしょうか。。。


 [wisemac21]さんが示されたラベル表示の方法がダメなら
 マクロで選手名だけポップアップが可能かもしれませんが
 データ加工して、基本操作だけの方法です、手間がかかりますが...

  詳しくないので↓を参考にしました。昨年のデータのようですが。
http://www.din.or.jp/~nakatomi/record/nendo/index_ys.html

 選手名	打率	本塁打
 青木	346	20
 ラミレス	343	29
 谷	318	10
 小笠原	313	31
 栗原	310	25

 ↑このようなデータを↓このように加工して

 	A	B	C	D	E	F
 1	打数	青木	ラミレス	谷	小笠原	栗原
 2	346	20				
 3	343		29			
 4	318			10		
 5	313				31	
 6	310					25

 範囲を一度に全て選択するのではなく、
 A1:A6とB1:F6を、+Ctrlで分けて選択し、
 ウィザード1/4で「散布図」次へ、2/4で「列」にチェックし 完了。
 空白データのマーカーがY軸0に出るので「該当マーカー」を
 「一つずつ」選択して[データ要素の書式設定]から「マーカーなし」にします。
 「列系列」散布図なので各種設定も系列分繰り返す事が多くなります。
 選手数が増えると大変ですが。

 本塁打、打率(X軸/Y軸)を入れ替えたいなら、データ加工をし直します。

 データが毎日変わると思うので、実データを別シートにでも作り
 グラフ用データはそれを参照させるなどの工夫が必要かもしれません。
 選手名のラベル表示も一つずつ設定ですが可能のようです。
 きっちりしたグラフを一度作成し、「ユーザー定義」に追加し、
 選手数の変化や次回作成時に少しは楽になる気もします。

 ポップアップ表示データは選手名以外も表示されますが、基本操作だけではこんなところでしょうかね。
 とても手間暇がかかりやっかいですし、データの変化に全て対応してるかどうか未検証です。
 参考程度にでも思ってください。     (jun53)

 加工したデータの空白セルを =na() で埋め、条件付き書式等で見えなくします。
 このようにすると、

 >空白データのマーカーがY軸0に出るので「該当マーカー」を
 >「一つずつ」選択して[データ要素の書式設定]から「マーカーなし」にします。

 ↑この作業が不必要になるようです。     (jun53)

 ちょっと、仕様がちがいますが、「氏名を表示したいプロットをクリックしたら、氏名表示をする」
 ではどうでしょうか?

 VBAで処理しました。

 新規ブックに適当なシートのモジュールに(標準モジュールではありませんよ)

 '===================================================================================
 Dim WithEvents cht As Chart
 Private txt As Shape
 Sub mk_sammple()
    Dim mkcht As Chart
    With Me
       .Range("a1:c1").Value = Array("NAME", "AVE", "HR")
       With .Range("a2:c27")
          .Formula = Array("=rept(char(row()+63),5)", "=round(rand(),3)", "=int(rand()*50)")
          .Value = .Value
         End With
       End With
    Set mkcht = ThisWorkbook.Charts.add
    With mkcht
       .ChartType = xlXYScatter
       .SetSourceData Source:=Me.Range("A1:c27"), PlotBy:=xlColumns
       .SeriesCollection(1).Delete
       .SeriesCollection(1).XValues = _
                               "=" & Me.Name & "!R2C2:R27C2"
       .Location Where:=xlLocationAsObject, Name:=Me.Name
      End With
    Call set_obj
    ActiveWindow.Visible = False
    Me.Select
    ActiveCell.Select
 End Sub
 '=========================================================================== 
 Sub set_obj()
   Dim srs As Series
   Application.EnableEvents = False
   Set cht = Me.ChartObjects(1).Chart
   Set srs = cht.SeriesCollection(1)
   Application.EnableEvents = True
 End Sub
 '===========================================================================
 Sub reset_obj()
   Set cht = Nothing
 End Sub
 '===========================================================================
 Function edit_addr(add, podr As Long) As String
   Dim idx As Long, jdx As Long
   Dim ans()
   Dim wk As Variant
   wk = Split(Replace$(Replace$(add, "=SERIES(", ""), "," & podr & ")", ""), ",")
   jdx = 1
   For idx = LBound(wk) To UBound(wk)
      If TypeName(Application.Evaluate(wk(idx))) = "Range" Then
        ReDim Preserve ans(1 To jdx)
        ans(jdx) = wk(idx)
        jdx = jdx + 1
        End If
      Next
   If jdx > 1 Then
      edit_addr = Join(ans(), ",")
   Else
      edit_addr = ""
      End If
 End Function
 '====================================================================================
 Private Sub cht_Activate()
   Debug.Print "ok"
   Application.EnableEvents = False
    cht.Parent.Select
    cht.ChartArea.Select
    cht.SeriesCollection(1).Select
    Set txt = cht.Shapes.AddTextbox(msoTextOrientationHorizontal, 0, 0, 100, 100)
    With txt
      .Fill.ForeColor.SchemeColor = 13
      .Fill.Visible = msoTrue
      .Line.Visible = msoTrue
      .TextFrame.AutoSize = True
      .Visible = msoFalse
      End With
    Application.EnableEvents = True
 End Sub
 '====================================================================================
 Private Sub cht_deactivate()
    On Error Resume Next
    txt.Delete
 End Sub
 '============================================================================================
 Private Sub cht_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
   Dim paobj As ChartObject
   Set paobj = cht.Parent
   With txt
     .Left = 0.75 * x
     .Top = 0.75 * y
     .ZOrder msoBringToFront
     End With
 End Sub
 '======================================================================================
 Private Sub cht_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long)
    Dim srs As Series
    Dim srsstr As Variant
    Dim addr As Variant
    Dim xaddr As String
    Dim yaddr As String
    If ElementID = xlSeries Then
       Set srs = cht.SeriesCollection(Arg1)
       srsstr = Split(edit_addr(srs.Formula, srs.PlotOrder), ",")
       xaddr = srsstr(UBound(srsstr) - 1)
       yaddr = srsstr(UBound(srsstr))
       If Arg2 = -1 Then
          Arg2 = 1
          srs.Points(Arg2).Select
          End If
       If Arg2 > 0 Then
          txt.Visible = True
          txt.TextFrame.Characters.Text = Application.Range(xaddr).Offset(0, -1).Cells(Arg2).Value
          txt.TextFrame.AutoSize = True

          End If
       End If
 End Sub

 として、mk_sammpleを実行してください。上記のモジュールを記述したシートモジュールに対応する
 シートに散布図を作成します。名前(A列の文字列)を表示したいプロットをクリックしてください。
 近くに表示されるはずです。

 グラフではなく、適当なセルクリックで表示は消えます。

 検討してみてください。

 ichinose


ああっ、Macなんですか?

Win2000 Excel2002では上記コードの確認をしていますが、
Macなら????です。

ichinose


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.