Excel VBAでセルを円状に塗りつぶす方法

このQ&Aのポイント
  • Excel VBAを使用して、円状にセルを塗りつぶすことは可能ですか?円を描くアルゴリズムを思いつけません。
  • A1セルには単位がmで長さが記入されており、B1セルには半径が記入されます。円の中心セルの番地も指定できるようにしたいです。
  • macro1を実行すると、指定した中心セルと半径に最も近い円のラインを自動で描画したいです。そのためにルート計算(√)をする必要がありますか?
回答を見る
  • ベストアンサー

Excel VBAで、セルを円状に塗りつぶすことはできますか?

Excelのセルに、近似的な円を描きたいのですが、アルゴリズムが思いつきません。 (1) A1セルには、1マスの長さ(単位:m)が記入されています。例えば「1(m)」。 (2) B1セルには、円の半径(単位:m)が記入されています。例えば「15(m)」。 (3) C1セルには、円の中心になるセルの番地が記入されています。例えば「Y22」。 (4) 以上(1)~(3)は、可変でとっかえひっかえできるようにしたいです。 (5) A2:AX51(50×50マス)の各セルは碁盤の目のように、概ね正方形でになるよう幅・高さを調整してあります。 ここで、macro1を実行したら、Y22番地を中心に半径15mの円に最も近い ライン(セルを黒で塗りつぶし)を描きたいです。 「Y22番地から15mの東西南北の4点」だけであれば、AN22、J22、Y37、Y7と手動で 塗りつぶせますが、これら4点以外はルート計算(√)などが絡んでくるのでしょうか? ピッタリ「Y22番地から15m」というのは不可能ですが、最も15mに近似した線で あればできそうに思うのですが、可能でしょうか?よろしくお願い致します。

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

  • ベストアンサー
  • takkunnet
  • ベストアンサー率74% (32/43)
回答No.1

こんな感じでしょうか? Option Explicit Private Sub CommandButton1_Click() Dim r Dim a Dim c_x Dim c_y Dim x Dim y Dim before_y Dim now_y 'セルの値取得 a = Range("a1").Value r = Range("a2").Value '中心位置を数値で取得 c_x = Range(Range("a3").Value).Column c_y = Range(Range("a3").Value).Row before_y = 0 '最左列から最右列まで繰り返し For x = (c_x - Round(r / a, 0)) To (c_x + Round(r / a, 0)) '中心点から外円の相対位置計算(三平方の定理) now_y = Round(Sqr(r ^ 2 - (c_x - x) ^ 2), 0) '前回の位置間での線を補完(最左列~中心 用) For y = before_y To now_y - 1 Cells(c_y - y, x - 1).Interior.ColorIndex = 1 Cells(c_y + y, x - 1).Interior.ColorIndex = 1 Next '前回の位置間での線を補完(中心~最右列 用) For y = now_y + 1 To before_y - 1 Cells(c_y - y, x).Interior.ColorIndex = 1 Cells(c_y + y, x).Interior.ColorIndex = 1 Next '計算位置に色を付ける Cells(c_y - now_y, x).Interior.ColorIndex = 1 Cells(c_y + now_y, x).Interior.ColorIndex = 1 '補完時に使用するため前回値として記憶 before_y = now_y Next End Sub ちなみに「Sqr」が√を求める関数です。 急いで作ったので変数が超簡略なため読みにくいソースですが参考になれば幸いです。

litton101
質問者

お礼

takkunnetさん、貴重なレスありがとうございました! 早速動作確認させていただきましたが完璧でした。 ご教示いただいたロジックでいろいろとやりたい ことがあるので、応用させていただきます。 しかし、三平方の定理とは懐かしいというか、 思いつきもしませんでした。 今後ともよろしくお願い致します。

関連するQ&A

  • Excelマクロで難しい法則でセルを塗りつぶしたいのですが

    # Office系ソフトの方で質問したのですが、削除のうえ  こちらで再質問させていただきます。 Excelのセルに下記のような規則で着色したいですが かなり複雑でVBAで解決できるのかすら見当つきません。 ブックの各セルには、0か1、いずれかの値が入っています。 例えば下記は、その2文字で構成される地図の一部とお考え下さい。 0は平地、1は川を表すとします。 00000000000010000000 00010000000011000000 00010000000000110000 00001000000000001000 00010000000000000100 00001000S00000001000 00001000000000000100 (1) 上が上流、下が上流(行番号123..列番号ABC...と若い方が上流です) (2) Sから半径Aキロの円を通過する川Rを全て対象とします。 (3) 川Rが(2)の円と上流側で交わる点をPとします。 (4) 川RのPから上流方向にBキロさかのぼった点をQとします。 (5) 川Rの川岸から右岸と左岸にそれぞれCキロの帯を黒に着色したいです。 AはセルのA1、BはセルのB1、CはセルのC1、1マスの距離(km)はD1に、 それぞれ記入されています。 S(想定する円の中心点)には便宜的に地図上にSと記入してあるだけで 本来はセルのE1に「H18」のように番地で記入されています。 これらは全て可変で自由に設定可能のようにしたいのですが・・・ ともかく(2)のような考え方だけでも可能なのかな・・と、先日も 当掲示板で質問させていただいたところ、大変ありがたいことに 次のようなロジックをご教示いただきました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1832463 ↑の質問にもかきましたように、多少の誤差は大丈夫なのですが、 (というか、近似的でないと解決不能なこと位は見当つきます(^^;) 実現することは可能でしょうか?よろしくお願い致します。

  • マクロの修正(たぶん、些細なことだと思いますが・・・)

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1832463 の質問、おかげさまで解決済みですが、問題がでました。 (注:質問は、A1に1マスの長さ、B1に円の半径、C1にセルの番地で出してますが、ご回答は、A1に1マスの長さ、A2に円の半径、A3にセルの番地をいただいてます) A1に「1.45」みたいに小数点以下を指定すると、○が描かれるはずが 「C」の字のように、ヘンテコリンに塗り潰されてしまいます。 素人考えにより、変数の宣言で、#1さんが Dim r Dim a とされているところを Dim r As Double Dim a As Double などとしてみましたが、改善ありません。どのように直したらよいでしょうか?

  • Excelで近似曲線の数値をセルに反映させたい

    エクセルでグラフを作って近似曲線を引いたときの間の数値をセル上に反映させたいのですが、方法はないのでしょうか。 例えば、 A B 10 0 11 12 5 13 14  15 16 15 17 18 といったような表をAをX軸、BをY軸でグラフにすると、3点のプロットのみが表示されて、それに近似曲線を入れることができると思います。 この近似曲線のデータをセルの空白の部分にプロットしていきたいのですが、方法がわかりません。 よろしくお願いします。

  • 平面図形が解けません。

    半径ar、中心点A(a1,a2)の円Aがあります。 その中心をを通る直線mがあります。 その直線上の任意の点を点B(b1,b2)とします。 また、円Aに内接し、中心(x,y)が直線m上にあり、 半径crの円Cがあります。 円Bの中心(x,y)を解いてください。 (言い方がおかしいですが、、、) 何がしたいかというと、 マウスを動かして、その目玉が追跡するということですが、、、。 自分で考えていたら混乱しました。 sin,cos可だと思います。 要素で足りないものがあれば補足します。 できれば、簡素なものがいいです。

  • エクセルVBAで教えて下さい。

    A1のセルに [ 1- 5] 4.05398e-01 3.63385e-01 -2.22992e-01 9.89158e-03 -6.43695e-02 A2のセルに [ 6-10] -5.12224e-04 4.07480e-04 -2.73746e-04 -1.77853e-02 -2.13805e-03 A3のセルに [11-15] -6.88489e-03 -2.06765e-02 -9.44633e-03 6.97059e-03 -1.28400e-02 と、このような感じでA7セルまで同じ感じでスペースで空いた数値が入力されています。 A8のセルのみ [36-37] -6.39210e-03 -1.55806e-03 と入力されております。 まず行いたいのはスペースが空いてる部分で、それぞれの数値を各セルに分けたいです。 A1のセルに入力されている [ 1- 5] 4.05398e-01 3.63385e-01 -2.22992e-01 9.89158e-03 -6.43695e-02 ならば A1に[1-5] B1セルに4.05398e-01 C1セルに3.63385e-01 のように これをA1からA8のセルで行ったあと指定のセルを30行目に貼り付けます。 E1→A29 C2→B29 D2→C29 E2→D29 E3→E29 F3→F29 B4→G29 D5→H29 E5→I29 F5→J29 貼り付けのデータは増えていきます。つまり、30行目にデータが入ってる場合は そのデータが1行下の行に下がり、新たなデータが30行目に追加されます。 このようにして、データが最大で58行目まで追加される可能性があります。 最小であれば30行目、31行目の2つしかない場合あります。 この時、0の近似値を各列のセルから探し、当てはまるセルを赤く塗り潰すというのが 今回行いたいことです。 A列ならA30~A58までの中で0の近似値を探し、当てはまるセルを赤く塗り潰す。 ただ空白の場合は無視してもらいたいです。0の近似値だと空白が選択されてしまうので。 近似値探しの前までならマクロがありますのでご参照下さい。 Sub Macro4() ' ' Macro4 Macro ' ' Range("A1:A8").Select Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _ FieldInfo:=Array(Array(0, 1), Array(7, 1), Array(21, 1), Array(34, 1), Array(47, 1), _ Array(60, 1)), TrailingMinusNumbers:=True Range("A1").Select Range("E1").Select Selection.Copy Range("A29").Select ActiveSheet.Paste Range("C2:E2").Select Application.CutCopyMode = False Selection.Copy Range("B29").Select ActiveSheet.Paste Range("E3:F3").Select Application.CutCopyMode = False Selection.Copy Range("E29").Select ActiveSheet.Paste Range("B4").Select Application.CutCopyMode = False Selection.Copy Range("G29").Select ActiveSheet.Paste Range("D5:F5").Select Application.CutCopyMode = False Selection.Copy Range("H29").Select ActiveSheet.Paste Range("J7").Select Application.CutCopyMode = False Range("A29:K29").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("A29:K29").Select With Selection.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With Range("A29").Select Range("A1:F8").Select Selection.ClearContents Range("A1").Select Range("K29").Select With Selection.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With Selection.NumberFormatLocal = "G/標準" End Sub わかりずらい質問ですみませんが、ご指導の程 お願い致します。

  • エクセルでの数式の入力方法

    仮に方眼紙に縦をY軸、横をX軸とする座標があった場合、 座標上に点P1(x1=50,y1=50)、から点P2(x2=10,y2=-30)とする直線(斜線)の長さを求める場合、三平方の定理を使って解答をするときの、セル番地を参照しての数式の入力方法を教えて下さい。 セル番地 50(x1)= セル[A7] 50(y1)= セル[B7] 10(x2)= セル[C7] -30(y2)= セル[D7] 解答欄  セル[E7] わかり辛いかもしれませんが、宜しくお願いします。

  • 3円に接する円の求め方

    円(1) 中心(x1,y1) 半径r1 円(2) 中心(x2,y2) 半径r2 円(3) 中心(x3,y3) 半径r3 上記の3円に接する円の中心点と半径の求め方を教えてください。 宜しくお願いいたします。

  • 円の式を微分方程式で表すと・・・

    y=x上に中心のある任意半径の円が満たす微分方程式が分かりません。 円の式 x^2+y^2=c^2 (cは円の半径、中心は原点) (x-a)^2+(y-b)^2=c^2 (a,bは中心の座標、cは円の半径) という式からとりあえず、 xdx+ydy=0 (x-a)dx+(y-b)dy=0 となるだろうことは分かります。(もしかしてこの時点で間違ってますか?)しかし、これだと中心が原点、もしくは任意の(a,b)のときだけです 。 「(a,b)はy=x上の点とする」と定義してしまえばそれまでなのかもしれませんが、それだと意図が違う のでは?、と思うのです。 「y=x」という、円の中心を取る関数をどう絡めたらいいのかがわかりません。 ヒントをお願いします。

  • 高3の図形と方程式の問題です。

    高3の図形と方程式の問題です。 (1)は解けたとおもいますが(2)~(4)を教えていただけないでしょうか。 点A(8/3、2)と 円 x^2+y^2=4…(1), 円 x^2+y^2-8x-6y+24=0…(2) があります。 (1) 円(2)の中心の座標と半径を求めよ。 (2) 点Aを通り、円(1)に接する直線の方程式を求めよ。 (3)(2)で求めた直線は円(2)の接線であることを示せ。 (4)(2)で求めた直線以外の円(1)と円(2)の両方に接する直線の傾きを求めよ。   (1)は (x-4)^2+(y-3)^2=1     中心(4,3)半径1の円   (1)はこれでいいとおもうのですが....。            よろしくお願いします

  • 複素数について。

    z=3(cosα+isinα),y=a+cosβ+isinβとおく。z,yが一致するための正の実数aの範囲を求めよ。 という問いで、解答において 『zは中心は原点で,半径3の円、yは中心(a,0),半径1の円』 と書いてあります。ここで、 『zは中心は原点で,半径3の円』はわかるのですが、 『yは中心(a,0),半径1の円』がわかりません。 どうぞ、教えてください。