Access郵便番号辞書を最新にする方法(叙述トリック)
たまにAccess入れてるところから住所入力支援の郵便番号最新にできないかと問い合わせが来る。
ご存じの通りAccessの郵便番号辞書は2013年で更新が止まっていて、
さらにAccess2010以降だと郵便番号辞書の形式が変わってしまっているのでどうしようもない。
(それ以前のバージョンであれば、某DLLを差し替えれば実は更新が可能だったりする)
そんなわけで今日も問い合わせが来たんだけど、なんか唐突に最新にする方法を閃いた。
住所入力支援を外したうえで、郵便番号の更新後処理をこんな感じにする
Private Sub TXT_郵便_AfterUpdate() If Trim(Nz(Me.TXT_住所)) = "" Then Me.TXT_住所.SetFocus Me.TXT_住所 = Format(Me.TXT_郵便.Value, "000-0000") VBA.Interaction.SendKeys "{CONVERT}" VBA.Interaction.SendKeys "{CONVERT}" VBA.Interaction.SendKeys "{CONVERT}" VBA.Interaction.SendKeys "{enter}" End If End Sub
郵便番号部分を全部選択して、変換ボタンを3回ぐらい押せばWindows側のIMEにあるやつが出てくるってわけ。
うまく出てこなかったら最後のEnterだけ消せば、変換中の状態が表示されるし、もうそれで勘弁してくれという気持ち。
たまにnumlockがオフになるからそのときはこちらを参考に。
https://hatenachips.blog.fc2.com/blog-entry-400.html
MSZIP.DICをどうにかできないかと眺めてはみたけど、市町村名と町名が分かれて入ってるみたいで自力更新は難しそうなんだよな。
これ更新するならまだ郵便番号住所テーブルでも使ってdlookupする仕組みにする方が早いだろうし。
2023/7/5
numlock対策込みの改良版(※未テスト)*1
'Public Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long '32bitの場合はこちら Public Declare PtrSafe Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long Const VK_NUMLOCK = &H90 Function IsNumLockOn() As Boolean Dim keys(0 To 255) As Byte GetKeyboardState keys(0) IsNumLockOn = keys(VK_NUMLOCK) End Function Sub SendKeysWrapper(keys) Dim wasNumLock wasNumLock = IsNumLockOn() VBA.Interaction.SendKeys keys, True If wasNumLock = True Then VBA.Interaction.SendKeys "{NUMLOCK}", True End If End Sub 'つかいかた ' Call Com_住所入力支援(Me, Me.txt_郵便, Me.txt_住所) Public Sub Com_住所入力支援(D_Frm As Form, 郵便番号 As Object, 住所 As Object) If Trim(Nz(住所)) = "" Then D_Frm.SetFocus 住所.SetFocus 住所 = Format(郵便番号.value, "000-0000") SendKeysWrapper "{CONVERT}" SendKeysWrapper "{NONCONVERT}" SendKeysWrapper "{NONCONVERT}" SendKeysWrapper "{NONCONVERT}" SendKeysWrapper "{CONVERT}" SendKeysWrapper "{CONVERT}" '候補が複数出ることがあるので最後のEnterはコメントしておく ' SendKeysWrapper "{enter}" End If End Sub
*1:テスト依頼してた新人が他部署に取られてそれ以降日の目を見ないままお蔵入りしてる