|
▼カド さん:
おはようございます。再々投稿です。
理由は、後述します。
>何度もありがとうございます。
いえいえ、勉強になります・・・。
うーん、やっぱり、0.75を考慮しないと駄目ですねえ!!
それと小さい四角が作れないんです・・・。
そこで指定のWidthは、下限を15に限定してみたものを作って投稿しましたが、
不満だったので、再投稿です。
以下のコードは、
新規ブックを作成し、そのアクティブシートのセルA1に
作成する直方体のWidth(実際には、正面に作成される長方形のWidth)がランダム値として入力されます。
又、
セルB1〜セルK6にサンプルデータを作成し、その値に応じたグラフもどきを
B列〜K列の30行目から作成します。
以下のコードを新規ブックの標準モジュールにコピーして試してみて下さい。
'=======================================================================
Sub test()
Dim h As Single
Dim s As Single
If ActiveWorkbook.Name <> ThisWorkbook.Name Then
ActiveWorkbook.Close False
End If
Workbooks.Add
Cells(1, 1).Value = Int(Rnd() * 35) + 3
Call sampledata
For idx = 2 To 11
With Cells(31, idx)
h = 0
For jdx = 6 To 1 Step -1
s = Cells(jdx, idx).Value
h = h + Cells(jdx, idx).Value
Call mk_graph_pt(ActiveSheet, .Left, .Top - h, Cells(1, 1).Value, s)
Next
End With
Next
End Sub
'========================================================================
Function mk_graph_pt(sht As Worksheet, x As Single, y As Single, w As Single, h As Single)
'棒グラフ要素を作成する
'input : sht 作成するワークシート
' x,y,w,h
Dim px(1 To 4) As Single
Dim py(1 To 4) As Single
Dim para1 As Shape
Dim para2 As Shape
Dim para3 As Shape
Dim pi As Single '円周率
Dim g_nm()
pi = WorksheetFunction.pi()
Set para1 = sht.Shapes.AddShape(msoShapeRectangle, x, y, w, h)
With para1
px(1) = .Left + .Width: py(1) = .Top
px(2) = px(1) + Int((.Width * 0.65 * Cos(-1 / 7 * pi)) / 0.75) * 0.75
py(2) = py(1) + Int((.Width * 0.65 * Sin(-1 / 7 * pi)) / 0.75) * 0.75
px(3) = px(2): py(3) = py(2) + .Height
px(4) = .Left + .Width: py(4) = .Top + .Height
Set para2 = Mk_Parallelogram(sht, px(), py(), 22)
px(1) = .Left: py(1) = .Top
px(2) = para2.Left + para2.Width - .Width
py(2) = para2.Top
px(3) = para2.Left + para2.Width
py(3) = para2.Top
px(4) = .Left + .Width
py(4) = .Top
Set para3 = Mk_Parallelogram(sht, px(), py())
End With
g_nm() = Array(para1.Name, para2.Name, para3.Name)
Set mk_graph_pt = sht.Shapes.Range(g_nm()).Group
End Function
'=========================================================================
Function Mk_Parallelogram(sht As Worksheet, p_x() As Single, p_y() As Single, Optional cl As Long = 9) As Shape
'四角形を作成する
'input sht:ワークシートオブジェクト
' p_x(),p_y()---4点の座表の入った配列
' cl ----カラーインデックス
On Error Resume Next
Dim para As Shape '四辺形のShapeオブジェクト
Dim plus As Single
plus = 0
Do
With sht.Shapes.BuildFreeform(msoEditingAuto, p_x(1), p_y(1))
For idx = 2 To 4
.AddNodes msoSegmentLine, msoEditingAuto, p_x(idx) + plus, p_y(idx) + plus
Next idx
.AddNodes msoSegmentLine, msoEditingAuto, p_x(1), p_y(1)
Err.Clear
ret = 0
Set Mk_Parallelogram = .ConvertToShape
ret = Err.Number
If ret <> 0 Then
plus = plus + 20
ElseIf ret = 0 Then
If Mk_Parallelogram.Nodes.Count < 4 Then
ret = 1
Mk_Parallelogram.Delete
plus = plus + 20
Else
If plus > 0 Then
With Mk_Parallelogram
For idx = 2 To 4
.Nodes.SetPosition idx, p_x(idx), p_y(idx)
Next
End With
End If
Exit Do
End If
End If
End With
Loop
With Mk_Parallelogram
.Fill.ForeColor.SchemeColor = cl
.Fill.Visible = msoTrue
.Fill.Solid
End With
End Function
'=====================================================================
Sub sampledata()
For idx = 1 To 6
For jdx = 2 To 11
Cells(idx, jdx) = Int(Rnd() * 40) + 1
Next
Next
End Sub
再々投稿したのは、
1.小さい四角が作れなかったので困ってたんですが、それを可能にしため・・・。
2.上記のコードは、コードを実行するたびに新規ブックを作成しています。
同一シートに図形の削除・作成を繰り返すと強制終了が発生したためです。
メモリの問題かどうかは不明ですが。
上記のコードの場合、Book100を超えて繰り返しても正常に作動しています。
以上です。確認して下さい。
|
|