Excelで作成した数値データからある特定の画像(Excelで用意されていないもの。例えば、オリジナルなグラフや図等)を出力したいのですが可能でしょうか?

出来るとすればVBA等を使うことになると思うのですが、経験がないためどういったことが出来るのかよくわかりません。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/09/26 21:46:40
  • 終了:2011/10/03 21:50:03

回答(1件)

id:cx20 No.1

cx20回答回数603ベストアンサー獲得回数1072011/09/27 03:22:07

Excel VBA で、Shapes オブジェクトの AddLine メソッドを使用することで独自のグラフ(線)を描画することが可能です。

■ AddLine Method [Excel 2003 VBA Language Reference]

http://msdn.microsoft.com/en-us/library/aa221724(office.11).aspx

以下、サンプルです。

' オートシェイプを使って線を描画するサンプル
' <テストデータ>
' 番号、X座標、Y座標、経路開始、経路終了
'  0,  5, 49,  0,  3
'  1,  2,  5,  0,  4
'  2, 12,  8,  1,  2
'  3, 45, 45,  2,  4
'  4,  4, 21,  2,  9
'  5, 32, 13,  9, 13
'  6, 34, 30, 11, 13
'  7, 30, 31,  1,  7
'  8, 33, 24,  5,  7
'  9, 22, 10,  5, 12
' 10, 20,  5
' 11,  8, 40
' 12, 11, 21
' 13, 37, 43

Option Explicit

Const g_nCount = 14 ' データ件数
Const g_nScale = 5 ' 倍率
Const g_nPair = 10 ' 経路数
Const g_nX_Origin = 10 ' X軸の原点の位置
Const g_nY_Origin = 10 ' Y軸の原点の位置
Const g_nX_Step = 10 ' X軸の目盛りの単位
Const g_nY_Step = 10 ' Y軸の目盛りの単位
Const g_nX_MAX = 100 ' X軸の最大値
Const g_nY_MAX = 100 ' Y軸の最大値

' メイン 
Sub Main()
    DrawGrid ' 方眼用紙の作成
    DrawLine ' 経路の描画
    DrawDot  ' 点の描画

    ' オートシェイプのグループ化
    ActiveSheet.Shapes.SelectAll
    Selection.ShapeRange.Group.Select
End Sub
 
' 方眼用紙の作成
Sub DrawGrid()
    Dim x
    Dim y
    Dim x_st ' 線の開始位置(X軸)
    Dim y_st ' 線の開始位置(Y軸)
    Dim x_ed ' 線の終了位置(X軸)
    Dim y_ed ' 線の終了位置(Y軸)
    Dim line ' オートシェイプ:線
    Dim text ' オートシェイプ:テキストボックス
    
    ' 方眼用紙の背景の描画
    x = g_nX_Origin * g_nScale
    y = 0
    ActiveSheet.Shapes.AddShape msoShapeRectangle, x, y, g_nX_MAX * g_nScale, g_nY_MAX * g_nScale

    For x = 0 To g_nX_MAX Step g_nX_Step
        With ActiveSheet
            x_st = (x + g_nX_Origin) * g_nScale
            y_st = (g_nY_MAX) * g_nScale
            x_ed = (x_st)
            y_ed = (0)
            ' 線を表示(X座標、Y座標、X座標2、Y座標2)
            Set line = .Shapes.AddLine(x_st, y_st, x_ed, y_ed)
            
            ' 番号を表示(X座標、Y座標、幅、高さ)
            Set text = .Shapes.AddTextbox(msoTextOrientationHorizontal, x_st - 15, y_st + 10, 30, 15)
            text.Select
            Selection.Characters.text = CStr(x)
            Selection.HorizontalAlignment = xlCenter ' 中央揃え
            text.Fill.Visible = msoFalse ' 非表示に
            text.line.Visible = msoFalse ' 非表示に
        End With
    Next
    For y = 0 To g_nY_MAX Step g_nY_Step
        With ActiveSheet
            x_st = (g_nX_Origin) * g_nScale
            y_st = (g_nY_MAX - y) * g_nScale
            x_ed = (g_nX_Origin + g_nX_MAX) * g_nScale
            y_ed = y_st
            ' 線を表示(X座標、Y座標、X座標2、Y座標2)
            Set line = .Shapes.AddLine(x_st, y_st, x_ed, y_ed)
            
            ' 番号を表示(X座標、Y座標、幅、高さ)
            Set text = .Shapes.AddTextbox(msoTextOrientationHorizontal, x_st - 35, y_st - 5, 30, 15)
            text.Select
            Selection.Characters.text = CStr(y)
            Selection.HorizontalAlignment = xlRight ' 右寄せ
            text.Fill.Visible = msoFalse ' 非表示に
            text.line.Visible = msoFalse ' 非表示に
        End With
    Next
End Sub

' 点の描画
Sub DrawDot()
    Dim n ' データの番号
    Dim x ' 線の開始位置(X軸)
    Dim y ' 線の開始位置(Y軸)
    Dim i ' ループカウンタ
   
    Dim oval ' オートシェイプ:円
    Dim text ' オートシェイプ:テキストボックス
    For i = 1 To g_nCount
        n = ActiveSheet.Cells(i, 1)
        x = (g_nX_Origin + ActiveSheet.Cells(i, 2)) * g_nScale
        y = (g_nY_MAX - ActiveSheet.Cells(i, 3)) * g_nScale
        With ActiveSheet
            ' 点(○)を表示(X座標、Y座標、幅、高さ)
            Set oval = .Shapes.AddShape(msoShapeOval, x - 2, y - 2, 5, 5)
            oval.Fill.ForeColor.SchemeColor = 10 ' 色(赤)を指定
            ' 番号を表示(X座標、Y座標、幅、高さ)
            Set text = .Shapes.AddTextbox(msoTextOrientationHorizontal, x + 10, y - 5, 20, 15)
            text.Select
            Selection.Characters.text = CStr(n)
            text.Fill.Visible = msoFalse ' 非表示に
            text.line.Visible = msoFalse ' 非表示に
        End With
    Next
End Sub
 
' 経路の描画
Sub DrawLine()
    Dim n ' データの番号
    Dim x_st ' 線の開始位置(X軸)
    Dim y_st ' 線の開始位置(Y軸)
    Dim x_ed ' 線の終了位置(X軸)
    Dim y_ed ' 線の終了位置(Y軸)
    Dim i ' ループカウンタ
   
    Dim line ' オートシェイプ:線
    For i = 1 To g_nPair
        GetXY ActiveSheet.Cells(i, 4), x_st, y_st
        GetXY ActiveSheet.Cells(i, 5), x_ed, y_ed
        x_st = (g_nX_Origin + x_st) * g_nScale
        y_st = (g_nY_MAX - y_st) * g_nScale
        x_ed = (g_nX_Origin + x_ed) * g_nScale
        y_ed = (g_nY_MAX - y_ed) * g_nScale
        With ActiveSheet
            ' 線を表示(X座標、Y座標、X座標2、Y座標2)
            Set line = .Shapes.AddLine(x_st, y_st, x_ed, y_ed)
        End With
    Next
End Sub
 
' 番号→座標の取得
Function GetXY(ByVal nPos, ByRef x, ByRef y)
    Dim n
    Dim i
    x = 0
    y = 0
    For i = 1 To g_nCount
        n = ActiveSheet.Cells(i, 1)
        If n = nPos Then
            x = ActiveSheet.Cells(i, 2)
            y = ActiveSheet.Cells(i, 3)
            Exit Function
        End If
    Next
    Exit Function
End Function
  • データ

f:id:cx20:20110927030750j:image

  • 結果

f:id:cx20:20110927030751j:image

また、Shapes オブジェクトの AddPicture メソッドを使用することで、指定座標に画像データを貼り付けることが可能です。

■ 画像ファイルを挿入する:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

http://www.moug.net/tech/exvba/0120020.html

以下、画像データを使用するように修正した場合のサンプルです。

' 点の描画(画像を使用したバージョン)
Sub DrawDot()
    Dim n ' データの番号
    Dim x ' 線の開始位置(X軸)
    Dim y ' 線の開始位置(Y軸)
    Dim i ' ループカウンタ
    
    Dim strFileName ' 画像ファイル名
    strFileName = "C:\home\edu\excel\CustomGraph\profile_l.gif"
   
    Dim pict ' オートシェイプ:画像
    Dim text ' オートシェイプ:テキストボックス
    For i = 1 To g_nCount
        n = Worksheets(g_strDataSheet).Cells(i, 1)
        x = (g_nX_Origin + Worksheets(g_strDataSheet).Cells(i, 2)) * g_nScale
        y = (g_nY_MAX - Worksheets(g_strDataSheet).Cells(i, 3)) * g_nScale
        With ActiveSheet
            ' 点(画像)を表示(X座標、Y座標、幅、高さ)
            Set pict = .Shapes.AddPicture(strFileName, False, True, x - 5, y - 5, 0, 0)
            ' 画像サイズを元画像と同じ幅、高さに設定する
            pict.ScaleWidth 1, msoTrue
            pict.ScaleHeight 1, msoTrue
            'oval.Fill.ForeColor.SchemeColor = 10 ' 色(赤)を指定
            ' 番号を表示(X座標、Y座標、幅、高さ)
            Set text = .Shapes.AddTextbox(msoTextOrientationHorizontal, x + 5, y - 5, 30, 15)
            text.Select
            Selection.Characters.text = CStr(n)
            Selection.HorizontalAlignment = xlHAlignCenter
            text.Fill.Visible = msoFalse ' 非表示に
            text.line.Visible = msoFalse ' 非表示に
        End With
    Next
End Sub
  • 結果

f:id:cx20:20110928064952p:image

id:koime_ryokutya

回答ありがとうございます。

例えば、このグラフのノード(点)を、自分で用意した画像を使う、といったことは可能でしょうか?

2011/09/27 06:16:20

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません