WordVBA 現在の位置にフィールドコードで面積をコンマつき2位表示する 単位平方メートル、平方キロ、坪、アール、Ha、東京ドーム、ヤードポンド法

#前提
##目的
<ul>
<li><font color=Dark Red>今回はマイナスについては考慮しない。</font>
<li><font color=Dark Red>坪を想定するように左から右へ書く日本語を想定。</font>
<li>宅地の面積を平方メートル単位で入力すると、フィールドコードで換算して挿入される
<li>フィールドコードのコードを表示すると元の入力した数値で、コードを非表示にして結果を表示すると、端数を四捨五入で処理した数字で検索できるようにする。
</Ul>
##今回の特記仕様
<ul>
<li>数字が足りない場合（たとえばコンマ付きで設定しているのに2桁しかない）ときは半角のスペースが「入らない」
<li>これをクィックアクセスツールバーに登録すると、面積の数字を入力すると、単位がついてフィールドコードが挿入される。
<li>エラーの場合はなにも起きない
</Ul>

###数字が足りない場合のスペース
<ul>
<li>例えばExcelの`#,##0`というのは整数位にコンマが表示される。しかしWordは`#`がそこに数字がない場合は半角スペースを挿入しろという意味になる。 http://www4.synapse.ne.jp/yone/word2010/word2010_field_sutisyo.html
<li>このため整数位が0のときは0を表示させ、コンマつきにするのは`#,##0'でも可能だが、それでは半角スペースが入る。
<li>また0を使うと必ず0が入る。
<li>たとえば{ =0.01 &#165;#"#,#00.##" }は&#8217;&nbsp;&nbsp;00.01&#8217;と半角が2つ、ゼロが2つ入る。少なくとも#,#は半角に変わっている。00なのは0が2つだから。とりあえず半角が入るのは#が原因
<li>{ =0.01 &#165;#"#,##0.##" }とすると、&#8217;&nbsp;&nbsp;&nbsp;0.01&#8217;半角が3つになる。
</UL>
####Wordにおける正しいコンマつき表示形式
&#165;#"#,0"
このようにすると0のときは0。それ以上のときは指定された数が入る。ただし半角スペースが1つ入る。このため、問題になる場合もある。このような場合はVBAを用いて挿入するフィールドコードを分けても良い。
手順としては、換算を一度VBAでやり、Logで桁数を求めて3桁以下なら"0.00"に単位を続ける。

モジュールのプロシージャの一番上に、これを書く

```vb
Static Function LOG10(varDbl As Double) As Double
LOG10 = Log(var) / Log(10#)
End Function
```

フィールドコードを式に直す。エーカーを㎡に換算するとき、
`"=INT((" & x & "*(1000/2471.0538146717))*100+0.5)/100"`
これをvbaの式に変える
`=Int((X*(1000/2471.0538146717))*100+0.5)/100`
さらにLog10に代入する。必要なのは整数部なので、INTで切り捨てる。
`Int(Log10(Int((X*(1000/2471.0538146717))*100+0.5)/100))`
これで整数部の桁数は得られるので、あとは場合わけである。正負があればAbsが加わるが、前提として正の数としているので、考慮しない。

###小数点以下について
<UL>
<li>桁数を指定するのは0か#を使う
<li>#は半角になってしまう
<li>{ =0.1 &#165;#"#,##0.##" }は&#8217;&nbsp;&nbsp;&nbsp;0.1;&nbsp;&#8217;と0.1の後ろに必ず半角スペースが入る。
<li>00を指定すると0.10になり、宅地の面積としては好ましい
<li>#、0いずれの場合でも必ず四捨五入される{ =0.005 &#165;#"#,0.##" } と { =0.005 &#165;#"#,0.00" }は0.01になる
<li>{ =0.004 &#165;#"#,0.##" } は&#8217;&nbsp;0.0&nbsp;&#8217;と半角スペースが0の後ろに入り、 { =0.004 &#165;#"#,0.00" }は&#8217;&nbsp;0.00&#8217;となる。
</UL>

####宅地の面積を平方メートル単位で表示するWordのフィールドコードの最適な書式
以上から 
&yen;#"#,0.00"
となる。Excelとちょっと違ったものとなる。
#####差し込み印刷でもこの知識が必要
なぜかというと、ExcelからWordに流し込むときにExcelが「ごまかして」表示していた値ではなく、真の値が流れ込むためである。
つまり、二進法の近似十進計算の結果が差し込まれる。このため、「必ず」この表示形式の指定が必要である。

###マクロの記録で入力すると、ちょっと違ったフィールドコードになるが、通常のフィールドコードの入力でも良い
####マクロの記録
`  Selection.InsertFormula Formula:="=" & x , NumberFormat:="#,0.00'㎡'"`
このように数字の表示形式であることが明示される
####通常のフィールドコードの入力でも良い
`  Selection.InsertFormula Formula:="=" & x & " \#""#,0.00㎡"""`

```vb
  Selection.InsertFormula Formula:="=" & x & " \#""#,0.00㎡"""
```

ただし、変数xのあとにフィールドコードと同様、半角の空白が必要


###数字以外はアポストロフ（シングルクォーテーション）で囲む方がよい
そうしなくてもできるが、VBAの場合にはエラーになる。
またこのときダブルクォーテーションを二重にする
このため平方メートルを入れると
`Selection.InsertFormula Formula:="=" & x , NumberFormat:="#,0.00㎡"`
としても良いし
`Selection.InsertFormula Formula:="=" & x &" \#""#,0.00'㎡'"""
両方ともいいのだが、面積をカッコ書きする場合など、数字の前に文字が来るとエラーになるのでアポストロフ（シングルクォテーション）で囲む方が良い。

###キロ平方メートルはユニコードを使うか、Kmに上付数字を使うか。
####上付き数字を使う場合のフィールドコード

```vb
    Selection.InsertFormula Formula:="=" & x & " / 10000", NumberFormat:="#,0.00'km'"
      Selection.MoveRight Unit:=wdCharacter, Count:=1
          Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
        PreserveFormatting:=False
    Selection.TypeText Text:="EQ \s \up(2)"
    Selection.Fields.ToggleShowCodes
```

これは平方kmに換算して表示する場合である。kmまではアルファベット、そして`Selection.MoveRight Unit:=wdCharacter, Count:=1`で右に移動して、上付き数字を入力。しかしフィールドコードのままなので、最後にSelection.Fields.ToggleShowCodesで上付数字が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/1a6f14d8-042e-4745-28d4-0593304c9911.png)ユニコードの単位だと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/af9114b5-b8fd-5411-a3b7-5ea8983cbd04.png)
となる。
個人的には平方キロメートルは使っても立法キロメートルは使わないため2と3を間違えることはないので、ユニコード記号が良いような気がする。その一方で上付数字は見やすいしユニコードという不安もない。ただし上付き数字の場合は独立して1文字のため、行末で切れる恐れがある。また1文字としてカウントされる。とりあえずVBAでフィールドコードを挿入すると、単位のつけ間違いはない。
また平方フィート、平方マイル、平方チェイン、平方ヤードも該当する記号はないため、上付き数字を追加して単位記号を合成している。

###記号と換算係数について
<UL>
<li>平方メートルはそのまま記号を使う。
<li>平方kmもそのまま記号を使う。または上付き数字を組み合わせる。換算するために1,000,000で割る。
<li>坪は400/121の逆数0.3025を使って換算し、単位は漢字の坪を使う
<li>アールは全角アール &#13059; HTMLでは10進で`&#13059;` `chrw("&H3303")`しかないので、これを使うが、アルファベットaでよい。換算するためには100で割る。
<li>ヘクタールは全角ヘクタール`chrw("&H3336")` ヘクタール記号`chrw("&H33CA")` がある。しかし、使用が推奨されないためhaとアルファベットを組み合わせる。換算するために10,000で割る。
<li>アールやヘクタールは使用が推奨されないものの、平方キロは100万倍のため、非常に使い勝手が悪く、今後も使用されると思われる。
<li>1坪=1歩、30歩=1畝、10畝=1反（段）、1町歩は10反＝100畝とする
</UL>

##VBAのコード

###平方メートルを入力するとフィールドコードが挿入される。書式は、平方メートルが追加され、コンマつき小数点2位で四捨五入される

```vb
Sub InsertFieldCodeWithSuareMeter()
' for Word VBA
' To Show Land Area.
' Input Square Meters, Insert Field Code Format add SquareMeter Unit character And comma, and point 2 round
Dim x
x = InputBox("面積を入力するとコンマつき小数点2位、㎡を表示します", "面積表示フィールドコードの挿入", 123456.555)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=" & x, NumberFormat:="#,0.00㎡"
    Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

####平方キロメートルを平方キロメートルとして単位を付加して端数処理したフィールドコードを挿入
よく考えると、平方キロメートルを平方メートル単位で入力することは学習するとき以外はないのではないか。
ならばキロメートルのままというのも必要だろう。

```vb
Sub InsFldCodeWithSuareKiloMetercommapoint2withUnit()
' for Word VBA
' Input Square KiloMeters, Insert Field Code Format add Square KiloMeter Unit character And With comma, and point 2 round
Dim x
x = InputBox("面積を平方キロメートル入力するとコンマつき、小数点2位四捨五入で2位表示、単位記号を追加します", "面積表示フィールドコードの挿入", 123456.555)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=" & x, NumberFormat:="#,0.00" & "'" & ChrW("&H33A2") & "'"
    Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

#####またはフィールドコードに近い形で書く方法

```vb
Sub InsFldCodeWithSuareKiloMetercommapoint2withUnit1()
' for Word VBA
' Input Square KiloMeters, Insert Field Code Format add Square KiloMeter Unit character And With comma, and point 2 round
Dim x
x = InputBox("面積を平方キロメートル入力するとコンマつき、小数点2位四捨五入で2位表示、単位記号を追加します", "面積表示フィールドコードの挿入", 123456.555)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=" & x & " \#""#,0.00'" & ChrW("&H33A2") & "'"""
    Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

#####Mergefieldは0.56になり、結果がおかしく、使えない

```vb
Sub InsFldCodeWithSuareKiloMetercommapoint2withUnit2()
' Do not Use This code. This is only for test of mergefiled.
' for Word VBA
' Input Square KiloMeters, Insert Field Code Format add Square KiloMeter Unit character And With comma, and point 2 round
' これは失敗します。たとえばxが1234になったり、結果が0.56と表示されます。
Dim x
x = InputBox("面積を平方キロメートル入力するとコンマつき、小数点2位四捨五入で2位表示、単位記号を追加します", "面積表示フィールドコードの挿入", 123456.555)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
        PreserveFormatting:=False
    Selection.TypeText Text:="Mergefield """ & x & """ \#""#,0.00'" & ChrW("&H33A2") & "'"""
    Selection.Fields.Update
    Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

###平方メートルをアールに(整数位）
ヘクタールとアールは小数点以下はつかないと思われる。
全角アールを使っている

```vb
Sub InsFldCodeSquarMeterstoアール()
' for Word VBA
' for Land area
' Input Square KiloMeters, Insert Field Code Format add are Unit character And With comma, and round
Dim x
x = InputBox("面積㎡単位で入力するとコンマつき、アールに換算して表示します(整数位で四捨五入)", "面積表示フィールドコードの挿入", 123456.555)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=" & x & " / 100", NumberFormat:="#,0㌃"
    'Selection.InsertFormula Formula:="=" & x & " / 100", NumberFormat:="#,0'a'"
Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

###平方メートルをヘクタールに(整数位）
ヘクタールとアールは小数点以下はつかないと思われる。
haを使っている

```vb
Sub InsFldCodeSquarMeterstoヘクタール()
' for Word VBA
' Input Square Meters, Insert Field Code Format add hectare Unit character And With comma, and round
Dim x
x = InputBox("面積を㎡単位で入力するとコンマつき、ヘクタール換算で表示します(整数位で四捨五入)", "面積表示フィールドコードの挿入", 123456.555)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    'Selection.InsertFormula Formula:="=" & x & " / 10000", NumberFormat:="#,0㌶"
    Selection.InsertFormula Formula:="=" & x & " / 10000", NumberFormat:="#,0'ha'"
Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```


###平方メートルを平方キロメートルに（小数点2位四捨五入で2位表示)

```vb
Sub InsFldCodeSquarMeterstoSuareKillometerWithcommaround2()
' for Word VBA
' Input Square Meters, Insert Field Code Format add Square Kilometers Unit character And With comma, and round 2 point
Dim x
x = InputBox("面積㎡単位で入力するとコンマつき小数点2位、平方キロで表示します", "面積表示フィールドコードの挿入", 123456.555)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    'Selection.InsertFormula Formula:="=" & x & " / 100000", NumberFormat:="#,0.00" & ChrW("&H33A2")
    Selection.InsertFormula Formula:="=" & x & " / 100000 \#""#,0.00'" & ChrW("&H33A2") & "'"""
    Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

####上つき数字を使う平方メートルを平方キロメートルに（小数点2位四捨五入で2位表示)
上つき数字もフィールドコードを使う。

```vb
Sub InsFldSquareMetertoSquareKillometerUp2()
' for Word VBA
' Input Square Meters, Insert Field Code Format add km and upper 2 And With comma, and round 2 point
Dim x
x = InputBox("面積㎡単位で入力するとコンマつき小数点2位、平方キロで表示します", "面積表示フィールドコードの挿入", 123456.555)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
   Selection.InsertFormula Formula:="=" & x & " / 1000000", NumberFormat:="#,0.00'km'"
      Selection.MoveRight Unit:=wdCharacter, Count:=1
          Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
        PreserveFormatting:=False
    Selection.TypeText Text:="EQ \s \up(2)"
  Selection.Fields.ToggleShowCodes
End Sub
```

###平方メートルを坪（整数位切捨て）に換算
これは200平米を四捨五入すると、61坪になるが、通常は61坪ではなく（約）60坪である。
つまり概数を示すためのものなので（価格を計算する数量の単位としては法律で使用が禁止）切捨てにしている。

```vb
Sub ShowNumberWithSuare概数坪()
Dim x
x = InputBox("面積平方メートル単位で入力するとコンマつき整数位端数切捨て、単位：坪のフィールドコードを挿入します", "面積表示フィールドコードの挿入", 200)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=INT(" & x & "*0.3025) \# ""#,0'坪'"""
        Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

###フィールドコードなし平方メートルを町反畝歩に
昔はメートル単位ではなく町反畝歩で換算していました。
さすがにこれはフィールドコードでは無理なので、Selection.InsertAfterで文字列で入れています。
歩未満は切り捨てです。つまり3.3025に満たないと0になります。
坪で本気を出すのは小数点以下ではなく、整数位です。

```vb
Sub Ins町反畝歩()
Dim x
Dim u町 As Long, u反 As Long, u畝 As Long, u歩 As Long
x = InputBox("面積平方メートル単位で入力すると町反畝歩で表示します", "面積表示フィールドコードの挿入", 123456.555)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
u町 = CDec(x \ CDec(9917.36))
x = x - (u町 * 9917.36)
u反 = CDec(x \ CDec(991.736))
x = CDec(x - (u反 * 991.736))
u畝 = x \ CDec(99.1736)
x = CDec(x - (u畝 * 99.1736))
u歩 = x \ CDec(99.1736 / 30)
Selection.InsertAfter Text:=IIf(u町 <> 0, u町 & "町歩", "") & IIf(u反 <> 0, u反 & "反", "") & IIf(u畝 <> 0, u畝 & "畝", "") & IIf(u歩 <> 0, u歩 & "歩", "0")
End Sub
```

###東京ドームの約何倍表示
建築面積の46,755平方メートルを使うと公式にある。
これは読売新聞の宣伝のためというのもあるが、実はこれ、ほぼ5ヘクタールであり、数字的にもわりと意味がある。
単純に平方メートルを50000で割ると何倍か計算できる。


```vb
Sub InsfldSquareMeterto東京ドーム()
' for Word VBA
' Input Square Meters, Insert Field Code Format Tokyo Dome Unit ,point 1 round
Dim x
Const unit東京ドーム = 46755

x = InputBox("4675㎡以上の面積を平方メートル入力するとコンマつき,小数点1位四捨五入1位表示、東京ドームの面積の何倍をフィールドコードで挿入します。", "面積表示フィールドコードの挿入", 123456.555)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
If x < 4675 Then Exit Sub ' 東京ドームと比較するため0．1以下は0になり、意味がない。
On Error GoTo 0
    Selection.InsertFormula Formula:="=" & x & "/" & unit東京ドーム, NumberFormat:="'東京ドームの約'#,0.0'倍'"
    Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

##平方（キロ）メートルからヤードポンド法
###単位記号は合成
該当する記号がないため、上付き数字を追加して平方にしている。
このため、行末では単位記号がmi 改行 2となることもありうる。
また、平方マイルは本当に大きくて、1平方キロメートルですら0.3mi<sup>2</sup>にしかならない。
###平方キロから平方マイル

```vb
Sub InsFldCodeWithSuarekiloMeterToSqmicommapoint2withUnit()
' for Word VBA
' Input Square Meters, Insert Field Code Format add square mile Unit character And With comma, and point 2 round
Dim x
x = InputBox("面積を平方「キロ」メートルで入力すると平方マイルに換算し、コンマつき、小数点2位四捨五入で2位表示、単位記号を追加します", "面積表示フィールドコードの挿入", 5000)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=INT((" & x & "*( 38.610215854245/100))*100+0.5)/100", NumberFormat:="#,0.00" & "'mi'"

    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
                                            PreserveFormatting:=False
    Selection.TypeText Text:="EQ \s \up(2)"
  Selection.Fields.ToggleShowCodes
      Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

以下は平方メートルからの換算になる
###平方メートルから平方フィート

```vb
Sub InsFldCodeWithSuareMeterToSqftcommapoint2withUnit()
' for Word VBA
' Input Square Meters, Insert Field Code Format add acer Unit character And With comma, and point 2 round
Dim x
x = InputBox("面積を平方メートルで入力すると平方フィートに換算し、コンマつき、小数点2位四捨五入で2位表示、単位記号を追加します", "面積表示フィールドコードの挿入", 5000)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=INT((" & x & "*(10763910.41671/1000000))*100+0.5)/100", NumberFormat:="#,0.00" & "'ft'"

    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
                                            PreserveFormatting:=False
    Selection.TypeText Text:="EQ \s \up(2)"
  Selection.Fields.ToggleShowCodes
      Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

###平方メートルから平方ヤード

```vb
Sub InsFldCodeWithSuareMeterToSqYdcommapoint2withUnit()
' for Word VBA
' Input Square Meters, Insert Field Code Format add acer Unit character And With comma, and point 2 round
Dim x
x = InputBox("面積を平方メートルで入力すると平方ヤード（ヤール）に換算し、コンマつき、小数点2位四捨五入で2位表示、単位記号を追加します", "面積表示フィールドコードの挿入", 5000)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=INT((" & x & "*(1195990.0463011/1000000))*100+0.5)/100", NumberFormat:="#,0.00" & "'yd'"

    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
                                            PreserveFormatting:=False
    Selection.TypeText Text:="EQ \s \up(2)"
  Selection.Fields.ToggleShowCodes
      Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

###平方メートルから平方チェイン

```vb
Sub InsFldCodeWithSuareMeterToSqChcommapoint2withUnit()
' for Word VBA
' Input Square Meters, Insert Field Code Format add acer Unit character And With comma, and point 2 round
Dim x
x = InputBox("面積を平方メートルで入力すると平方チェーンに換算、コンマつき、小数点2位四捨五入で2位表示、単位記号を追加します", "面積表示フィールドコードの挿入", 5000)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=INT((" & x & "*(2471.0538146717/1000000))*100+0.5)/100", NumberFormat:="#,0.00" & "'ch'"

    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
                                            PreserveFormatting:=False
    Selection.TypeText Text:="EQ \s \up(2)"
  Selection.Fields.ToggleShowCodes
      Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

ところでこうした単位が農作業に繋がっているのが興味深い。測量と農業は中国、日本、ヨーロッパで極めて明確に結合している。作物がどれくらい取れるか、そういう計算をするために測量が発達し、単位が作られている。もともとは作物がある一定量取れる、または雄牛一頭で耕作可能な面積を1反や1エーカーとしている。つまりある単位が何平方メートルかは本当は意味がなくて、ある単位はなにをもって1単位としているかが重要だということになる。

###平方メートルからルードへ

```vb
Sub InsFldCodeWithSuareMeterToRoodcommapoint2withUnit()
' for Word VBA
' Input Square Meters, Insert Field Code Format add acer Unit character And With comma, and point 2 round
Dim x
x = InputBox("面積を平方メートルで入力するとルードに換算でコンマつき、小数点2位四捨五入で2位表示、単位記号を追加します", "面積表示フィールドコードの挿入", 5000)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=INT((" & x & "*(988.42152586866/1000000))*100+0.5)/100", NumberFormat:="#,0.00" & "'ro'"
    Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

ところで、
1ac = 4ro = 4840 yd<sup>2</sup>
1yd<sup>2</sup> = 9ft<sup>2</sup>
という関係が成立しているが、上記の単位はCasioの高度計算サイトで1平方キロの換算値を割っている。
このため、きれいにこの関係が成立していない場合もある。

###平方メートルからエーカーへ


```vb
Sub InsFldCodeWithSuareMeterToAcrecommapoint2withUnit()
' for Word VBA
' Input Square Meters, Insert Field Code Format add acer Unit character And With comma, and point 2 round
Dim x
x = InputBox("面積を平方メートルで入力するとエーカーに換算、コンマつき、小数点2位四捨五入で2位表示、単位記号を追加します", "面積表示フィールドコードの挿入", 5000)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=INT((" & x & "*(247.10538146717/1000000))*100+0.5)/100", NumberFormat:="#,0.00" & "'ac'"
    Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

###エーカーから平方メートルへ

```vb
Sub InsFldCodeWithAcreToSuareMetercommapoint2withUnit()
' for Word VBA
' Input Square Meters, Insert Field Code Format add acer Unit character And With comma, and point 2 round
Dim x
x = InputBox("面積をエーカーで入力すると平方メートルに換算、コンマつき、小数点2位四捨五入で2位表示、単位記号を追加します", "面積表示フィールドコードの挿入", 5000)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=INT((" & x & "*(1000000/247.10538146717))*100+0.5)/100", NumberFormat:="#,0.00" & "'ac'"
    Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

###逆にエーカーや平方フィートからどうやって平方メートルを出すか。
まずSub プロシージャの名前を SuareMeterToAcreをひっくり返して、 AcreToSqMeterにする
InputBoxのメッセージをひっくり返す
面積をエーカー単位で入力すると平方メートルに換算し、以下同文

平方メートルは上付き数字がいらないので、以下の行があれば消す。

```vb
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
                                            PreserveFormatting:=False
    Selection.TypeText Text:="EQ \s \up(2)"
  Selection.Fields.ToggleShowCodes
```

`"#,0.00" & "'ac'"`単位表記を変える。　"#,0.00" & "'㎡'"

そして最後に分数をひっくり返す
`247.10538146717/1000000` `1000000/247.10538146717`

```vb
Sub InsFldCodeWithAcreToSuareMetercommapoint2withUnit()
' for Word VBA
' Input Acre , Insert Field Code Format add square meter Unit character And With comma, and point 2 round
Dim x
x = InputBox("面積をエーカー単位で入力すると平方メートルに換算し、コンマつき、小数点2位四捨五入で2位表示、単位記号を追加します", "面積表示フィールドコードの挿入", 5000)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=INT((" & x & "*(1000000/247.10538146717))*100+0.5)/100", NumberFormat:="#,0.00" & "'㎡'"
    Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
Sub InsFldCodeWithAcreToHectarecommapoint2withUnit()
' for Word VBA
' Input Acre , Insert Field Code Format add square meter Unit character And With comma, and point 2 round
Dim x
x = InputBox("面積をエーカー単位で入力するとヘクタールに換算し、コンマつき、小数点2位四捨五入で2位表示、単位記号を追加します", "面積表示フィールドコードの挿入", 5000)
On Error Resume Next
If x <> CDbl(x) Then Exit Sub
If Err.Number <> 0 Then Exit Sub
On Error GoTo 0
    Selection.InsertFormula Formula:="=INT((" & x & "*(1000/2471.0538146717))*100+0.5)/100", NumberFormat:="#,0.00" & "'Ha'"
    Selection.MoveRight Unit:=wdCharacter, Count:=1
End Sub
```

これで計算するとエーカーは1エーカーは0.4ヘクタールで換算すると概数が得られるし、簡単だとわかる。
くまのプーさんは100エーカーの土地に、つまり40ヘクタールに住んでいる。
大地主である。どんだけはちみつを食ってるんだあいつは。固定資産税をふんだくる。。。わけにも行かない。日本国内ではないので税法が及ばない。また、計算サイトを見ると、林業関連のほか、翻訳関係が多いようだ。この林業や翻訳ではこのマクロが使えそうである。しかし、林業や農業は単純に一反が何平方メートルでは足りない。上記のような換算が必要である。またヤードポンドが使用禁止のため、換算が発達していないため、翻訳で困ることになる。


#すべてのフィールドコードの表示を切り替える
https://qiita.com/Q11Q/items/44280bc93fbea84e4b28
にもあげてありますが、一応。

```vb
Sub ToggleShowCodeOfFieldCodesInDocument()
' For Word VBA
' Documentのすべてのフィールドコードについてコード表示させるかどうかを反転させる
Dim wDoc As Document: Set wDoc = ThisDocument
Dim fc As Field, i As Long
If wDoc.Fields.Count > 0 Then
For i = wDoc.Fields.Count To 1 Step -1
Set fc = wDoc.Fields(i)
fc.ShowCodes = Not fc.ShowCodes
Next
End If
End Sub

```

##仕上げにテキスト化するとき、EQフィールドを除く
###ロックされたものを除き更新後テキスト化

```vb
Sub FieldCodeQuickUnlinkExceptEQfield()
' For Word VBA
' 上付き数字のEQフィールドを除き、更新後テキスト化する
' ロックされているものは更新されないでテキスト化される
Selection.WholeStory
With Selection
.Fields.Update
.Fields.Unlink
End With
End Sub
```

###正規表現で選択できるバージョン
いずれにしてもEQフィールドは残ります。

```vb
Sub FieldCodeUnlinkExceptEQfield()
' For Word VBA
' 上付き数字のEQフィールドを除き、テキスト化する
' 未保存の場合には動かない
' 保存されているフォルダに、ランダムな名前で、フィールドのリストを作ってからテキスト化する。
Dim wDoc As Word.Document: Set wDoc = ThisDocument
Dim wFld As Word.Field
Dim wFlds As Word.Fields
Dim Reg, iMatch, MC, M: Set Reg = CreateObject("VBScript.RegExp")
Dim FSO, ofolder, TextStream: Set FSO = CreateObject("Scripting.FileSystemObject")
Dim t1, bl As Boolean
If ThisDocument.Saved = False Then
MsgBox "フィールドコードをテキスト化する前に、保存してください、終了します", vbCritical + vbOKOnly, "未保存です"
Exit Sub
End If
t1 = MsgBox("ロック（更新がされない処理）をしているフィールド（コード）を解除してから更新してテキスト化する場合はYesを、ロックされているものを除いて更新後テキスト化する場合はNoを（推奨）をやめるときはCancelをクリックしてください", vbYesNoCancel, "ロックされたフィールドコードの処理の確認")
If t1 = vbCancel Then Exit Sub
If t1 = vbYes Then
bl = True
ElseIf t1 = vbNo Then
bl = False
End If
Set ofolder = FSO.getfolder(ThisDocument.Path)
With Reg
.Global = True
.IgnoreCase = False
.MultiLine = True
.Pattern = "EQ\s\\"
End With
Set wFlds = wDoc.Fields
If wFlds.Count > 0 Then
Set TextStream = FSO.Opentextfile( _
                                   FSO.BuildPath( _
                                                     ThisDocument.Path, _
                                                     FSO.getbasename( _
                                                        FSO.gettempname _
                                                                                ) _
                                                       ) _
                                                   & ".txt", 2, True, -1 _
                                                 )
TextStream.WriteLine ThisDocument.FullName
TextStream.WriteLine "Field Code List"
TextStream.WriteLine "Code" & AddvbTab("Type") & AddvbTab("Locked") & AddvbTab("Index") & AddvbTab("kind") & AddvbTab("Result")

For Each wFld In wFlds
On Error Resume Next
TextStream.WriteLine Chr(34) & wFld.Code & Chr(34) & vbTab & AddvbTab(wFld.Type) & AddvbTab(wFld.Locked) & AddvbTab(wFld.Index) & AddvbTab(wFld.Kind) & AddvbTab(wFld.Result)
On Error GoTo 0
If Err.Number <> 0 Then
TextStream.WriteLine Chr(34) & "Error.occur" & Chr(34) & vbTab & AddvbTab(Err.Number) & AddvbTab(Err.Description) & AddvbTab(Err.Source) & vbTab & vbTab
Err.Clear
End If
If wFld.ShowCodes = True Then wFld.ShowCodes = False
  If bl = False Then
    If wFld.Locked = True Then wFld.Locked = False
  End If
Next
TextStream.Close
Set FSO = Nothing
Selection.WholeStory
Selection.Fields.Update

For Each wFld In wFlds
If Not Reg.test(wFld.Code) Then
wFld.Select
wFld.Unlink
End If
Next
End If
Set Reg = Nothing
End Sub
```

# 参考文献
https://support.microsoft.com/ja-jp/office/word-%E3%81%AE%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89-%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7-1ad6d91a-55a7-4a8d-b535-cf7888659a51


Word：EQフィールドの使い方(\Sスイッチ ）上付き・下付き文字
http://office-qa.com/Word/wd805.htm
Word2010 フィールドの書式スィッチ
http://www4.synapse.ne.jp/yone/word2010/word2010_field_sutisyo.html
Word差し込み印刷：数値の表示形式を指定する（3桁区切り他
http://office-qa.com/Word/wd567.htm
Word2010-2016：フィールドコード  共通スイッチ（まとめ）
http://office-qa.com/Word/wd601.htm
計算サイト　面積の換算
https://www.calc-site.com/units/area/10
高度計算サイト　 Casio
https://keisan.casio.jp/exec/system/1236214087