← コード一覧へ戻る
実務グラフ

利益率の系列を第2軸へ移す

売上を主軸、利益率の折れ線を第2軸に配置し、右側の目盛りをパーセント表示にします。

実行前に確認

  • 既存のシートやグラフを変更しない練習例です。「VBAグラフ5035」が既にある場合は中止します。再実行は新しい練習ブックで行うか、作成済みの練習シートを自分で別名にしてから行ってください。
  • この例は公式API仕様を参照して作成しています。Excel実機での動作確認は行っていません。エラー時に作成途中の練習シートが残る場合があります。
  • 2軸グラフは別々の尺度を使います。棒と線の高さを直接比較できないため、左右の単位と軸タイトルを明示します。
  • AxisGroupは系列の描画先を変更します。元データの値や単位を変換する機能ではありません。
  • 8%にしたいとき、コードのValueには8ではなく0.08を指定します。8を入れて0%形式にすると800%表示になります。NumberFormatは見た目の書式を変えるだけで、値そのものを100分の1にはしません。

1サンプルコード

Option Explicit

Sub Example5035()
    Dim ws As Worksheet, co As ChartObject
    On Error GoTo Failed
    '新しい練習シートだけを作成・変更します。
    Set ws = NewSheet5035()
    If ws Is Nothing Then Exit Sub
    ws.Range("C1").Value = "利益率"
    ws.Range("C2").Value = 0.08
    ws.Range("C3").Value = 0.12
    ws.Range("C4").Value = 0.05
    ws.Range("C5").Value = 0.1
    ws.Range("C2:C5").NumberFormat = "0%"
    Set co = ws.ChartObjects.Add(ws.Range("E2").Left, ws.Range("E2").Top, 420, 250)
    co.ShapeRange.Item(1).Name = "練習グラフ"
    co.Chart.ChartType = xlColumnClustered
    co.Chart.SetSourceData Source:=ws.Range("A1:C5"), PlotBy:=xlColumns
    'ここから今回の操作です。
    With co.Chart.SeriesCollection(2)
        .ChartType = xlLineMarkers
        .AxisGroup = xlSecondary
    End With
    With co.Chart.Axes(xlValue, xlSecondary)
        .TickLabels.NumberFormat = "0%"
        .HasTitle = True
        .AxisTitle.Text = "利益率"
    End With
    With co.Chart.Axes(xlValue, xlPrimary)
        .HasTitle = True
        .AxisTitle.Text = "売上(万円)"
    End With
    Exit Sub
Failed:
    MsgBox "処理を中止しました: " & Err.Description, vbExclamation
End Sub

Private Function NewSheet5035() As Worksheet
    Const SHEET_NAME As String = "VBAグラフ5035"
    Dim item As Object, ws As Worksheet
    Dim data As Variant, r As Long, c As Long
    '同名シートがあれば、上書きせずに終了します。
    For Each item In ThisWorkbook.Sheets
        If StrComp(item.Name, SHEET_NAME, vbTextCompare) = 0 Then
            MsgBox SHEET_NAME & " は既にあります。別の練習ブックで試してください。"
            Exit Function
        End If
    Next item
    Set ws = ThisWorkbook.Worksheets.Add( _
        After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
    ws.Name = SHEET_NAME
    data = Array(Array("月", "売上", "計画"), _
                 Array("4月", 120, 100), Array("5月", 160, 140), _
                 Array("6月", 110, 150), Array("7月", 180, 170))
    For r = 0 To UBound(data)
        For c = 0 To UBound(data(r))
            ws.Cells(r + 1, c + 1).Value = data(r)(c)
        Next c
    Next r
    ws.Range("A1:C5").Columns.AutoFit
    Set NewSheet5035 = ws
End Function

図で見る系列ごとに軸を選ぶ

イメージ図

異なる単位を使うときは系列の種類と軸を明示します。

  1. 売上

    SeriesCollection(1)。縦棒を主軸へ表示。

  2. 利益率

    C2:C5の0.08・0.12・0.05・0.1を、8%・12%・5%・10%として表示。SeriesCollection(2)を折れ線へ変更する。

  3. 第2軸

    AxisGroup=xlSecondary。右目盛りを0%表示にする。

左右で尺度が違うため、棒と線の高さをそのまま比較しません。0%は書式の指定であり、値が0%になる意味ではありません。

コードの処理を説明する模式図です。実際の画面や実行結果を撮影したものではありません。

使い方・実行手順を確認する5つの手順で、コードの使い方を確認できます
  1. 1

    Windows版デスクトップExcelで空の練習ブックを作り、Excelマクロ有効ブック(.xlsm)として保存します。Web版ExcelではVBAを実行できません。

  2. 2

    Alt+F11でVBEを開き、[挿入]→[標準モジュール]を選びます。Option Explicitから末尾のEnd Functionまで、この例のコード全体を空の標準モジュールへ貼り付けます。

  3. 3

    Example5035のSub内にカーソルを置いてF5キーを押します。コードを入れたブックに「VBAグラフ5035」シート、A1:C5のサンプル表、埋め込みグラフ「練習グラフ」を自動作成します。別のガイドの実行は不要です。

  4. 4

    左軸は売上、右軸は利益率のパーセント目盛りになります。折れ線は8%・12%・5%・10%を示します。

  5. 5

    C2の内部の値は0.08で、セルには8%と表示されます。同様にC3は0.12→12%、C4は0.05→5%、C5は0.1→10%です。売上120・160・110・180は左軸(万円)、利益率は右軸(%)で読みます。

使っている機能の公式ドキュメント(Microsoft Learn)