『数学ガールの秘密ノート/丸い三角関数』を読んでいて、Excelの散布図を使って正多角形を描きたくなりました。
『数学ガールの秘密ノート/丸い三角関数』の「第4章 円周率を数えよう」では、アルキメデスが行ったという正96角形から円周率の近似値を求める数学トークが、主人公(僕)と僕の従妹であるユーリとの間で展開されます。
書籍と内容は一部異なりますが、Web連載「数学ガールの秘密ノート」の「円周率を数えよう(後編)」でも正96角形が登場するくだりを読めます。
この内容を読むうちに、正96角形がどれくらい円に近いのか、正48角形や正24角形ならばどれくらいなのかが気になってきたのです。
もちろん検索すれば正96角形・正48角形・正24角形の画像は見つかるのでしょうが、数学トークを読んで手元にはExcelがあるのですから、Excelで三角関数と散布図を使って正多角形を描くことにしました。
散布図を整えるサンプルマクロ
散布図を使って正多角形を描くこと自体は、SEQUENCE関数の登場によって楽になったのですけれど、作成した散布図を正多角形に相応しい状態に整えるのは、手作業で行うと少々面倒です。
そこで散布図を正多角形用にキレイにする以下のようなExcelマクロを作りました。
On Error GoTo ErrHandl
With ActiveChart
.HasTitle = False
.Parent.Width = .Parent.Height
.PlotArea.Width = .PlotArea.Height
Dim ax As Axis
For Each ax In .Axes
ax.MaximumScale = 1
ax.MinimumScale = -1
ax.HasMajorGridlines = False
ax.TickLabelPosition = xlTickLabelPositionNone
Next
End With
ErrHandl:
MsgBox "ワークシート上の散布図をアクティブにしてから実行してください。"
Err.Clear
End Sub
上図のような本当は正多角形なのに正多角形に見えない散布図をアクティブにしておいて、上述のExcelマクロを実行すると、下図のように正多角形らしくなります。
サンプルマクロで行っている処理内容
上記のマクロでは、拙著『理解するExcel VBA/グラフ操作の基本』で解説しているプロパティ等を使っています。
ActiveChartでChartオブジェクトを取得
まず、拙著でも繰り返し使用している、グローバルメンバーのActiveChartプロパティを使って、アクティブなグラフを表すChartオブジェクトを取得しています。
With ActiveChart
以後の処理では、すべてこのChartオブジェクトから辿れるグラフ関連のオブジェクトを使っています。
グラフタイトル・グラフエリア・プロットエリアの操作
With文の中では、最初に拙著「2-3. グラフタイトル」で解説しているChart.HasTitleプロパティを使ってグラフタイトルを非表示にして、
.HasTitle = False
「1-2. ChartObjects.Addで埋め込みグラフを作成する」で解説している、ChartObject.WidthプロパティをChartObject.Heightプロパティと同じにすることで、グラフエリアを正方形にしています。
.Parent.Width = .Parent.Height
このマクロはワークシート上に存在する埋め込みグラフの散布図がアクティブな状態で実行されることを想定しているので、ChartオブジェクトのParentプロパティを使ってChartObjectオブジェクトを取得しています。
同様に、拙著「2-2. グラフエリアとプロットエリア」で解説している、プロットエリアも正方形にしています。
.PlotArea.Width = .PlotArea.Height
軸に関連する操作
グラフタイトル・グラフエリア・プロットエリアの設定が終わったら、軸に関連する操作です。
拙著「2-10-1. Axis(軸)を取得する」で使用しているのと同様、Chart.Axesメソッドで取得できる全ての軸を表すAxesコレクション(要素はAxisオブジェクト)に対し、For Each~Nextループを回します。
Dim as As Axis For Each ax In .Axes
For Each~Nextループの中で、各軸の最大値と最小値をAxis.MaximumScaleプロパティとAxis.MinumuScaleプロパティを使って設定し、
ax.MaximumScale = 1 ax.MinimumScale = -1
拙著「2-10-4. Gridlines(目盛線)を操作する」で解説しているAxis.HasMajorGridlinesプロパティで目盛線を非表示にしてから、
ax.HasMajorGridlines = False
Axis.TickLabelPositionにxlTickLabelPositionNoneを指定することで、軸の目盛ラベルを非表示にしています。
ax.TickLabelPosition = xlTickLabelPositionNone
最終更新日時:2022-08-24 15:15
- Newer:ExcelのISTEXT関数とは
- Older:ExcelのDAY関数で取得した日を2桁に??-TEXT関数
Home » エクセルマクロ・Excel VBAの使い方 » グラフ・Chart » 散布図を正多角形用にキレイにするExcelマクロ