VBAメモ このユーザ辞書管理マクロの使い道について

f:id:gyokusen_since:20190907180619p:plain

ユーザ辞書CHKボタン押下すると・・・
本シート上でユーザ辞書の管理が可能になります。
<利点>
・アドイン登録することでエクセル文書入力中やその他の文書の入力中に思い通りの変換ができないときにすぐにメモして登録できるようになります。
・別のPC(ノートPCを含む)に同じ変換辞書で行いたい場合に便利です。
・定期的に見直して不要になったものを削除したり、インターネット上から用語を拾ってきたときにメモするのに最適です。
 
https://toricago.hatenablog.com/entry/2016/08/03/223634
学術用語、専門的な用語、最新用語などが変換できないとき
知人や友人などの名前がうまく変換できないとき
長い単語を短い読みで入力したいとき
同音異義語など、用語の使い方がよく混乱し、ユーザー コメントを付け候補一覧で見分けたいとき


<まとめ>

Windows10のユーザ辞書自体はコマンドラインインターフェースがどうもなさそうで結局Sendkeysを利用してユーザ辞書を登録しようという発想でチャレンジしました。

<嵌った点>

1.[ NumLockがオフになる ]

VBAのSendkeysはNumLockがオフになるということでWSHのSendkeysで回避できるのでそちらを採用したが何故か結果が芳しくないケースがあり、最終的にはVBAのSendkeysを利用することにした。NumLockのオフの回避は毎回無条件にSendKeys "{NUMLOCK}"で対応することにしました。

2.[ クリップボードに設定する処理はすぐに反映されていないケースがある]

ファイル名を入力する必要があるのですがクリップボードにファイル名をコピーしてCtrl+vで貼り付けようとしました。しかしクリップボードにセットするコマンドはSJISにある文字しか対応できませんでした。ところで以下の技を使えばUNICODEでも大丈夫なことが分かりました。

Private Sub SetCB(ByVal str As String)
'クリップボードに文字列を格納
 With CreateObject("Forms.TextBox.1")
  .MultiLine = True
  .Text = str
  .SelStart = 0
  .SelLength = .TextLength
  .Copy
 End With
End Sub

ところで当初はSendkeysは2バイト文字列は送付できないと思っていたのですが実はできることを知り下記の形式でユーザ辞書の一覧出力のファイル名を設定することができました。上記のクリップボード利用だとOSのプロセスが絡んでいるためかすぐにクリップボードに反映されていなため何度も失敗してしまいました。

sFileName = "辞書一覧.txt"

Application.Sendkeys sFileName

3.[ PCではうまくいく処理がノートPCではうまくいかない]

Sendkeysによる処理がPCではうまくいくのに、ノートPCではNGばかりになり途方にくれました。最終的にはクリップボード方式をやめたら上手くいくようになりました。

4.[ マッチング処理のための複数キーのソート処理]

最初はキーを連結した項目を作り、その項目をソートキー指定すればいいと思ってましたがそのためには最初のキー項目の長さが同じでないと正しい複合キーのソートはできないことが分かりました。それでどうしようかと思ってググっているとなんとステーブルソートならば最初に二番目のキー項目だけでソートしてその結果に対して今度は1番目のキー項目で所期の目的とすることが可能なことが分かりました。ステーブルソートに関しては相当性能が良いマージソートがありそれを利用して2回ソート実行で解決しました。

5.[ ユーザ辞書に1件も登録がない場合]

Windows10のユーザ辞書は登録したユーザ辞書の項目が1件もない場合はプルダウンメニューの該当コマンド自体がdisableとなってダウンロードに失敗することがわかりました。この対応は難しく事前にダミー登録を1件して失敗しないようにしようかと思いましたが、結局はファイルが存在してない場合はユーザ辞書の一覧出力に失敗したと判断して登録ゼロ件対応をすることにしました。

<身につけたこと>

1.Application.Waitコマンドの待ち時間が1秒以下の場合の設定方法

2.複数のキー項目を対象にソートする場合の方法

3.2次元配列の使い方

4.マッチングによるユーザ辞書に登録済かどうかのチェック

5.ユーザ辞書には登録してあるが管理シート上にはない場合にシートの上位に挿入する方法。その他の項目はチェック前と同じ並び順を維持する方法。