• ベストアンサー

Access_2002 Replace方法

Accessにてシステムを構築しておりますが、テーブルのデータのReplaceについて悩んでおります。 TableA 〔NO〕 〔型番〕 01   多分ABC 02   DEFGとのこと 03   HIだそうです 04   JKL 05   MNO・ この様なTableAの型番から余分な文字を削除する処理を行いたく、現在は更新クエリにてReplace関数を使用し 行っています。 Replace(Replace(Replace(Replace([型番],"多分",""),"とのこと",""),"だそうです゜",""),"・","") ↓ TableA 〔NO〕 〔型番〕 01   ABC 02   DEFG 03   HI 04   JKL 05   MNO この「余分な文字」は現在100以上あり、今後もどんどん増えていきます。 クエリでのReplaceは見にくくメンテナンスもしづらいです。 「余分な文字」をまとめたテーブルでも作成しそれを使ってうまい事出来ないか考えていますが アイデアが浮かびません(;_;)。 皆様のお知恵をお貸しくださいませm(_ _)m

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

> 「余分な文字」をまとめたテーブルでも作成しそれを使ってうまい事出来ないか そのテーブルを作れば、クエリで一発で対応できます。 (こちらの環境で動作確認済み:WinXP Home&Excel2003) 【テーブル】 「TableA」テーブル:  フィールド = No(テキスト型・主キー), 型番(テキスト型) 「削除リスト」テーブル:  フィールド = 削除文字(テキスト型・主キー) 【クエリ】 SQL文:  UPDATE TableA, 削除リスト SET TableA.型番 = Replace([型番],[削除文字],""); 添付画像は、左から   更新クエリ適用前のテーブルのデータ(予め複製)   更新クエリ適用後のテーブルのデータ   上記SQL文をクエリのデザインビューで表示したもの です。 『削除リスト』に登録された文字パターンを複数持っている場合も含めて、問題なく 削除されることを確認しました(→No=06)。 ※2つのテーブル間にフィールドの結合がない選択クエリを作成すると、そのレコードは   双方のテーブル件数の乗算となります(一方のテーブルが5件、他方が6件なら、   選択クエリは5*6=30件を表示)。   これと同じで、上記クエリを実行すると、「○○件のレコードが更新されます」の   確認メッセージでは、テーブルの実レコード数より大きくなりますのでご注意下さい。

その他の回答 (1)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

実行頻度は多くなさそう&クエリでなくてもよさそう ということでVBAにて (標準モジュールに記述します) tableB の削除文字フィールドに削除する文字列が格納されているとします。 tableB の例 削除文字 多分 とのこと だそうです ・ 型番、削除文字は NULL データがないとした上での記述例:ADO使用) Public Function myRep()   Dim rsA As New ADODB.Recordset   Dim rsB As New ADODB.Recordset   Dim sTmp As String   rsA.Open "tableA", CurrentProject.Connection, adOpenForwardOnly, adLockPessimistic   rsB.Open "tableB", CurrentProject.Connection, adOpenKeyset, adLockReadOnly   If (Not rsB.EOF) Then     While (Not rsA.EOF)       sTmp = rsA("型番")       rsB.MoveFirst       While (Not rsB.EOF)         sTmp = Replace(sTmp, rsB("削除文字"), "")         rsB.MoveNext       Wend       rsA("型番") = sTmp       rsA.Update       rsA.MoveNext     Wend   End If   rsA.Close   rsB.Close End Function 削除文字を登録するのは面倒だと思います。 アルファベット A ~ Z だけを残すのであれば、以下例 Public Function myRep2(sQ As Variant) As String   Dim sRet As String   Dim sTmp As String   Dim i As Long      sRet = ""   If (Not IsNull(sQ)) Then     For i = 1 To Len(sQ)       sTmp = Mid(sQ, i, 1)       If (sTmp Like "[A-Z]") Then sRet = sRet & sTmp     Next   End If   myRep2 = sRet End Function 呼び方例 Private Sub Sample1()   MsgBox myRep2("AB漢字CDEありFG-22a2bc") End Sub の結果は、"ABCDEFGabc" となります。 更新クエリで使う時には UPDATE tableA SET tableA.型番 = myRep2([型番]); とか、

picopico_7
質問者

お礼

質問に目をとめてくださり感謝いたします。 大変参考になりました。 ご丁寧にコーディングしてくださり本当にありがとうございました。

関連するQ&A