Access:住所に含まれる全角カタカナ、全角英数字を一括で半角変換するVBA
- (2012-05-13 07:00:57)
DAOの発想
Accessで何かしようと思えば、「はて?どこから始めるのか?」と悩むことはない・・・SQLかDAOしかない。
DAOの発想は、人が手作業でやる操作のほとんどがパーツ化されモジュール化されたもの。
これを使えば、手作業をそのまま省いてくれるところが、どういうメリットがあるかわかりやすく、かつ恩恵が感じられる。感謝の気持ちでいっぱいになる。
まずはDAOの宣言から
SQLの場合、クエリでビジュアルなクエリが作成できるならそれをSQL文に変換すればよいがハナから書くとなると厳しい。
DAOはプログラミングの基本的で起源的な構文がよい。今時はADOが主流らしいが、DAOの方がわかりやすい。AccessでVBAとなると、まずはDAOのデフォルトの宣言しかない:
Set DB = CurrentDb
Set RS = DB.OpenRecordset("納品書印刷未ソート", dbOpenDynaset)
レコードの一括変換はEOFまでDo Loopだろ
コンピューターに「一括」という発想はない。レコードを「1件ずつ全部処理」する。これで一括に見える。
If RS.EOF = False Then
RS.MoveFirst
Do Until RS.EOF
RS.Edit
RS![住所1] = StrConv((RS![住所1]), vbNarrow)
RS.Update
RS.MoveNext
Loop
End If
はまりまくる[住所]
やってみると全レコードが、トップのレコードの[住所1]で書き換えられてしまうトラブル。この理由がわからずに1時間もがき苦しんだ。
こうなると一種の中毒症状を呈して、他のことに手が付かなくなる悲しさ。
ふと気づくとStrConvする[住所1]から「RS!」が欠落しているではないか!
RS![住所1] = StrConv([住所1], vbNarrow)
これだけである。
今日はこれを記録したくてこの記事を書いている。
はまりまくるという点では「番地と建物名を分けるVBA」で制作しているこれもすごかった。
For i = 1 To Len(RS![住所1]) - 1
If IsNumeric(Mid(RS![住所1], i, 1)) = Ture And IsNumeric(Mid(RS![住所1], i + 1, 1)) = Flase Then
End If
Next
まるで想定通りにならなくて唖然。サルのようにクルクル・・・「Ture」「Flase」綴りが・・・
Set DB = CurrentDb
Set RS = DB.OpenRecordset("納品書印刷未ソート", dbOpenDynaset)
If RS.EOF = False Then
RS.MoveFirst
Do Until RS.EOF
RS.Edit
RS![住所1] = StrConv((RS![住所1]), vbNarrow)
RS.Update
RS.MoveNext
Loop
End If
RS.Close
Set RS = Nothing
DB.Close
Set DB = Nothing
DoCmd.Requery
<< Access:住所に含まれる番地と建物名を一括で分けるVBA< | >(TEST) >>