• ベストアンサー

Accessでの置換

Access97を使用しています。 置換のマクロ化って出来ますか。 具体的に言うとボタン一つで 「電話番号」のハイフンを消したいのです。 今はテーブルを開いて編集-置換で検索する文字列に 「-」、置換後の文字列に何も入れずにすべて置換しています。 Excelですと「SUBSTITUTE」という関数が一番近いのですが、 Accessでそれに準ずるものってあるのでしょうか? イベントプロシージャでの記述で教えて いただけると一番助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • tomo-yuki
  • ベストアンサー率39% (11/28)
回答No.1

私は以下のような関数を定義して置換をしています。 ---- Public Function Replace(ByVal vSrc As Variant, ByVal strTarget As String, ByVal strNew As String) As Variant Dim strWork As String Dim intCharAt As Integer Dim intStart As Integer intStart = 1 strWork = vbNullString Do intCharAt = InStr(intStart, vSrc, strTarget, vbBinaryCompare) If intCharAt = 0 Then Replace = strWork & Mid$(vSrc, intStart) Exit Function End If strWork = strWork & Mid$(vSrc, intStart, intCharAt - intStart) & strNew intStart = intCharAt + Len(strTarget) Loop End Function ---- 実際の置換はこういうイメージでしょうか。 dim rst as Recordset set rst = CurrentDB.openRecordset("対象のテーブル") Do until rst.EOF rst.Edit rst![電話番号] = Replace(rst![電話番号], "-", "") rst.update rst.moveNext loop rst.close

yuko6
質問者

補足

ありがとうございました!!!! 動きました! ですが、一点・・・。 Null値のとき「Nullの使い方が不正です」と出てしまいます。

その他の回答 (5)

  • tomo-yuki
  • ベストアンサー率39% (11/28)
回答No.6

電話番号フィールドにNullではなく空文字だけ入っているのであれば If rst![電話番号] <> "" Then rst![電話番号] = Replace(rst![電話番号], "-", "") End If で問題ないと思います。 Nullが入る可能性があるのであれば If rst![電話番号] <> "" or Not IsNull(rst![電話番号])Then rst![電話番号] = Replace(rst![電話番号], "-", "") End If としても良いと思います。

yuko6
質問者

お礼

本当に度々ありがとうございました。 色々勉強になりました。

  • tomo-yuki
  • ベストアンサー率39% (11/28)
回答No.5

No.3の補足です。 Null判定はこっちの方が良いかもしれません。 違いはテーブルのフィールドに、空白文字列の格納を許可しているかどうかです。 If IsNull(vSrc) Then Replace = Null Exit Function End If

  • tomo-yuki
  • ベストアンサー率39% (11/28)
回答No.4

No.1で回答したものです。一回で解決できなくてすみません。 置換対象文字列のNull判定を行えば解決すると思います。 Null判定を入れたプロシージャはこのようなものになります。 -------------------- Public Function Replace(ByVal vSrc As Variant, ByVal strTarget As String, ByVal strNew As String) As Variant Dim strWork As String Dim intCharAt As Integer Dim intStart As Integer If IsNull(vSrc) Then Replace = vbNullString Exit Function End If intStart = 1 strWork = vbNullString Do intCharAt = InStr(intStart, vSrc, strTarget, vbBinaryCompare) If intCharAt = 0 Then Replace = strWork & Mid$(vSrc, intStart) Exit Function End If strWork = strWork & Mid$(vSrc, intStart, intCharAt - intStart) & strNew intStart = intCharAt + Len(strTarget) Loop End Function

yuko6
質問者

お礼

ご丁寧にありがとうございます。 独自でやったやり方としては置換の部分を If rst![電話番号] <> "" Then rst![電話番号] = Replace(rst![電話番号], "-", "") End If として、一応動くことは動いたのですが 問題あるでしょうか?

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

#2で回答を入れたものです。レコードの更新は#1の方の解答にある「rst.update」です。私の場合では 「rs.update」です。それと私は-を*に置換しましたが 全く-を削除するなら「””」で上手く行くでしょう。 または”*” &を削除してください。 データベース名も意味ありげで良くなかったと思います。 「取引銀行B」は適当に名前を別につけてください。結果的に#1の方の解答と良く似ています。変数名を長くするか 短くするかで、随分感じは違っていますが。エクセルと使える関数が一致して欲しいです。どうぞよろしく。

yuko6
質問者

お礼

度々すみません。 ちゃんと見ればわかることでしたね。 No.1の方と考え方としては同じってことがわかりました。 どうせ見てもわからないと決めつけていました。すみません。 色々勉強になり、本格的に色々勉強したいなと思いました。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

アクセスで第1列に電話番号を入力して、データベースを作りました。市外・市内・電話番号の区切りは勿論「-」で区切って作ります。 モジュールに下記を作ります。そして実行します。 あえて「レコードを更新して」いないので本番では改良してください。 私の癖でMsgBoxを確認のため入れていますが、不要時には削除してください。数件のデータでテスト確認済み。 Sub test01() Dim p As Integer Dim l As Integer Dim s As String '---- Dim db As Database Dim rs As Recordset Set db = OpenDatabase("取引銀行B") Set rs = db.OpenRecordset("電話番号") '-------- Do While Not rs.EOF l = Len(rs!番号) s = rs!番号 '---- p01: p = InStr(1, s, "-", 1) If p = 0 Then GoTo p02 s = Mid(s, 1, p - 1) & "*" & Mid(s, p + 1, l - p) MsgBox s GoTo p01 '---- p02: ' ここに更新ステップを入れる rs.MoveNext Loop rs.Close Set rs = Nothing db.Close Set db = Nothing '------- End Sub 結局、置換する関数は見つかりませんでした。文字列探索の関数もInstrだけでした。(AC2000VBAハンドブック等調べた) InstrBの方が適当かもしれませんので、考えてください。

yuko6
質問者

お礼

ありがとうございます。 更新ステップを入れるとはどうすればいいのでしょう? VBAは初心者なもので・・すみません。

関連するQ&A