人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Excelで作成した数値データからある特定の画像(Excelで用意されていないもの。例えば、オリジナルなグラフや図等)を出力したいのですが可能でしょうか?
出来るとすればVBA等を使うことになると思うのですが、経験がないためどういったことが出来るのかよくわかりません。

●質問者: koime_ryokutya
●カテゴリ:コンピュータ インターネット
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● cx20

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

◎質問者からの返答

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

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

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ