[[20191113000448]] 『散布図にセル参照したラベルをつけたい(excel 201』(Yuki) ページの最後に飛ぶ

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

 

『散布図にセル参照したラベルをつけたい(excel 2016 mac)』(Yuki)

初めて質問させていただきます。アナログ人間です。macはOS majoveです。
散布図にセルを参照したラベルをつけたくて、いろいろ調べたのですが、excell 2016 macでは、ラベルの選択肢にX軸の値、Y軸の値しかなく、セル参照をすることができないように思います。フリーで公開されていたマクロも使おうとしてみましたが、値が多くなるとうまく動きません。何かいい方法はありませんでしょうか。ちなみに散布図にしたい値は1500個で、試してみたマクロは、http://excelcharts.biz/ultimate/scatter/
http://www.appspro.com/Utilities/ChartLabeler.htm
の2つです。
1つ目は、データが3,4個だと動くのですが、100個で試すと止まってしまいます。
2つ目はそもそも動きません。
まる二日格闘しましたが、解決できません。お助けください。

< 使用 Excel:Excel2016mac、使用 OS:MacOSX >


1500個ものラベルを表示させたいということが
無理な注文です。
(γ) 2019/11/13(水) 00:34

最初のサイトのマクロですが、
100個で止まるわけはないと思う。
試したら1000行まで表示した。(Excel2010,Win7)
予想どおりラベルが重なって判別困難になるが。
どうしても個別情報が必要なら表を添付すべき。
グラフの目的から逸脱している。

ちなみにコードミスがある。
誤 x1R1C1
正 xlR1C1
Option Explicitを書いておきさえすれば防げる訳だが。
(γ) 2019/11/13(水) 06:23


1000が上限という意味ではないです。
1000でテストしたというまでのことです。
(γ) 2019/11/13(水) 06:33

ラベルは文字列を表示するためだけの単純なコントロールなので、Windowsでもセルとのリンクはできなかったと思いますよ。 ActiveXのテキストボックスならそういう事ができますが。 それでも、私も1500個もラベルを配置するなんて無謀だと思いますね。

外部ストレージに置いたファイルは私は決して見る事はありませんが、実現できていないという事は、参照するまでもないものかと思います。 私からの提案は、グラフ機能で散布図を作成するのではなく、マクロを使ってX軸Y軸を計算、1点ずつ円の図形を配置する事です。 図形はクリックするとマクロ実行するようにしておき、1点に関する情報をフォームで表示するようにすれば、ラベルを点数分置く必要は無いでしょう。 円の図形は点数分置きますけど。
(???) 2019/11/13(水) 09:10


Windows版だと2013から標準できるようなので、Macも最新バージョンだとできるかも。
ただ皆さんコメントされているように、1500個もあると識別できないと思います。
というか、ばらけたデータでもマーカーだけでプロットエリアが占拠されました。
結果がイメージできているのでしょうか。

(マナ) 2019/11/13(水) 20:00


確かに、最新のバージョンでは、セル範囲を指定して、それをデータラベルに表示することが可能でした。
ラベルが判別可能で適当な個数は、感覚的にはせいぜい50個くらいじゃないですか?
値が集中すると、ラベルそのものが重なってきます。
その重なりを調整することは既定の機能にはありませんが、
工夫次第で調整することも可能です。昔、コードを書いたことがあります。
(γ) 2019/11/14(木) 00:30

クリックした点のみ、元データの隣のセル値をラベル表示します。
ただ、1500個もデータがあるとなると
間違えずにクリックすること自体が困難かもしれません。

マクロは、ここを参考にしています。
https://www.moug.net/tech/exvba/0020010.html

使い方
1)下記のコードを、ThisWorkbookモジュールにコピペ
2)グラフを選択し、 Sub SetChtEvent()を実行
3)ラベル表示したい点を、1個ずつクリック

 Option Explicit

 Private WithEvents myCht As Chart

 Sub SetChtEvent()
    Set myCht = Nothing
    On Error Resume Next
    Set myCht = ActiveChart
    On Error GoTo 0
    If myCht Is Nothing Then
        MsgBox "グラフを選択してから実行してください"
    End If

 End Sub

 Private Sub myCht_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 ser As Series
    Dim p As Point

    myCht.GetChartElement x, y, ElemID, Arg1, Arg2
    If ElemID <> xlSeries Then Exit Sub
'
    Set ser = myCht.SeriesCollection(Arg1)
    Set p = ser.Points(Arg2)

    If p.HasDataLabel Then
        p.DataLabel.Delete
    Else
        p.HasDataLabel = True
        p.DataLabel.Font.Size = 32
        p.DataLabel.Font.Color = vbRed
        p.DataLabel.Text = Range(Split(ser.Formula, ",")(1)).Cells(Arg2, 0).Value
    End If

End Sub

 Private Sub myCht_Deactivate()
    Dim ser As Series

    For Each ser In myCht.SeriesCollection
        On Error Resume Next
        ser.DataLabels.Delete
        On Error GoTo 0
    Next

 End Sub

(マナ) 2019/11/14(木) 20:23


 マナさん 拝見しました。すばらしい。これだと数の制約はほぼ無いに等しくなりますね。

 ところで、普通は特徴あるポイントに限定してデータラベルを付けることに
 なるのでしょうけど、
 DataLabelとポイントをコネクターで結んだらよかろうとトライしたのですが、
 DataLabelというのは普通の図形とちがってコネクターに反応しないんですねえ。

 それと、myCht_Deactivateというのは結構、地雷として機能してしまいそうですね。 
 シートのどこかのセルを選択してしまうと、たちまち苦労したデータラベルが消えちゃいます。
 ボタンにマクロを登録するなどして、意識的な操作にしたほうがよいかもしれませんね。

 ところで質問者さんはどうされたのですかね。
(γ) 2019/11/15(金) 08:41

 >DataLabelというのは普通の図形とちがってコネクターに反応しないんですねえ。

 2013以降のバージョンは、デフォルトで引出線付きラベルなのですが
 Mac版は、2010と同じかもしれませんね。
 だとすると、???さんご提案の図形でグラフを表現することになるでしょうか。

 >myCht_Deactivateというのは結構、地雷として機能してしまいそう

 確かに、そうですね。
(マナ) 2019/11/15(金) 19:46

失礼しました。
確かにデフォルトで引き出し線を使用することになっていました。

データラベルのボックスを少し離れたところに移動させたら引き出し線が
表示されました。

# やはりグラフのイベントプロシージャでなんとかしたいですね。

(γ) 2019/11/15(金) 20:22


質問者さんの求めるものとは違うのでひかえていましたが
もう見てなさそうなので。

 1)2010やMacでは、ラベルに引き出し線がなさそうなので、図形で描いてみました。
 2)ラベルの代わりに、図形の吹き出しも使ってみましたが、イベントが使えず今ひとつでした。
     吹き出しならセル参照が使えるメリットがあるのですが…

 Private Sub myCht_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 ser As Series
    Dim p As Point
    Dim n As String
    Dim sp As Shape
    Dim dl As DataLabel

    myCht.GetChartElement x, y, ElemID, Arg1, Arg2
    n = Join(Array("Label", Arg1, Arg2))

    If ElemID = xlSeries Then
        Set ser = myCht.SeriesCollection(Arg1)
        Set p = ser.Points(Arg2)
        If p.HasDataLabel Then
            p.DataLabel.Delete
            On Error Resume Next
            myCht.Shapes(n).Delete
            On Error GoTo 0
        Else
            p.HasDataLabel = True
            Set dl = p.DataLabel
            dl.Position = xlLabelPositionRight
            dl.Font.Size = 18
            dl.Font.Color = vbRed
            dl.Text = Range(Split(ser.Formula, ",")(1)).Cells(Arg2, 0).Value
            SetLeaderLine p, dl, n
        End If
    ElseIf ElemID = xlDataLabel Then
        Set p = myCht.SeriesCollection(Arg1).Points(Arg2)
        Set dl = p.DataLabel
        On Error Resume Next
        myCht.Shapes(n).Delete
        On Error GoTo 0
        SetLeaderLine p, dl, n
    End If

 End Sub

 Sub SetLeaderLine(p As Point, dl As DataLabel, n As String)
     Dim t As Double, l As Double, w As Double, h As Double
     Dim endX As Double, endY As Double
     Dim sp As Shape

    l = dl.Left
    t = dl.Top
    w = dl.Width
    h = dl.Height

    endY = IIf(p.Top < t, t, IIf(p.Top > t + h, t + h, t + h * 0.5))
    endX = IIf(p.Left < l, l, IIf(p.Left > l + w, l + w, l + w * 0.5))

    Set sp = myCht.Shapes.AddConnector(msoConnectorStraight, p.Left, p.Top, endX, endY)
     sp.Name = n

 End Sub

(マナ) 2019/11/20(水) 22:43


コメント返信:

[ 一覧(最新更新順) ]


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