Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10195 / 76734 ←次へ | 前へ→

【72089】Re:散布図で画像をマーカ-位置に指定した角度で置きたい
発言  kanabun  - 12/5/28(月) 16:22 -

引用なし
パスワード
   ▼目指せマクロの達人 さん:
>EXCEL標準コマンドを使って、散布図を作成しました。
>全マーカーの代わりに同じ画像(簡単な線図)をおきたい。画像の角度がすべて同じなら、EXCELの基本機能でマーカーの代わりに、保存してある画像を指定をすれば出来ますが、ポイントごとに取り付け角度が異なります。 その角度はポイントごとにマーカーの座標とともに算出してあります。 EXCEL標準だけでは出来そうになく、VBAでこのようなことが出来るとありがたいのですが、よろしくご教示ください。
こんにちは〜
> マーカーの代わりに、保存してある画像を指定
ではないのですが、散布図の各要素から指定の方向に 矢印→ を描画する
ことなら、以前構造物のひずみ測定値のプロットでやったことがあります。
参考までにそれを今回用に多少アレンジしたものをアップします。

元データサンプル (A,B,C,D 列)
  … このうち B,C列を使って 散布図は作成してあるものとしています。
番号    X座標    Y座標    測定角度
X1    -120    200    -35
X2    -120    240    -20
X3    -120    280    35
X4    -120    320    45
X5    -60    120    30
X6    -60    160    -10
X7    -60    200    -20
X8    -60    240    0
X9    -60    280    30
X10    -60    320    45
X11    -5    120    0
X12    -5    160    30
X13    -5    200    45
X14    -5    240    50
X15    -5    280    55
X16    -5    320    80
X17    -5    360    70
X18    50    120    45
X19    50    160    45
X20    50    200    30
X21    50    240    45
X22    50    280    35
X23    50    320    45
X24    110    160    55
X25    110    200    65
X26    110    240    80
x27    150    220    90

'--------------------------------------------- 標準モジュール
Option Explicit

Type WinPoint
 x As Double
 y As Double
End Type
Private FACTx As Double, FACT0x As Double
Private FACTy As Double, FACT0y As Double

'グラフのスケール(WindowScale)を ChartのPoint座標に
' 変換する係数をもとめる
Sub SetCoef(Cht As Chart)
 Dim XMIN As Double, XMAX As Double
 Dim YMIN As Double, YMAX As Double
 Dim vxmi As Double, vxma As Double
 Dim vYmi As Double, vYma As Double, t As Double
 Dim Ax As Axis
 
 With Cht
  XMIN = .Axes(1).MinimumScale
  XMAX = .Axes(1).MaximumScale
  YMIN = .Axes(2).MinimumScale
  YMAX = .Axes(2).MaximumScale
  
  With .PlotArea
   vxmi = .InsideLeft
   vxma = vxmi + .InsideWidth
   vYma = .InsideTop
   vYmi = vYma + .InsideHeight
  End With
  If .Axes(2).ReversePlotOrder Then
   t = vYma
   vYma = vYmi
   vYmi = t
  End If
 End With
 
 FACTx = (vxma - vxmi) / (XMAX - XMIN)
 FACT0x = vxmi - FACTx * XMIN
 FACTy = (vYma - vYmi) / (YMAX - YMIN)
 FACT0y = vYmi - FACTy * YMIN
 
End Sub

Function poxy(c, f) As WinPoint
 poxy.x = c * FACTx + FACT0x
 poxy.y = f * FACTy + FACT0y
 
End Function

Private Sub AngToVector(a, r As Double, x As Double, y As Double)
  Dim ang As Double
  ang = a * WorksheetFunction.Pi / 180
  y = r * Sin(ang)
  x = r * Cos(ang)
End Sub

Sub Example1()
  Dim Cht As Chart   '対象グラフ
  Dim Ser As Series   '系列1
  Dim yRange As Range  'Y軸元データ範囲
  Dim xData       'x データ
  Dim yData       'y データ
  Dim ang        '角度データ(Y軸元データ範囲の右隣り)
  Dim Vx1#, Vx2#
  Dim Vy1#, Vy2#
  Dim PoiXY(1 To 2) As WinPoint
  Dim i&
  Const RAD# = 33 '矢印の長さ
 
  Set Cht = ActiveSheet.ChartObjects(1).Chart
  Set Ser = Cht.SeriesCollection(1)
  xData = Ser.XValues
  yData = Ser.Values
  Set yRange = Excel.Range(Split(Ser.Formula, ",")(2))
  ang = yRange.Offset(, 1).Value
  Cht.Lines.Delete 'すべての矢印を削除
  
  '★グラフ軸Scaleをポイント座標に変換する係数を求める
  SetCoef Cht
  
  '矢印描画
  For i = 1 To Ser.Points.Count
    Vx1 = xData(i)
    Vy1 = yData(i)
    PoiXY(1) = poxy(Vx1, Vy1)
    AngToVector ang(i, 1), RAD, Vx2, Vy2
    PoiXY(2) = poxy(Vx1 + Vx2, Vy1 + Vy2)
    With Cht.Shapes.AddLine(PoiXY(1).x, _
      PoiXY(1).y, PoiXY(2).x, PoiXY(2).y).Line
      .EndArrowheadStyle = msoArrowheadTriangle
      .EndArrowheadLength = msoArrowheadLengthMedium
      .EndArrowheadWidth = msoArrowheadWidthMedium
    End With
  Next
End Sub

一番下の Sub Example1() を実行してみてください。
X軸のScale単位で 長さ 33 の矢印が 各Pointから描かれたと思います。

ぼくのほうでは グラフのX軸スケールは -200〜 +200,
X軸スケールは 50〜 400 に設定してあります。各散布図のポイントは
このXY座標でプロットされているわけですが、この点から矢印を描画する
ときは グラフのプロットエリア(Inside Area) の左上端を (0,0)とする
Point座標に変換して長さパラメータを渡さないといけません。
そのための係数を計算しているのが SetCoef 呼び出し です。

グラフのスケールでの x, y座標は poxy()関数を使って グラフ内Point座標
に変換後矢印を描いています。

4 hits

【72075】散布図で画像をマーカ-位置に指定した角度で置きたい 目指せマクロの達人 12/5/26(土) 19:35 質問
【72079】Re:散布図で画像をマーカ-位置に指定した角... rabbit 12/5/27(日) 11:06 発言
【72083】Re:散布図で画像をマーカ-位置に指定した角... 目指せマクロの達人 12/5/27(日) 14:17 発言
【72085】Re:散布図で画像をマーカ-位置に指定した角... rabbit 12/5/27(日) 16:51 発言
【72090】Re:散布図で画像をマーカ-位置に指定した角... 目指せマクロの達人 12/5/28(月) 17:44 発言
【72097】Re:散布図で画像をマーカ-位置に指定した角... 目指せマクロの達人 12/5/29(火) 12:53 発言
【72101】Re:散布図で画像をマーカ-位置に指定した角... kanabun 12/5/29(火) 17:08 発言
【72106】Re:散布図で画像をマーカ-位置に指定した角... 目指せマクロの達人 12/5/29(火) 22:55 お礼
【72089】Re:散布図で画像をマーカ-位置に指定した角... kanabun 12/5/28(月) 16:22 発言
【72091】Re:散布図で画像をマーカ-位置に指定した角... 目指せマクロの達人 12/5/28(月) 17:55 発言
【72117】Re:散布図で画像をマーカ-位置に指定した角... rabbit 12/5/30(水) 22:02 発言
【72118】Re:散布図で画像をマーカ-位置に指定した角... あすなろ 12/5/30(水) 22:58 発言
【72120】Re:散布図で画像をマーカ-位置に指定した角... kanabun 12/5/31(木) 8:45 発言
【72121】Re:散布図で画像をマーカ-位置に指定した角... マクロはひとまずコピペ 12/5/31(木) 17:01 お礼

10195 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free