[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『重なり合う2円の面積が全体に対してなん%かを算出』(うにゃ)
初めまして、うにゃともうします。
エクセルで重なる2円の面積が全体の面積の何%かを求めたいです。
条件としては
・直径 A1 mmの円1が存在します。(A1は任意でセル入力できるとありがたいです。)
・A2 mm右に並行移動した円2が存在します。(こちらも同様にA2に入力できる様にしていただけるとありがたいです。)
・この二つの円は重なりから外れると重なりの割合が0になるため
A1>0 , A2>0, A1>A2とします
・円1と円2が重なっている面積を C1 に算出
・円1と円2が成す図形(∞のような形)の面積を C2 に算出
・C1÷C2した値を C3 に算出
(できればその図形を開いたスペースに作図させたいです)
以上のことをマクロを用いて作成させたいのですが、試行錯誤はしましたができませんでした。
困っているのでお願いしたいです。
わからないことがあれば聞いてください!
よろしくお願いしたいです!!!
< 使用 Excel:unknown、使用 OS:unknown >
(1)2つの円は同じ大きさ(直径)でいいですか?
(2)同じ大きさの平行移動なら関数でも、できそですけどマクロ希望ですか?
(まる2021) 2023/05/26(金) 14:17:35
返信ないですが、同一サイズの円の平行移動としてVBAで書いてみました。 [A1]に直径(mm単位)、[B1]に平行移動距離(mm単位)を入力して、mainメソッドを実行してみてください。 [C1]に交差部分の面積、[C2]に全体面積、[C3]に割合を表示、[D2]を左上として図形を作図します。 答えの検証はそちらで、お願いします。 以下はこちらで実行した結果です。
__A __B __C________ 1 100 50 3070.924247 2 12637.03902 3 24.3%
'2円の積集合の面積 Function CircleIntersect#(直径#, 移動#) Dim eval$ eval = "(POWER(" & 直径 & "/2,2)*PI()*ACOS(" & 移動 & "/" & 直径 & ")/(2*PI())-" & 直径 & "*" & 移動 & "*SIN(ACOS(" & 移動 & "/" & 直径 & "))/8)*4" CircleIntersect = Evaluate(eval) End Function '2円の和集合の面積 Function CircleUnion#(直径#, 移動#) Dim lap# lap = CircleIntersect(直径, 移動) CircleUnion = (直径 / 2) ^ 2 * WorksheetFunction.Pi * 2 - lap End Function '2円を作図 Private Sub DrawCircle(直径#, 移動#, TopLeftCell As Range) Dim sp1 As Shape, sp2 As Shape, rng As Range Set sp1 = DrawCircleBase(直径, 0, TopLeftCell, rgbRed) Set sp2 = DrawCircleBase(直径, 移動, TopLeftCell, rgbBlue) ActiveSheet.Shapes.Range(Array(sp1.Name, sp2.Name)).Group End Sub '単一円を作図。直径、移動はmm単位 Private Function DrawCircleBase(直径#, 移動#, TopLeftCell As Range, Optional 色, Optional 透過! = 0.5) As Shape Dim sp As Shape With TopLeftCell Set sp = ActiveSheet.Shapes.AddShape(msoShapeOval, _ .Left + Application.CentimetersToPoints(移動 / 10), _ .Top, _ Application.CentimetersToPoints(直径 / 10), _ Application.CentimetersToPoints(直径 / 10)) End With If Not IsMissing(色) Then sp.Fill.ForeColor.RGB = 色 sp.Fill.Transparency = 透過 Set DrawCircleBase = sp End Function '図形削除 Private Sub ShapsClear() Dim sp As Shape For Each sp In ActiveSheet.Shapes If sp.Type = msoGroup Then sp.Delete End If Next End Sub Sub main() Dim 直径#, 移動# 直径 = Range("A1").Value 移動 = Range("B1").Value If 直径 < 0 Or 移動 < 0 Then Call MsgBox("直径と移動距離は正の値でないとダメです。", vbCritical): Exit Sub If 直径 < 移動 Then Call MsgBox("移動距離は直径以下でないとダメです。", vbCritical): Exit Sub Range("C1").Value = CircleIntersect(直径, 移動) Range("C2").Value = CircleUnion(直径, 移動) Range("C3").Value = Range("C1").Value / Range("C2").Value Range("C3").NumberFormatLocal = "0.0%" ShapsClear Call DrawCircle(直径, 移動, Range("D2")) End Sub
(まる2021) 2023/05/26(金) 19:26:46
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.