VBA DXで必ず使う関数 Pi つまりπ、そしてラジアン変換

# Worksheet.Function.Piはある
Excelにはあるが、実はワークーシート関数。
VBAには実は存在していない。

# Worksheetfunction.Piの中身
~~実は単なる15桁の定数。~~

# じゃあ定数でもよくない？
あわせて作る

# じゃあVBAのπも作ろう
性質からしてPublic Functionになる。

# 置き場所
モジュールの先頭
複数のモジュールを使う場合、どれか一つでよい。

# 桁数
[NASAが円周率を15桁目までしか使わない理由](https://mehori.com/blog/2016/03/decimals-of-pi/)
地球の半径で
> 円周の誤差は15桁目を使うか使わないかで、せいぜい分子一個分の差にしかなりません

奇遇ですね。ちょうどVBAやExcelの最大有効桁数15桁と同じ。
また宇宙クラスでも40桁あればよい。ということで、40桁はテキストになるが、返る関数は作ろう。
え？計算？それはそのうちに。

## 没のセット

```vb
' 複数の標準モジュールがある場合は一つだけ、また、先頭に置くこと
Public Const cPi03 = 3.14!
Public Const cPi = 3.1415926535893
Public Const cPi9 = 3.14159265
Public Const cPi40 = "3.1415926535897932384626433832795028841971"
' Subtype Radian Const Statement 派生、ラジアン、弧度法変換
Public Const cRad = cPi / 180
Public Const cDEG = 180 / cPi

Public Function vPi03() As Single
VBAPi = 3.14
End Function
Public Function vPi()
VBAPi = 3.14159265358979
End Function
Public Function vPi40() As String
VBAPi = "3.1415926535897932384626433832795028841971"
End Function
' SubType Radian
Public Function vRAD(NumberD As Double) As Double
vRAD = NumberD * 3.1415926535893 / 180
End Function
' SubType Degree
Public Function vDEG(RadianD As Double) As Double
vDEG = RadianD * 180 / 3.1415926535893
End Function

```

# ラジアン変換
次に、VBA、Excelともサイン、コサインはあります。
しかし、この中で用いるのは90度とか60度ではありません。
ラジアンに変換しないといけません。
[Sin 関数 (Visual Basic for Applications) | Microsoft Learn](https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/sin-function)
> 角度のサインを指定する倍精度浮動小数点型 (Double) の値を返します。
## 構文
`Sin(number)`
必要な 数値引数 は、 Double または角度をラジアンで表す任意の有効な 数値式 です。
The required number argument is a Double or any valid numeric expression that expresses an angle in radians.

::: note
この書き方は紛らわしい。Douboleだから90度が大丈夫みたいに読めるけど全くそうではない。
```vb
?Sin(90)
 0.893996663600558 

?Sin(90*3.14/180)
 0.999999682931835 

?Sin(90*3.1415926/180)
 1
```
と、このように90ではダメ。ラジアンで変換して初めてサイン関数のまともな値となる。
しかし
90度  1.5707963267945 
30度  0.523598775598167 
このようにわけのわからない数となる。
:::



## 注釈
> Sin 関数は、角度を受け取り、直角三角形の 2 辺の比を返します。 2 辺の比は、角度の反対側の辺の長さを斜辺の長さで割った値です。 結果は -1 ～ 1 の範囲になります。

> 度をラジアンに変換するには、度にπ/180 を掛けます。 ラジアンから度に変換するには、ラジアンに 180/pi を掛けます。

:::note
ここも紛らわしい。前段のSin関数は。。。の部分はSinそのものの説明
ただし、*度を受け取り、直角三角形の 2 辺の比を返します*はラジアンベースの説明
次の段落は変換の仕方になる。そしてそれは***用意されていない。***
:::
## 例
> 次の例では、Sin 関数を使用して角度のサインを取得しています。
```VB
Dim MyAngle, MyCosecant
MyAngle = 1.3    ' Define angle in radians.
MyCosecant = 1 / Sin(MyAngle)    ' Calculate cosecant.
```

# 上の没はダメな例
## TAN(Pi/6)  TAN(30°)
この値は0.5になるはずだがならない。やり直し。
またPi関数は実は15桁以下の数を保有している。

# さすが田中大先生
http://officetanaka.net/excel/vba/function/Tan.htm
>
```vb
Sub Sample()
    Dim a As Integer, b As Double, pi As Double
    a = InputBox("角度を入力してください")
    pi = 4 * Atn(1)
    b = a * (pi / 180)
    MsgBox Tan(b)       'タンジェントを返します
End Sub
```

# つまりvbaのPiとは
`4*ATN(1)`

```vb
?((vpi - 3)*10 -1 )*10
```

15桁以下の数がこれだと入っている。これを計算するらしい。

# 完成したコード
やはりモジュールの一つに置く

```vb
Public Const cPi = 3.1415926535893
Public Function vPi() As Double
vPi = 4 * Atn(1)
End Function
Public Function vRAD(NumberD As Double) As Double
vRAD = (NumberD * 4 * Atn(1)) / 180
End Function
Public Function vDEG(RadianD As Double) As Double
vDEG = (RadianD * 180) / (4 * Atn(1))
End Function
```

まずWorksheetfunction.piを使うのは悪手。スピードが低下する。
ATNもかなり時間は食うので、大量に使う場合は定数を使う。
ただし、三角関数を使う場合は定数を使わないほうが良い。


# 参考
[ラジアンとは？弧度法とは？定義や角度変換をわかりやすく解説 | 受験辞典](https://univ-juken.com/kodoho)
[ラジアン（弧度法）の意味と「度」への変換方法](https://sci-pursuit.com/math/radian.html)
なんで1 radはおよそ60°と言わんのやろ？ 単位を付けないのでよけい難しい。

[円周率｜40桁の数字 | 円周率全部ナビ](https://en.kazoekata.com/en-40/)
[NASAが円周率を15桁目までしか使わない理由](https://mehori.com/blog/2016/03/decimals-of-pi/)
NASAは15桁しか使わないが、15桁ではTAn(30°)は値が正確ではない。
[【VBA】三角関数 (Sin, Cos, Tan) | Excel VBA 数学教室](https://excelmath.atelierkobato.com/vba-sin/)
この記事では、Pi=3.14159265で定義しているのは90度が1になる最小の桁数より一つ多くしているということになるので、一般的な三角関数の値が返ってくるということになる。
[cosの微分が-sinになる理由を誰でも簡単に理解できるように解説 | HEADBOOST](https://www.headboost.jp/derivative-of-cosin/)
まずこれを理解したうえで、
[余弦定理を解析します | Excel VBA 数学教室](https://excelmath.atelierkobato.com/yogen/)
これが微分を使う

[【sin,cos,tanの微分】例題を解説！2乗、分数のときにはどうやる？ | 数スタ](https://study-line.com/sankaku-bibun/)
さらに微分だけ考えるとこれ
[加法定理の覚え方。図形でわかる公式の考え方｜アタリマエ！](https://hegtel.com/sankaku-kansu-ne.html)

## 逆三角関数
簡単に言うと1/sinθ

### MSまた翻訳がおかしい
というか原文からおかしい。

<blockQuote>
<h3><a href="https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/atn-function">Atn 関数 (Visual Basic for Applications) | Microsoft Learn</a></H3>
<br>2023/04/07</br>
<br> 数値のアークタンジェントを指定する Double を返します。</br>
<br> Returns a Double specifying the arctangent of a number.</br>

<h4>構文</h4>
<br>Atn(number)</br>
<br>必要な 数値引数 は、 Double または任意の有効な 数値式です。</br>
<br>元 The required number argument is a Double or any valid numeric expression.</br>
<br>引数numberは必須です。引数は倍精度浮動小数点型として有効な値か変数または任意の数式です。</br>
<h4> 注釈</h4>
<br>Atn 関数は、直角三角形の 2 辺の比 (number) を取得し、対応する角度を返します。 2 辺の比は、指定した角の反対側の辺 (対辺) の長さを、指定した角に隣接する側の辺の長さで割った値です。</br>

:::note
<br>[注意] これは、Excel の ATAN() 関数と同等です。 奇妙なことに、 Excel.WorksheetFunctions.ATAN() は存在しません (他の Excel 数式関数と同様)。 代わりに、この VBA Atn() 関数を 使用できます。</br>
:::


<br>結果の範囲は、-pi/2 から pi/2 (単位はラジアン) になります。 角度の単位を度からラジアンに変換するには、度に pi/180 を掛けます。 ラジアンから度に変換するには、ラジアンに 180/pi を掛けます。</br>

:::note
[注意] これは、Excel の ATAN() 関数と同等です。 奇妙なことに、 Excel.WorksheetFunctions.ATAN() は存在しません (他の Excel 数式関数と同様)。 代わりに、この VBA Atn() 関数を 使用できます。</b>
:::

<h4> 注意 </h4>
Atnは、Tan の逆三角関数で、引数として角度を取得し、直角三角形の 2 辺の比を返します。 Atn とコタンジェントを混同しないでください。コタンジェントは、単にタンジェントの逆数 (1/タンジェント) です。
</blockQuote>

<H3>ATN関数</h3>
引数に対する逆正接関数の値を返します。値は倍精度浮動小数点型です。
<h4>構文</h4>
<br>Atn(number)</br>
<br>引数numberは必須です。引数はタンジェントを表す、倍精度浮動小数点型として有効な値か変数または任意の数式です。</br>
<h4> 注釈</h4>
<br>逆正接関数とは、直角三角形の直角三角形の直角を挟む 2 辺の長さの比 (number) を受け取り、対応する角度をラジアンで返す関数です。 numberは求める鋭角の底辺と対辺の比であるタンジェントの値です。</br>


```text
30°：60°：90°の直角三角形の長さの比は1:√2:√3
 ^
 |60  *
 |        *
 |            *
 _90__________30_*

しかし、なぜか次のようになる。

atn(Sqr(3)/1)*180/3.14 = 60
atn(1/sqr(3))*180/3.14 = 30
```
 
:::note
[注意] これは、Excel の ATAN() 関数と同等です。
:::

　戻り値の範囲（定義域）は、$\-\frac{π}{2}$ から $\frac{π}{2}$ (単位はラジアン) になります。
　ラジアンから度数法に変換するには、ラジアンに$\frac{π}{180}$ を乗じます。
　度数法からラジアンに変換するには$\frac{180}{π}$ を乗じます。

<h4> 注意 </h4>
$atn$は、$tan$ の逆三角関数で、正接関数が、引数として角度（ラジアン）を取得し、直角三角形の 2 辺の比を返すのに対し、$atn$は2辺の比から角度を返す関数です。$atn$ は $tan^-1$ とも書きますが、コタンジェント($cot$)を混同しないでください。コタンジェントは、単にタンジェントの逆数 ($\frac{1}{tan}$) です。

そして付け加えるのは
VBAで円周率は次のように求めます $4 * ATN(1)$

### すごい説明
[アークタンジェントとコタンジェントは同じでしょうか？ -アークタンジ- 数学 | 教えて!goo](https://oshiete.goo.ne.jp/qa/2626285.html)
>こんばんは、thepurezさん。昔、サイン、コサイン、タンジェントを高校で学習しました。そのころは、セカント、コセカント、コタンジェントも習いました。時計の文字盤の１の位置にcos,１１の位置にsin,９の位置にtan,
７の位置にsec,５の位置にcosec,３の位置にcot,を書いて、中心に１を書きます。ここで、文字盤を忘れて、六角形と対角線を引きます。cosの逆数は
sec,sinの逆数はcosec,tanの逆数はcot,になっています。sin/cos=tan,
tan/sin=sec,sec/tan=cosec,のように、六角形の頂点を左に、分母、分子と読むと次の頂点が答えになっています。もうひとつ、cos^2+sin^2=1の公式は、六角形の中の下向きの正３角形でつくられます。同様に、1+tan^2=sec^2,cot^2+1=cosec^2の公式も、下向きの正三角形の頂点でつくられます。三角関数をくわしく勉強するのであれば、科学新興新社のモノグラフシリーズの三角関数を読んでみてください。

## ATN関数の説明は複数あり、一つだけ円周率の説明がある

[Atn 関数](https://support.microsoft.com/ja-jp/office/atn-%E9%96%A2%E6%95%B0-2f2262c7-1296-4166-a30d-62b9c6b4a413)
62b9c6b4a413
> VBA の例
注: 次の例は、Visual Basic for Applications (VBA) モジュールでのこの関数の使用方法を示しています。 VBA の使用方法の詳細については、[検索] の横にあるドロップダウン リストで [開発者用リファレンス] を選び、検索ボックスに検索する用語を入力します。
この例では、Atn 関数を使用して、円周率の値を計算します。

```vb
Dim pi pi = 4 * Atn(1) ' Calculate the value of pi.
```
[Excel関数で【ATAN】（アークタンジェント）関数と【ATAN2】（アーク・タンジェント・トゥ）関数、【ATANH】（ハイパーポリック・アーク・タンジェント）関数の使い方](https://onepoint.softcampus.co.jp/mos_onepoint/48155/)
[ATAN 関数 - Microsoft サポート](https://support.microsoft.com/ja-jp/office/atan-%E9%96%A2%E6%95%B0-50746fa8-630a-406b-81d0-4a2aed395543)
4a2aed395543
ワークシート関数