wordで指数を自動で上付き文字に変換させる


概要

autohotkeyというソフトを使ってwordで指数を即座に上付き文字に変換させるマクロを紹介します。具体的な仕様は以下のようになっています。

◯◯x10◇◇ と入力した後「space」か「enter」キーを押す ⇒

  1. x(小文字エックス) が "×"(掛ける)に変換
  2. ◇◇を上付き文字に変換

参考

autohotkeyを使ったことが無い方はこのリンクを参考にしてみてください。
https://ch.nicovideo.jp/Jinsichi/blomaga/ar455334
http://wg16.hatenablog.jp/entry/autohotkey_001
https://qiita.com/chr/items/47f50e36703d3bb20371

また今回の内容を書くにあたって参考にしたサイトがこちらです。↓
https://www.wordvbalab.com/code/7959/
このリンクのサイトではvbaを使ってword内の全ての文章を検索し該当する箇所を指数に変換するようになっています。ただ個人的に実用性を考えると、最後にまとめて変換するよりも毎回入力する度に変換する方が扱いやすいのではないかと考え、autohotkeyのホットストリングという機能を使って実装してみました。

コード

#IfWinActive ahk_class OpusApp ;wordを開いている時だけ実行=================================
#Hotstring C ? *;Cで大文字小文字区別, ?で文章途中からの入力も対象, *でx10を押した瞬間に発動
#Hotstring B0 ;入力した文字(x10のこと)を消さない
::x10:: ;x10が押された時に作動
oWord := ComObjActive("Word.Application")
tmp := 1 ;待ち状態にする
nstart := oWord.Selection.End ;カーソル位置取得
return
#Hotstring, B ;B0(入力した文字が残る)をリセット ← 他にもホットストリングを使うなら邪魔
#If (tmp = 1) ;待ち状態ここから=============================================================
~BS:: ;backspaceを押すとリセットする(カーソルがx10より前の時)
oWord := ComObjActive("Word.Application")
nmiddle := oWord.Selection.End
if (nmiddle <= nstart - 1)
{
tmp := 0 ;カーソル位置がx10より前ならリセット
    }
return
enter:: ;enterspaceで実行
space::
oWord := ComObjActive("Word.Application")
nend := oWord.Selection.End
myRange := oWord.ActiveDocument.Range(nstart-3, nstart-2) ;"x"の位置に合わせる
myRange.InsertSymbol(CharacterNumber:=180, Font:="Symbol", Unicode:=False) ;シンボルフォントの×を挿入
myRange := oWord.ActiveDocument.Range(nstart, nend) ;指数にする位置を選択
myRange.Font.Superscript := 1 ;上付き文字に変換
oWord.Selection.Font.Superscript := 0 ;カーソル位置の文字サイズをもとに戻す
myRange := ;Rangeは消す
tmp := 0 ;待ち状態をリセット
return
#If ;待ち状態ここまで========================================================================
#If ;ワードのみここまで======================================================================

そもそもホットストリングとは何かと言うと、ある文字列を入力した時にそれを察知して動作するプログラムのことです。例えば"ahk"と入力したら"autohotkey"と出力するというような使い方が出来ます。これを使うことで、指数を入力した時に即座に変換するコードを考えました。

autohotkeyではword,excel,powerpointのvbaを操作することが出来ます。その方法は、例えばwordの場合、
ComObjActive("Word.Application").◯◯◯(vbaのコード)
とすることで可能です。
ただ注意したいのが、wordのvbaとautohotkeyではコードの文法が異なるため、全く同じ書き方は出来ません。
以下に思いつくものを挙げておきます。


vbaで"="がautohotkeyだと":="になる

例 .Font.Superscript = true → .Font.Superscript := true

vbaのwithやsetが存在しない

end ifが必要ない

細かい条件を指定する時カッコが必要

例 .InsertSymbol CharacterNumber:=180 → .InsertSymbol(CharacterNumber:=180)

このコード、凄く便利なんですが、注意点としてx10と入力した時点で待機状態になってしまうので、x10と入力 → カーソル位置を変更 → スペースかエンターを押すとエラーが起きます。ですのでx10と入力した直後にカーソル位置を変えないようにお願いします。一応バックスペースは待機状態が発動している途中でも使う可能性があると思ったので調整しました。

ちなみに
oWord := ComObjActive("Word.Application")
これを最初に書かずに、毎回使用する度に書いている理由は、仮にワードを何も開いていない状態でこのスクリプトが読み込まれた時にエラーが起きるからです。#Ifでwordを開いている時に限定してはいるのですが、#Ifが有効なのはホットキー(space:: とか)に対してのみですのでうまくいきません。

また、vbaを使う時によくある画面の更新オフを使うか迷ったんですが、余計に遅くなる気がしたので止めました。これを書くと実行できます。↓
oWord.Application.ScreenUpdating := 0

まとめ

今までありそうで無かった便利なコードだと思います。autohotkeyでwordのvbaを操作するコードは日本語だと検索してもほとんど無いので、参考にしてもらえると嬉しいです。

もしよければこちらの記事もどうぞ。↓
wordでギリシャ文字を素早く入力する
通常マウスでコピー,ペースト,戻るなどができるようにするマクロ