Word VBA 数式の*/を✕÷に変えるマクロを使い、Wordでも無計算で値を出せるようにする（前編）

# とろこでUWP版のCalcですが
コンマ付き数字で戻すことができないと考えられていたのですが、マウスを使うことでコピーして貼り付けができました。
しかし、ちょっと無茶すぎる
## 標準モードと関数モードの違いが
関数電卓ではない機能があります。常に手前に表示させるという機能です。
なので標準モードにして、常に手前に表示とします。
ところが標準モードではコンマ付き数字やカッコがあると計算できません。
他方、関数電卓モードは常に手前にすることはできませんが、カッコやコンマ付き数字を解釈できます。
なので、関数電卓モードでウィンドウを調整するほうが良いです。
履歴も表示されるので、二重に確認できます。
## Wordを起動し、以下のマクロをモジュールにコピペするとともに参照設定します
後編でクリップボードとExcelを使います。今回は正規表現がメインです。この3つw参照設定してください。
## Wordに数式を入力します
最も大学の論文のような複雑なものではなく、実務で使う程度のものです。
今回はフィールドコードではなく、そのま入力します。
半角数字で演算子の間にスペースは入れないでください。
`1,235*1.1+3.85*1.25'まずWordにここまで打ちます。そして選択してコピー
電卓でCtrl+VでEnter

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/a039cd64-8628-84e9-f27e-93ea9dbd8d5a.png)

そしてなんと表示されている数字をマウスで選択状態にします。
この状態でCtrl+Cをうち、Wordに戻して=イコールを入力し、Ctrl+vを打ちます
`1,235*1.1+3.85*1.25=1,363.3125'
すると結果的にWordでも、計算をすることなく値を得ることができます。
とりあえず、数字を入力し終わったら、演算子を変更します。
なお、コンマが不要の場合にはCtrl+CとCtrl+Vで値を貼り付けて良いです。

## 記号を変更する必要がある
日本では掛け算と、割り算は✕、÷を使います。
これをマクロで変更します。
そこで、Excelと正規表現(VBScript Regular Exzpression Version 5.5)を参照設定します
wdOperatorCharChangeを起動してください。
基本的に数式は数字と数字間の*/と考えて変換します。
よく考えるとカッコの間というのもありました。
でもまあ`sPattern = "(\)|\]|\})\*(\(|\{|\[)"`
こんな感じのをあと一回やればいいと思います。

```vb
Sub wdOperatorCharChange()
'正規表現 VBScript regular expression 5.5 参照設定
' For Word VBA
' 機能
' Windows 電卓で計算できる形の×÷に変える
' 例外処理がまだ必要と思われる
' Windows 電卓( UWP版, タッチパネル対応版）について
' */だと電卓に貼り付けてEnterを押すことで計算結果が得られる。
' 式を選択してペーストすると貼れる 標準電卓で最前面に表示にしてできるだけ大きさを小さくすること
' ただし、現在のUWP版はCtrl+C Ctrl+Vで結果を貼り付けるとコンマが消える
' 直接、画面に表示された結果をマウスで選択してコピーし、ペーストするとコンマがつく
Dim Reg As New RegExp
Dim M As Match, MC As MatchCollection, sMs As SubMatches
Dim wDoc As Word.Document: Set wDoc = ThisDocument
Dim wRng As Word.Range, wPara As Word.Paragraph, wPars As Word.Paragraphs
Dim i As Long, CNT As Long
Dim buf1 As String
Set wparas = wDoc.Paragraphs
With Reg
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "(\d+|\d+円/㎡|\d+円/" & ChrW(13221) & ")(\*)(\d+)"
For Each wPara In wparas
Set wRng = wPara.Range
If .Test(wRng.Text) = True Then
buf1 = wRng.Text
buf1 = .Replace(buf1, "$1×$3")
Debug.Print "OK"
wRng.Text = buf1
End If
Next
End With
With Reg
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "(\d+|\d+円/㎡|\d+円/" & ChrW(13221) & ")(/)(\d+)"
For Each wPara In wparas
Set wRng = wPara.Range
If .Test(wRng.Text) = True Then
buf1 = wRng.Text
buf1 = .Replace(buf1, "$1÷$3")
Debug.Print "OK"
wRng.Text = buf1
End If
Next
End With
End Sub
```

## 記号を戻して電卓で計算できるようにする
しかし、数字を変えることはおうおうにしてあるものです。
その時、電卓をまた入力するのでは意味がありません。
今度は✕、÷を`*/`に戻すWordのマクロが必要です。

```vb
Sub Rev_wdOperatorCharChange()
' 正規表現 VBScript regular expression 5.5 参照設定
' For Word VBA
' 機能
' Windows 電卓で計算できる形 ×をアスタリスク÷をスラッシュに書き換える。上記の逆。値を変えて、再度計算するときに使用する
' 例外処理がまだ必要と思われる
' Windows 電卓( UWP版, タッチパネル対応版）について
' ×÷は無効な入力になる(Invaild Input)ので戻す必要がある
' 式を選択してペーストすると貼れる 標準電卓で最前面に表示にしてできるだけ大きさを小さくすること
' ただし、現在のUWP版はCtrl+C Ctrl+Vで結果を貼り付けるとコンマが消える
' 直接、画面に表示された結果をマウスで選択してコピーし、ペーストするとコンマがつく
Dim Reg As New RegExp
Dim M As Match, MC As MatchCollection, sMs As SubMatches
Dim wDoc As Word.Document: Set wDoc = ThisDocument
Dim wRng As Word.Range, wPara As Word.Paragraph, wPars As Word.Paragraphs
Dim i As Long, CNT As Long
Dim buf1 As String
Set wparas = wDoc.Paragraphs
With Reg
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "(\d+|\d+円/㎡|\d+円/" & ChrW(13221) & ")(÷)(\d+)"
For Each wPara In wparas
Set wRng = wPara.Range
If .Test(wRng.Text) = True Then
buf1 = wRng.Text
buf1 = .Replace(buf1, "$1/$3")
Debug.Print "OK"
wRng.Text = buf1
End If
Next
End With
With Reg
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "(\d+|\d+円/㎡|\d+円/" & ChrW(13221) & ")(×)(\d+)" '立法メートルm3は環境依存文字VBEでは表示されない。
For Each wPara In wparas
Set wRng = wPara.Range
If .Test(wRng.Text) = True Then
buf1 = wRng.Text
buf1 = .Replace(buf1, "$1*$3")
Debug.Print "OK"
wRng.Text = buf1
End If
Next
End With
End Sub
```

### ずれないテンプレートとあわせてWordの欠点を消す
このコピペで電卓とWordの間で計算させて値を戻すことができると、等幅フォントのテンプレートと合わせて、Excelのように上下がずれず、しかも適切に計算してくれることになります。
今までフィールドコードや票を使っていましが。
後半は、Excelとクリップボードを使います。