dポイントプレゼントキャンペーン実施中!

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

イベントプロシージャでの記述で教えて
いただけると一番助かります。

A 回答 (6件)

私は以下のような関数を定義して置換をしています。



----
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

この回答への補足

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

補足日時:2002/07/04 15:20
    • good
    • 0

電話番号フィールドにNullではなく空文字だけ入っているのであれば



If rst![電話番号] <> "" Then
rst![電話番号] = Replace(rst![電話番号], "-", "")
End If

で問題ないと思います。
Nullが入る可能性があるのであれば

If rst![電話番号] <> "" or Not IsNull(rst![電話番号])Then
rst![電話番号] = Replace(rst![電話番号], "-", "")
End If

としても良いと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/07/07 23:04

No.3の補足です。


Null判定はこっちの方が良いかもしれません。
違いはテーブルのフィールドに、空白文字列の格納を許可しているかどうかです。

If IsNull(vSrc) Then
Replace = Null
Exit Function
End If
    • good
    • 0

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/07/05 19:58

#2で回答を入れたものです。

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

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

お礼日時:2002/07/05 19:51

アクセスで第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の方が適当かもしれませんので、考えてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/07/04 17:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!