三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

Excel VBA グラフのラベルとセルをリンク As DataLabel InsertChartField msoChartFieldFormula

Dim oLABEL As DataLabel
グラフのデータラベルオブジェクトに対して表示フィールドの追加
oLABEL.Format.TextFrame2.TextRange _
.InsertChartField msoChartFieldFormula, "=Sheet1!$C$7"
で、シートのセルとリンクさせる、そんなテスト動画です。
youtu.be
https://youtu.be/JzNQfoIUF5I
目次
00:00 0.やりたいこと
01:21 2番目のラベルにセルの値C7を表示
03:22 二回InsertChartFieldするバグ候補のテスト
04:06 シート名指定が無いとエラー発生
05:08 データラベルが無い初期状態だとDataLabelsでエラー発生
06:20 2.ラベルを削除してから、セルとリンクさせる
09:25 %表示のテスト msoChartFieldPercentage
10:55 3.ループで複数のラベルとリンクさせる
16:09 4.棒グラフでもテスト
18:27 セルの計算式 と ラベル

0.やりたいこと
グラフのラベルとセルをリンクさせる。
まず、手作業、手動を見せてから、
VBA マクロの方法を説明する

シートとグラフラベルのリンク

1.テストで、円グラフの2番目のラベルにセルの値C7を表示させてみます

グラフのラベルに対して
.InsertChartField
で、セルを指定できました。

    Dim oLABEL As DataLabel  'グラフのラベル
    Set oLABEL = oCHART.Chart.SeriesCollection(1).DataLabels(2)
    'テストなので、↑系列1の二番目のラベルデータと決め打ちしました

    'データラベルに表示フィールドの追加
    oLABEL.Format.TextFrame2.TextRange _
            .InsertChartField msoChartFieldFormula, "=Sheet1!$C$7"

※ラベルなしの初期の時、エラー。チェックを調べる

2.ラベルを削除してから、セルとリンクさせる

    'データラベルをまずクリアする(前の設定を消す)
    oLABEL.Delete  '少し怖いけど.Deleteで削除、削除後のObjに↓可能なのが不思議?まぁ気にしない
    
    'データラベルに値の表示を追加
    'msoChartFieldValue  5 データ フィールドの値を指定します。
    oLABEL.Format.TextFrame2.TextRange _
            .InsertChartField msoChartFieldValue
    
    '↑その他、円グラフなら%表示などもあります
    'msoChartFieldPercentage 3   値の割合を指定します。
    
    'データラベルに表示フィールドの追加 これで値+セルのラベルが作れる
    oLABEL.Format.TextFrame2.TextRange _
            .InsertChartField msoChartFieldFormula, "=Sheet1!$C$7"

3.ループでラベルの行とリンクさせる

いつもの、.Countでラベル数がわかるので、
SeriesCollection(1).DataLabels.Count
ループさせてみました。

    '系列1 SeriesCollection(1).DataLabels の ラベル数分繰り返す
    For n = 1 To oCHART.Chart.SeriesCollection(1).DataLabels.Count
        Set oLABEL = oCHART.Chart.SeriesCollection(1).DataLabels(n)
        '↑系列1のn番目のラベルデータを代入

        'データラベルをまずクリアする(前の設定を消す)
        oLABEL.Delete  '少し怖いけど.Deleteで削除、削除後のObjに↓可能なのが不思議?まぁ気にしない
    
        'データラベルに値の表示を追加
        'msoChartFieldValue  5 データ フィールドの値を指定します。
        oLABEL.Format.TextFrame2.TextRange _
                .InsertChartField msoChartFieldValue
    
        'データラベルに表示フィールドの追加 これで値+セルのラベルが作れる
        '"=Sheet1!$C$7"の文字列を作る
        strADDRESS = "=" & ActiveSheet.Name & "!" & r.Offset(0, n).Address
        oLABEL.Format.TextFrame2.TextRange _
                .InsertChartField msoChartFieldFormula, strADDRESS
    Next n

4.棒グラフでもテスト

棒グラフのラベルに対して、テストしてみました。

シート2の棒グラフでテストする。

棒グラフのラベルとリンク

5.終わりのあいさつ

Excel グラフ ラベルの処理で参考となれば幸いです。
テストコードをアレンジして使ってみてください。

ソースコード
00:00 0.やりたいこと
01:21 2番目のラベルにセルの値C7を表示
03:22 二回InsertChartFieldするバグ候補のテスト
04:06 シート名指定が無いとエラー発生
05:08 データラベルが無い初期状態だとDataLabelsでエラー発生
06:20 2.ラベルを削除してから、セルとリンクさせる
09:25 %表示のテスト msoChartFieldPercentage
10:55 3.ループで複数のラベルとリンクさせる
16:09 4.棒グラフでもテスト
18:27 セルの計算式 と ラベル

Option Explicit

Sub Macro1円グラフラベル初期化()

    ActiveSheet.ChartObjects("グラフ 1").Activate
    ActiveChart.FullSeriesCollection(1).Select
    
    'データラベル 値を表示 マクロ記録より
    ActiveChart.FullSeriesCollection(1).ApplyDataLabels xlDataLabelsShowNone
    '↑一回、xlDataLabelsShowNoneで消してから、再度↓表示で初期化もどき
    ActiveChart.FullSeriesCollection(1).ApplyDataLabels
    
    'フォントのサイズも初期化されたので大きくした
    ActiveChart.FullSeriesCollection(1).DataLabels.Select
    Selection.Format.TextFrame2.TextRange.Font.Size = 24
    
    Range("D8").Select

End Sub

'ラベルの追加テスト
'2番目のデータラベルでセルの値を参照するようにセットしてみた
Sub test1ラベルにセル参照を追加20221012()
    Range("a1").Select
    
    Dim oCHART As ChartObject   'グラフ、チャート
    Set oCHART = ActiveSheet.ChartObjects("グラフ 1") '代入してから使ってみた

    Dim oLABEL As DataLabel  'グラフのラベル
    Set oLABEL = oCHART.Chart.SeriesCollection(1).DataLabels(2)
    'テストなので、↑系列1の二番目のラベルデータと決め打ちしました

    'データラベルに表示フィールドの追加
    oLABEL.Format.TextFrame2.TextRange _
            .InsertChartField msoChartFieldFormula, "=Sheet1!$C$7"
    

    '↑.InsertChartFieldなので、二回繰り返すと、
    '当然、追加で追記で増えていきます。※不具合候補
    'んっ?ラベルの値が消えるのは?追記なの?じゃないの?どっち?

    '注意2 "=Sheet1!$C$7" で、シート名が無いとエラーになった
    '他の指定方法が無いか、チェックする
    
    MsgBox "ラベルを設定終了、確認してください"

End Sub

'ラベルの追加テスト
'ラベルを消してから、値とセル参照を追加してみた
'2番目のデータラベルでセルの値を参照するようにセットしてみた
Sub test2ラベルを消してからセル参照を追加20221012()
    
    Dim oCHART As ChartObject   'グラフ、チャート
    Set oCHART = ActiveSheet.ChartObjects("グラフ 1") '代入してから使ってみた

    Dim oLABEL As DataLabel  'グラフのラベル
    Set oLABEL = oCHART.Chart.SeriesCollection(1).DataLabels(2)
    'テストなので、↑系列1の二番目のラベルデータと決め打ちしました

    'データラベルをまずクリアする(前の設定を消す)
    oLABEL.Delete  '少し怖いけど.Deleteで削除、削除後のObjに↓可能なのが不思議?まぁ気にしない

    'データラベルに値の表示を追加
    'msoChartFieldValue  5 データ フィールドの値を指定します。
    oLABEL.Format.TextFrame2.TextRange _
            .InsertChartField msoChartFieldValue
    
    '↑その他、円グラフなら%表示などもあります
    'msoChartFieldPercentage 3   値の割合を指定します。
    
    'データラベルに表示フィールドの追加 これで値+セルのラベルが作れる
    oLABEL.Format.TextFrame2.TextRange _
            .InsertChartField msoChartFieldFormula, "=Sheet1!$C$7"

    '注意2 "=Sheet1!$C$7" で、シート名が無いとエラーになった
    '他の指定方法が無いか、チェックする
    
    MsgBox "ラベルを設定終了、確認してください"
    
End Sub


'ラベルの追加テスト
'複数のラベルに対して、
'データラベルでセルの値を参照するようにセットしてみた
Sub test3複数ラベルにセル参照を追加20221012()
    
    Dim oCHART As ChartObject   'グラフ、チャート
    Set oCHART = ActiveSheet.ChartObjects("グラフ 1") '代入してから使ってみた

    Dim oLABEL As DataLabel  'グラフのラベル
    Dim strADDRESS As String 'シート!$A$1 の番地を作る
    Dim n      As Integer    'n番目のラベル
    Dim r      As Range      '基準のセル、ここから左のセルをラベルとリンクさせる
    Set r = Range("A7") 'A7を基準、B7..をリンクさせる
    
    '系列1 SeriesCollection(1).DataLabels の ラベル数分繰り返す
    For n = 1 To oCHART.Chart.SeriesCollection(1).DataLabels.Count
        Set oLABEL = oCHART.Chart.SeriesCollection(1).DataLabels(n)
        '↑系列1のn番目のラベルデータを代入

        'データラベルをまずクリアする(前の設定を消す)
        oLABEL.Delete  '少し怖いけど.Deleteで削除、削除後のObjに↓可能なのが不思議?まぁ気にしない
    
        'データラベルに値の表示を追加
        'msoChartFieldValue  5 データ フィールドの値を指定します。
        oLABEL.Format.TextFrame2.TextRange _
                .InsertChartField msoChartFieldValue
    
        'データラベルに表示フィールドの追加 これで値+セルのラベルが作れる
        '"=Sheet1!$C$7"の文字列を作る
        strADDRESS = "=" & ActiveSheet.Name & "!" & r.Offset(0, n).Address
        oLABEL.Format.TextFrame2.TextRange _
                .InsertChartField msoChartFieldFormula, strADDRESS
    Next n
    
    MsgBox "ラベルを複数設定終了、確認してください"
        
End Sub


XlDataLabelsType 列挙 (Excel)
learn.microsoft.com

適用するデータ ラベルの種類を指定します。

名前 値 説明
xlDataLabelsShowBubbleSizes 6 絶対値に対するバブルのサイズを表示します。
xlDataLabelsShowLabel 4 データ要素の属する分類名。
xlDataLabelsShowLabelAndPercent 5 全体のパーセンテージと要素の項目名。 円グラフとドーナツ グラフだけに指定できます。
xlDataLabelsShowNone -4142 データ ラベルなし。
xlDataLabelsShowPercent 3 全体のパーセンテージ。 円グラフとドーナツ グラフにだけ指定できます。
xlDataLabelsShowValue 2 データ要素の属する既定値 (この引数が指定されていない場合)。

TextRange2.InsertChartField メソッド (Office)
learn.microsoft.com

式。InsertChartField (ChartFieldType, Formula, Position)

パラメーター
名前 必須 / オプション データ型 説明
ChartFieldType 必須 MsoChartFieldType データ ラベルに挿入するグラフ フィールドの種類を指定します。
Formula 省略可能 String ChartFieldType パラメーターに msoChartFieldFormula 定数が渡される場合は、セル (またはセル範囲) を指定 します。

MsoChartFieldType 列挙 (Office)
learn.microsoft.com

グラフのデータ ラベルに挿入するデータ フィールドの種類を指定します。

名前 値 説明
msoChartFieldBubbleSize 1 データ ポイントのバブル サイズを指定します。
msoChartFieldCategoryName 2 データ ポイントのカテゴリ名のサイズを指定します。
msoChartFieldFormula 6 データ ポイントで使用する数式を指定します。
msoChartFieldPercentage 3 値の割合を指定します。
msoChartFieldSeriesName 4 データ系列名を指定します。
msoChartFieldValue 5 データ フィールドの値を指定します。
msoChartFieldRange 7 データ範囲の値を指定します。

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)