Excel VBA スパークラインの作成と動的にデータ範囲を変更する方法

ExcelVBA-基礎編

今回はスパークラインの作成と動的にデータ範囲を変更方法をご説明します。

スパークラインのデータ範囲を指定する方法は「A1形式」で記載する必要があります。

そのため、ただ最終行と最終列を取得すればよいという単純なコードでは対応できません。

スパークラインの作成方法と動的にデータ範囲を設定する方法を順にご説明します。

1.スパークラインとは?

リボンにもありますが、意外と知られていないスパークラインについてご説明します。

スパークラインはExcel 2010で追加された新しい機能です。

グラフをセル内に表示します。

折れ線、縦棒、勝敗の3種類を設定する事ができ、折れ線と縦棒はセルの値を範囲内の相対でグラフ化します。

勝敗はセルの値の大きさではなく正か負でグラフ化されます。

グラフを作成しなくても「視覚化」出来るので、数値だらけのデータを見やすくします。

記述方法は次のように記述します。

SparklineGroups.Add(Type,SourceData)

タイプ一覧

スパークラインのタイプ説明
xlSparkLine折れ線
xlSparkColumn縦棒
xlSparkColumnStacked100勝敗

スパークラインのメソッド一覧

メソッド説明
Add指定した範囲にスパークラインを追加します。
ClearGroupsスパークライングループを削除します。
Clear指定した単体のスパークラインを削除します。
Ungroup指定したセルまたはセル範囲のスパークライングループを解除します。
Group指定したセル範囲のスパークラインをグループ化します。

2.スパークラインの作成方法

スパークラインを作成するには、「SparklineGroups」オブジェクトの「Add」メソッドを使用します。

固定のデータ範囲のスパークラインを作成するコードです。

データは先ほどのスパークラインのデータを使用します。

折れ線スパークライン

Sub Sample1()

    Range("H2:H6").SparklineGroups.Add _
    Type:=xlSparkLine, SourceData:="B2:G6"
    
End Sub

この様にH列にスパークラインが追加されました。

縦棒スパークライン

次は縦棒です。

スパークラインのTypeを変更します。

Sub Sample2()

    Range("H2:H6").SparklineGroups.Add _
    Type:=xlSparkColumn, SourceData:="B2:G6"
    
End Sub

3.スパークラインのデータ範囲を動的に指定する

文頭でも記載しましたが、スパークラインは「A1形式」で記載する必要があります。

そのため、動的に行列を動的にするのが意外と難しいです。

方法としては、最終行と最終列を数値で取得してから「A1形式」で記載出来るように、列を数値からA1形式に変換してデータ範囲を指定します。

それぞれ順番に説明します。

列をA1形式に変換

まずは取得した列の数値をA1形式に変換するコードを先にご説明します。

下記コードを標準モジュールに記述します。

Option Explicit

Function ConToLet(ByVal ColNo As Integer) As String

    Dim iAlpha      As Integer
    Dim iRemainder  As Integer
    
    iAlpha = Int((ColNo - 1) / 26)
    iRemainder = ColNo - (iAlpha * 26)
    
    If iAlpha > 0 Then
    
        ConToLet = Chr(iAlpha + 64)
    
    End If
    
    If iRemainder > 0 Then
    
        ConToLet = ConToLet & Chr(iRemainder + 64)

    End If

End Function

「Function」プロシージャで作成します。

「(ByVal ColNo As Integer)」で受け取った値をA1形式に変換します。

動的にスパークラインを作成

最終行と最終列を数値で取得してから、上記で作成した「Function ConToLet」プロシージャに最終列の数値を渡して、変換後にスパークラインのデータ範囲を指定します。

Sub Sample3()

    Dim MaxRow As Long
    Dim MaxCol As Long
    Dim EndCol As String 'アルファベット変換
    Dim OutCol As String 'スパークライン出力列
    
    MaxRow = Cells(Rows.Count, 1).End(xlUp).Row '最終行を取得
    MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column '最終列を取得
    
    EndCol = ConToLet(MaxCol - 1) '範囲の最終列をアルファベットに変換
    OutCol = ConToLet(MaxCol) 'スパークライン出力列をアルファベットに変換
    
    Range(OutCol & "2:" & OutCol & MaxRow).SparklineGroups.Add _
    Type:=xlSparkLine, SourceData:="B2:" & EndCol & MaxRow
    
End Sub

「MaxRow = Cells(Rows.Count, 1).End(xlUp).Row」で最終行を取得しています。

「MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column」で最終列を取得します。

「EndCol = ConToLet(MaxCol – 1)」で「Function ConToLet」プロシージャ に値を渡してA1形式に変換します。

-1しているのはスパークラインの列を含めないようにするためです。

「OutCol = ConToLet(MaxCol) 」でスパークライン出力列をアルファベットに変換します。

最後にスパークラインのデータを設定して作成します。

タイトルとURLをコピーしました