エクセルVBAで円弧をフリーフォームに変換する方法

このQ&Aのポイント
  • エクセルVBAで円弧をフリーフォームに変換する方法について調べています。
  • 円弧の頂点の編集におけるコントロールポイントの数式についても知りたいです。
  • 円弧から点情報を取得してフリーフォームで図形を描く方法についても探しています。
回答を見る
  • ベストアンサー

エクセルVBA フリーハンドで円を描くには

エクセルVBAで円弧と直線がつながった図形を作成し、塗りつぶしたいです。 例えば小判型の図形を円弧情報と直線情報から描いて塗りつぶしたいです。 円弧は中心点と角度情報がありますので、円弧は引けますが最後複合図形にして塗りつぶしできないですので円弧のままではだめです。 考えたのは、 ・円弧を書いて、円弧からVerticesで点情報を取得してフリーフォームで書く  →フリーフォームでない図形は点情報を取得でいない  →図形をフリーフォームに変換できない ・円弧の頂点のコントロールポイント位置を参考にルールを見つける  →円弧の頂点A,Bを三等分し、点C,Dを定義。中心からそのCに向かって引いた線とAの接線の交点にコントロールポイントを配置   →微妙にずれる 円弧をフリーフォームに変換する方法はありませんか? 円弧を「頂点の編集」にしたときにどういったアルゴリズムでコントロールポイントを出しているか数式はわかりませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • SI299792
  • ベストアンサー率48% (715/1481)
回答No.7

 プログラムを上げていただき、ありがとうございます。  私のもやってみました。7点取ることで、それらしい図形はできました。但し、120゜(このプログラムでは60)を超えると、9点取ったほうがいいみたいです。 バームクーヘンに四角を付けるといっていたので、180゜以上は試していません。  新しいプログラムでは、ポイント数を付けました。省略時は3になり、7点取ります。4だと9点取ります。 ' Option Explicit '  画面の色取得用 Type Point   X As Single   Y As Single End Type ' Sub Macro3() '   ArcRect2 100, 200, 100, 20, 20   Selection.ShapeRange.Line.ForeColor.RGB = vbRed   Selection.ShapeRange.Fill.ForeColor.RGB = vbRed   ArcRect2 300, 200, 100, 40, 20   Selection.ShapeRange.Line.ForeColor.RGB = vbBlue   Selection.ShapeRange.Fill.ForeColor.RGB = vbBlue   ArcRect2 500, 200, 100, 70, 20, 4   Selection.ShapeRange.Line.ForeColor.RGB = vbGreen   Selection.ShapeRange.Fill.ForeColor.RGB = vbGreen End Sub ' Sub ArcRect2(X As Single, Y As Single, R As Single, A As Integer, H As Single, _   Optional P As Integer = 3) '  中心点X,中心点Y,半径,角度,高さ,ポイント数   Dim Point As Point   Dim Angle As Single   Dim S As Single '   S = A / P   Point = PointCalc(X, Y + H, R, 90 - A)   With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, Point.X, Point.Y) '   For Angle = 90 - A + S To 91 + A Step S     Point = PointCalc(X, Y + H, R, Angle)     .AddNodes msoSegmentCurve, msoEditingAuto, Point.X, Point.Y   Next Angle   .AddNodes msoSegmentLine, msoEditingAuto, Point.X, Point.Y '   Point = PointCalc(X, Y, R, 270 - A)   .AddNodes msoSegmentLine, msoEditingAuto, Point.X, Point.Y '   For Angle = 270 - A To 271 + A Step S     Point = PointCalc(X, Y, R, Angle)     .AddNodes msoSegmentCurve, msoEditingAuto, Point.X, Point.Y   Next Angle   .ConvertToShape.Select   End With End Sub ' Function PointCalc(X As Single, Y As Single, R As Single, A As Single) As Point '   Const DTR As Single = 0.01745329 '   PointCalc.X = Cos(A * DTR) * R + X   PointCalc.Y = Sin(A * DTR) * R + Y End Function

tanakanono
質問者

お礼

色々試していただきありがとうございます。 msoEditingAutoでいい感じになるんですね。 円と重ねてみましたが、円弧の途中はばっちりです。が、端の直線との接続ポイントのコントロールポイントが円弧の接線上ではなく、円弧上に来てしまっています。惜しいです。余分にポイントを置いてから削除するみたいなことができればよいかもしれません。考えてみます。

その他の回答 (6)

  • SI299792
  • ベストアンサー率48% (715/1481)
回答No.6

かといって、計算で四角の位置を出すと、ずれが発生します。 ' Sub ChordRect(ByVal X As Long, ByVal Y As Long, R As Long, ByVal A As Integer, _   H As Long) '  中心点X,中心点Y,半径,角度,高さ   Const DTR As Single = 0.01745329   Dim Xf As Long   Dim Yf As Long '   Xf = X - R   Yf = Y - R   ActiveSheet.Shapes.AddShape(msoShapeChord, Xf, Yf, R * 2, R * 2).Select   Selection.ShapeRange.Adjustments.Item(1) = 270 - A * 2   Selection.ShapeRange.IncrementRotation A   ActiveSheet.Shapes.AddShape(msoShapeChord, Xf, Yf + H, R * 2, R * 2).Select   Selection.ShapeRange.Adjustments.Item(1) = 270 - A * 2   Selection.ShapeRange.IncrementRotation A + 180   A = 270 - A   Xf = Cos(A * DTR) * R + X   Yf = Sin(A * DTR) * R + Y   A = A + 180   X = Cos(A * DTR) * R + X - Xf   Y = Sin(A * DTR) * R + Y - Yf + H   ActiveSheet.Shapes.AddShape(msoShapeRectangle, Xf, Yf, X, Y).Select   With ActiveSheet.Shapes   ActiveSheet.Shapes.Range(Array(.Count - 2, .Count - 1, .Count)).Select   End With   Selection.ShapeRange.Group.Select End Sub 画面の色で四角の位置を修正するということも考えましたが、挫折しました。

tanakanono
質問者

お礼

トライありがとうございます。 私も試行錯誤を続けていましたが、以下でそれっぽくなりました。 円弧は90度以下になるように分割。 分割後の円弧(例:90度)を三等分した角度*(29/30)(例:29度)をシータ1、円弧の両端点をA,B、Aから29度の中心からの線とAの接線の交点にコントロールポイントを配置、Bも同様に配置する。 三等分した角度からちょっと小さくするのがポイントのようですが、なぜ29/30なのかは不明です。現物合わせです。円弧角90度、45度、22.5度でOKでしたので、全部の角度行けそうです。半径が小さいと値丸めのせいなのか円弧の点自体がずれます。singleでだめ、直接値を入れてもダメでした。これなもう許容しようと思います。

tanakanono
質問者

補足

29/30の補正ではだめでした。(-1.1077 * (角度+ 30.67) / 30 角度と比例させた値にするとよさそうです。これだとほぼOKです。 Sub TestFreeFormCircle() Dim x, y, r As Integer Dim i As Integer Dim dividAngle() As Single Dim AngleS, AngleE, AngleDiff As Single Dim dividNum As Integer Dim d1, d2, x1, y1 As Single Dim CP1x, CP1y, Px, Py, CP2x, CP2y As Single Dim FreeForm As Object x = 150 y = 150 r = 50 AngleS = -Atn(1) '-3~0~3くらい AngleE = Atn(1) * 4 '-3~0~3くらい ReDim dividAngle(0) dividAngle(0) = AngleS AngleDiff = AngleS - AngleE For dividNum = 1 To 5 If Abs(AngleDiff) / dividNum < Atn(1) * 2 Then Exit For End If Next For i = 1 To dividNum ReDim Preserve dividAngle(i) dividAngle(i) = AngleS - (i) * AngleDiff / dividNum Next d1 = dividAngle(0) x1 = x + r * Cos(d1) y1 = y + r * Sin(d1) Set FreeForm = ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, x1, y1) For i = 0 To UBound(dividAngle) - 1 d1 = dividAngle(i) d2 = dividAngle(i + 1) CP1x = x1 - r * Tan((d2 - d1) * (-1.1077 * (d2 - d1) + 30.67) / 30 / 3) * Cos(Atn(1) * 2 - (d1)) CP1y = y1 + r * Tan((d2 - d1) * (-1.1077 * (d2 - d1) + 30.67) / 30 / 3) * Sin(Atn(1) * 2 - (d1)) Px = x + r * Cos(d2) Py = y + r * Sin(d2) CP2x = Px + r * Tan((d2 - d1) * (-1.1077 * (d2 - d1) + 30.67) / 30 / 3) * Cos(Atn(1) * 2 - (d2)) CP2y = Py - r * Tan((d2 - d1) * (-1.1077 * (d2 - d1) + 30.67) / 30 / 3) * Sin(Atn(1) * 2 - (d2)) FreeForm.AddNodes msoSegmentCurve, msoEditingCorner, CP1x, CP1y, CP2x, CP2y, Px, Py x1 = Px y1 = Py Next FreeForm.ConvertToShape.Select end sub

  • SI299792
  • ベストアンサー率48% (715/1481)
回答No.5

フリーハンドで円弧と線を描いて、繋げます。 中心点と角度で指定します。 中心点X,中心点Y,半径,角度,長さ,密度 角度: 0~90です。0で四角。90で半円と四角になります。 長さ:半径との差を指定します。0で半径と長さが同じになります。 密度、省略可。数を多くすると荒くなります。 ' Option Explicit ' Sub Macro1() '   Arc 300, 200, 100, 60, 0   Selection.ShapeRange.Line.ForeColor.RGB = 255   Selection.ShapeRange.Fill.ForeColor.RGB = 255 End Sub ' Sub Arc(X As Single, Y As Single, R As Single, A As Integer, H As Single, _   Optional s As Integer = 1) '  中心点X,中心点Y,半径,角度,高さ,密度   Const DTR As Single = 0.01745329   Dim Xs As Single   Dim Ys As Single   Dim Xp As Single   Dim Yp As Single   Dim Angle As Integer '   Angle = 90 - A   Xs = Cos(Angle * DTR) * R + X   Ys = Sin(Angle * DTR) * R + Y   With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, Xs, Ys) '   For Angle = 90 - A + s To 90 + A Step s     Xp = Cos(Angle * DTR) * R + X     Yp = Sin(Angle * DTR) * R + Y + H     .AddNodes msoSegmentLine, msoEditingAuto, Xp, Yp   Next Angle '   For Angle = 270 - A To 270 + A Step s     Xp = Cos(Angle * DTR) * R + X     Yp = Sin(Angle * DTR) * R + Y     .AddNodes msoSegmentLine, msoEditingAuto, Xp, Yp   Next Angle   .AddNodes msoSegmentLine, msoSegmentLine, Xs, Ys   .ConvertToShape.Select   End With End Sub

tanakanono
質問者

お礼

回答ありがとうございます。 確かにこれだとそれらしく図形ができるので、最終手段ですね。 これだとポイント情報が増えるので、気になります。 円で比較すると4点でよいものが360点、コントロールポイントを含めるとを含めると270倍のデータ量になっていしまいます。

  • Chiquilin
  • ベストアンサー率30% (94/306)
回答No.4

バージョンが書かれてませんけど PowerPointがあるなら 図形の切り抜き機能があるので そっちで対応したらどう ですか? PowerPoint で図形を融合したり切り抜いたりする https://www.cresco.co.jp/blog/entry/1753/

tanakanono
質問者

お礼

回答ありがとうございます。 説明不足で済みません。データ元は2次元CADです。 直線なら点情報、円弧なら中心座標と半径、角度の情報が入っています。 例えば3/4のバウムクーヘンの断面を塗りつぶしたいです。

回答No.3

んー・・謎が多いです。 まず > 複合図形 というのが何なのかよく解らなかったりしますが・・ グループ化のことでしょうか。 そうだったとして、 > 円弧情報と直線情報から描いて塗りつぶしたい 何故直線なのでしょう?長方形では事足りませんか? 円弧の内側を塗りつぶすのは可能ですし、長方形も塗りつぶせます。 これらを「うまく」組み合わせれば良いと思うのですが。 > 円弧は引けますが(略)円弧のままではだめ 塗りつぶせていないのは「直線」の方だと思いますよ。 > 円弧と直線がつながった図形を作成し、塗りつぶし > 例えば小判型の図形 フローチャートの「端子」や「論理積ゲート」では足りない、 という事でしょうか。 否定ばかりでは進まないので、とりあえず。 直接の回答にはなり得ませんが、 「角丸四角形」を使って、黄色のハンドルを動かして 小判型・・というかなんというか、近いものは表現できますよ。 例えば   ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 54, 13.5, 162, 67.5). Select   Selection.ShapeRange.Adjustments.Item(1) = 0.5 こんな感じ。 言わずもがな、msoShapeRoundedRectangle = 角丸四角形 で   ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 左位置, 上位置, 幅, 高さ) で指定。 丸みは   Selection.ShapeRange.Adjustments.Item(1) = 数値 で調節、「0」指定で完全に長方形(意味は無いですが)、 「0.5」が最高値で、短辺が半円型になります。   ※0.5を超える数値でもエラーにはなりませんが、    半円を超える形は作れません。 以上、参考にどうぞ。

tanakanono
質問者

お礼

回答ありがとうございます。 たとえが悪かったです。小判型だけでなく、3/4に切ったバウムクーヘンのような円弧と直線の組み合わせを塗りつぶしたいです。 データ元は2次元CADで、直線なら点情報、円弧なら中心座標と半径、角度の情報が入っています。

  • SI299792
  • ベストアンサー率48% (715/1481)
回答No.2

フリーフォームで円弧を描く、できないこともないけれど、時間がかかる上、メモリーも食います。 小判型を描いて塗りつぶすなら、やはり、円弧と四角を組み合わせたほうがいいと思います。 円弧を縦横比同じに描いた後、   Selection.ShapeRange.Adjustments.Item(1) = 90 を指定すれば、正確な位置に半円を描けます。 後は回転させればいいです。 以下は、小判型を描くサブルーチンです。 左端位置,上端位置,幅,高さ,色を指定します。 横長オンリーですが、連結してセレクトされるので、回転も可能です。 ' Sub Macro1() '   Oval 100, 100, 120, 100, 255   Selection.ShapeRange.IncrementRotation 90   Oval 300, 100, 140, 100, 65280   Selection.ShapeRange.IncrementRotation 90   Oval 500, 100, 160, 100, 16711680   Selection.ShapeRange.IncrementRotation 90 End Sub ' Sub Oval(X1 As Long, Y1 As Long, X2 As Long, Y2 As Long, IColor As Long) '   ActiveSheet.Shapes.AddShape(msoShapeChord, X1, Y1, Y2, Y2).Select   Selection.ShapeRange.Adjustments.Item(1) = 90   ActiveSheet.Shapes.AddShape(msoShapeRectangle, X1 + Y2 / 2, Y1, X2 - Y2, Y2).Select   ActiveSheet.Shapes.AddShape(msoShapeChord, X1 + X2 - Y2, Y1, Y2, Y2).Select   Selection.ShapeRange.Adjustments.Item(1) = 90   Selection.ShapeRange.IncrementRotation 180   With ActiveSheet.Shapes   ActiveSheet.Shapes.Range(Array(.Count - 2, .Count - 1, .Count)).Select   End With   Selection.ShapeRange.Group.Select   Selection.ShapeRange.Line.ForeColor.RGB = IColor   Selection.ShapeRange.Fill.ForeColor.RGB = IColor End Sub

tanakanono
質問者

お礼

回答ありがとうございます。 たとえが悪かったです。小判型だけでなく、3/4に切ったバウムクーヘンのような円弧と直線の組み合わせを塗りつぶしたいです。

  • NuboChan
  • ベストアンサー率47% (745/1584)
回答No.1

ExcelでなくてVisioを利用する選択肢は無いですか? 図形の作成は、Visioにまかせて画像はExcelに貼り付けるとかは?

関連するQ&A

  • EXCELの円に線を引きたいのです

    エクセルの図形で円を書き、その円周?円弧?上に交差するように中心点から同じ角度で線を入れたいのです。(子供が書く太陽の絵のような・・・)例えば中心点から10度ずつで同じ長さの線を入れたい・・・とか・・・伝え方が下手で申し訳ないのですが教えていただけませんでしょうか・・・?初心者なのですみません・・・

  • 面積の求め方がわかりません。

    1辺10cmの正方形がある。その図形の内側に頂点B、Cを中心とする半径10cmの円弧を書き、2つの弧の交点Eと頂点Bとを直線で結ぶ。斜線の部分の面積をもとめなさい。ただし、円周率をπとする。 以上考え方を教えて頂けないでしょうか。 よろしくお願い済ます。

  • 円弧とか放物線の頂点部分についての「角度」

    円弧とか放物線の頂点部分について「角度」という概念を考えることはできるのでしょうか? つまり、円弧とか放物線の頂点部分の角度を、円弧とか放物線の2つの点からそれぞれ延長した直線の交わる点の角度として求めることは、一般に行われているでしょうか?

  • 3点を通る円を描きたいのですが

    右斜め上に4センチの斜線が引いてあります。斜線の左端点をB、右上端点をAとします。このとき各々の端点から任意に円弧を引きます。そうしますと、円弧が交わる同士を直線で結ぶと中心点がわかります。このとき、端点BからA・Bの垂直二等分線を引けとあるのですが、これをどう引けばいいのかがわかりません(左下斜めに線が引けてます)。やりたいことは、この垂直二等分線のもう一方の端点をCとして、この垂直二等分線の中心点を円弧を使って求め、更にその中心点から十字に通る斜線に向かって直線を引いて、その交点をDとします。このDを中心点として、A・B・Cを通る円を描きたいのです。言ってる意味がわかるでしょうか。このB・C間(垂直二等分線)の長さや角度は任意でいいのでしょうか。 何方か、お助けください。 宜しくお願いします。

  • 円弧A-Bと直線A-Bの距離がわかっているときの頂点までの距離を教えてください。

    点A-B間の直線距離が30mで、同じ点A-Bを通る円弧の長さが40mの場合 直線A-Bの中間点から円弧の頂点までの長さは、どのように計算すれば良いのでしょうか?

  • 円弧三角形の問題

    正三角形ABCの各頂点を中心とし、1辺の長さを半径とする円弧で囲まれた図形を円弧三角形という。AB=1とした時。この円弧三角形の面積はいくつか。 この問題の答えと求め方を教えてください!あと、この円弧三角形は範囲でいうと(数学A,や数学Bなど0)どこの範囲になるのでしょうか?参考書で数学を勉強していましたが、円弧三角形がでてこなかったので・・・。

  • Illustratorにて直線部分の中心を基準として他の図形に配置させ

    Illustratorにて直線部分の中心を基準として他の図形に配置させたり、 中心部分から他の線を描く場合、楕円ツールを使って、 楕円の幅を0にしてあたかも、直線のように描き 中心点のアンカーポイントを残すように描いてます。 この方法だと、実際は、2本の線が重っていますが、今のところ実害はないです・・・ (Illustratorは、円や四角等の図形の中心点はスナップしますが、 直線の中心点はスナップできないため) 他の方法で、もし直線部分の中心を基準として図形を配置させたり、 中心点から、線を引く簡単な方法がありましたら、ご教示ください。 Illustrator CS3です よろしくお願いします。

  • Excelのマクロでフリーフォームの作成について

    Excel2010です。 マクロの記録でフリーフォームを作成するマクロを作りました。 角が1つある直線のフリーフォームです。 Sub Macro1() With ActiveSheet.Shapes.BuildFreeform(msoEditingAuto, 50, 50) .AddNodes msoSegmentLine, msoEditingAuto, 100, 150 .AddNodes msoSegmentLine, msoEditingAuto, 150, 150 End With End Sub マクロを実行した後、「頂点の編集」で真ん中の頂点を移動すると片側の線が曲線になってしまいました。 マクロを使わず、同じフリーフォームを直接描画して頂点を移動すると曲線にはなりません。 マクロで描画後に毎回「線分を伸ばす」で直線にするのは面倒なので、はじめから曲線にならないようにするには、マクロをどう直せば良いでしょうか? またマクロでできあがる線は、真ん中の頂点がない直線でもかまいません。 目的はマクロで出来た線に「頂点の追加」で角を数カ所追加することです。 角の位置はその都度変わります。 このブックはExcel2003、2007、2010で使用する予定です。 もしくは、フリーフォームが曲線にならないようにExcelの設定を変えてしまう方法でもかまいません。 どうぞよろしくお願いします。

  • オフセット図形上の交点

    お世話になります。 半径100mm、90度の扇形状で円弧の中心を原点で、30度から60度は直線で成り立っている図形があります。(欠円形状) この図形を元に、全体に10mm大きく(オフセット)します。 円弧と直線の交点(欠円形状となっている交点)の座標を求めたいのですが、どのような方法があるのでしょうか? 私の知識不足で困っております。皆さんの知識をお貸しください。

  • EXCEL2010のフリーハンド、フリーフォーム

    EXCEL2010のフリーハンドフリーフォームで線を描こうとすると補助線?のような線もでなく、ダブルクリックで終わらせても透明の線で見えません。 これに書式設定で色を付けてやっと線を見ることはできますが、これを既定に設定しても次描いたとき透明になり設定ができてません。 直線や曲線は問題ないのですがこの2つだけおかしいです。 これができないと図形を書く場合、ものすごく不便なのですが、みなさんどうしてるんでしょうか? 正直マイクロソフトはすぐ修正版を出すぐらいの不具合だと思います。 見えない線で絵を書いてそれを毎回色を付けなければならないのでしょうか? 対処法をご存知の方、教えてください。

専門家に質問してみよう