Access2000での文字置換方法

このQ&Aのポイント
  • Access2000を使用して、大文字で入力された特定のカタカナを通常表記のカタカナに置き換える方法について教えてください。
  • 現在、大量の置き換えパターンを含むコードを使用していますが、よりスマートな方法があれば知りたいです。
  • また、処理前と処理後のカタカナはすべて半角で表記されています。
回答を見る
  • ベストアンサー

Access2000での文字置換

例えば「ホツトコーヒー」→「ホットコーヒー」や「リヨクチヤ」→「リョクチャ」のように大文字で入力されているツ、ヨ、ヤ、アを通常表記通りのッ、ョ、ャ、ァに置き換えたい場合、何かいい方法はあるでしょうか? 以前の書き込み等を参考にしながら、 Public Function okikae() Dim rst As DAO.recordset Set rst = CurrentDb.OpenRecordset("SHOHIN") Do Until rst.EOF rst.Edit rst![KANA] = Replace(rst![KANA], "ホツト", "ホット") rst![KANA] = Replace(rst![KANA], "リヨクチヤ", "リョクチャ") rst.Update rst.MoveNext Loop rst.Close MsgBox "終了" End Function というコードを作成し、正常に動作したのですが、これだと「rst![KANA] = Replace(rst![KANA], "○○", "××")」の○○と××に入れるべきパターンがありすぎて、長くなってしまいます。 かと言って、ここを一文字にしてしまうと、置き換えてはいけない文字まで置き換わってしまいますよね。 地道に「rst![KANA] = Replace(rst![KANA], "○○", "××")」を書くしかないでしょうか?フィールドも「KANA」1つではなく複数あるのですが・・・。 何とかもう少しスマートにならないでしょうか? お願いします。 (ちなみに、置き換えるカタカナは処理前も処理後もすべて半角です)

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

  • ベストアンサー
noname#5584
noname#5584
回答No.1

必要な処理をユーザー定義関数にすれば、多少は簡潔になります。 具体的には、 (1) 必要なだけReplace関数を実行し、複数回置換する。 (2) 文字列の始端~終端まで1文字ずつ文字コードを読み、指定条件にマッチする場合のみ置換する。 処理速度は、数文字~数10文字程度の文字列なら、(2)の方が速く、サイズの大きい文字列では、(1)の方が速くなります。 また、Accessでは、JetのSQLにVBA関数 ( システム定義/ユーザー定義 ) を埋め込んで実行することが可能で ( 詳細な説明は長くなるので割愛しますが、まあ乱暴に言ってしまえば、ストアドファンクションと同じようなものと理解してください ) 、Recordsetをループして処理するより、ExecuteメソッドでUPDATE文を実行した方が高速に処理できます。 この速度の差は、レコードが数10~数100件程度のオーダーなら無視できるレベルですが、数万~数10万件以上のオーダーになると、大差が出ます。 以上、ご参考まで・・・。

ghepardo25
質問者

お礼

早々のご回答ありがとうございました。 使わざるを得ないので使ってますが、Accessは奥が深すぎです。 また困ったことがあればよろしくお願いします。

ghepardo25
質問者

補足

早々の回答ありがとうございます。 >Recordsetをループして処理するより、ExecuteメソッドでUPDATE文を実行した方が高速に処理できます とはどういうコードになるのでしょうか? すみません、VBAは初心者なもので・・・。 例えば、置換のデータを別テーブルで持っておいて、それを参照しながら目的のテーブルのフィールドを置き換えるなんてことはできるのでしょうか?

関連するQ&A

  • テーブルのリンク(ACCESS)

    ACCESS2003で下記の記述で「実行時エラー ’3219’ 無効な処理です。」というエラーメッセージがでます。 外部mdbでテーブルをリンクさせるとこのエラーがでます。同じmdbファイルにデータテーブルを置くと問題なく処理できます。 参照設定も過去ログを見てチェックしています。 Dim dbs As DAO.Database Dim rst As DAO.Recordset Set dbs = CurrentDb Set rst = dbs.OpenRecordset("テーブル名", dbOpenTable) ACCESS97では何の問題もなかったのですが, 2003ではうまくいきません。 どうかよろしくお願いします。

  • VBA REPLACE関数 文字列の置換

    ACCESS VBA REPLACE関数についての質問です。 FAQテーブル(answer列) HENKANテーブル(moji列,tag列)を用意。__すべてメモ型 HENKANテーブルのmoji列の値が、FAQテーブルのanswer列の値にある場合に、HENKANテーブルのtag列の値と入れ替える というコードを現在かいております。 例) Private Sub a_Click() Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Set rs1 = CurrentDb.OpenRecordset("SELECT ANSWER FROM FAQ", dbOpenDynaset) Set rs2 = CurrentDb.OpenRecordset("SELECT moji,tag FROM HENKAN", dbOpenDynaset) Do Until rs2.EOF Do Until rs1.EOF rs1.Edit rs1!ANSWER = Replace(rs1!ANSWER, "rs2moji","rs2!tag") rs1.Update rs1.MoveNext Loop rs1.MoveFirst rs2.MoveNext Loop rs1.Close Set rs1 = Nothing rs2.Close Set rs2 = Nothing End Sub 上記コードを一先ずテスト用に作成したのですが、うまく置換されません。 REPLACE関数部分の表記をどのようにしたらよろしいでしょうか? ご面倒おかけしますが、ご教示お願いいたします。

  • OpenRecordSet  他について

    Accessプロジェクトを使用しています。 Dim strSQL As String Dim DBS As Database Dim RST As DAO.Recordset Set DBS = CurrentDb Set RST = DBS.OpenRecordset("TESTDATA", dbOpenDynaset,dbReadOnly) 「実行時エラー'91': オブジェクト変数またはWithブロック変数が設定されていません。」 と出てきます。デバッグを押すと、 上記最終行でSTOPします。 次のように変更しても同じでした。 Set RST = DBS.OpenRecordset("TESTDATA") 又は Set RST = DBS.OpenRecordset("TESTDATA", dbOpenDynaset) ヘルプ等を見ると、Jetワークスペースでのみ 使用可と出てきます。 ADO,DAO,OpenRecordset等が理解しきれていないように思うのですが、 Access97(DAO?)では 何も出てこなかった上記のような内容、 何故Accessプロジェクトでは 上手くいかないのでしょうか?

  • ACCESS 処理件数の取得

    更新した件数を取ろうとしています。 下記のような処理をしている場合どう値をとればいいのでしょうか? rst.RecodCountでとろうとしたらテーブル内の件数(?)が取れてしまったようなのですが・・・ Dim rst As DAO.Recordset rst.Fields(1) = rstWork.Fields(1) rst.Update

  • アクセス2000VBA DAOをADOに書き換えてください

    アクセス2000VBA DAOをADOに書き換えてください 下記プログラムをADOに書き換えてください。(DAT1、DAT2はモジュールにて定義してあります) Option Compare Database Dim DBS As Database Dim QDF As QueryDef Dim RST As DAO.Recordset Dim COUNT1 Private Sub Form_Load() On Error Resume Next DAT2 = [Forms]![伝票]![HAKKOU1] Set DBS = CurrentDb Set QDF = DBS.QueryDefs("発行") With QDF .Parameters("DAT1") = DAT2 ’もしかしたら DAT2 ではエラーがでるかもしれません。 Set RST = .OpenRecordset() ’正しい記述を教えてください .Close End With With RST COUNT1 = !指示書 .Close End With

  • VBA ACCESS ファイル出力時に更新内容を保存しないで出力したい

    VBA ACCESSの質問です はじめまして 最近になりVBAをはじめたものです。 下記の点について調べてもわからないことがあり非常に困っております。 フォーム上にファイル出力をするコマンドボタンがあります。 これをクリックすると拡張子がdatのファイルで出力されるのですが、 【テーブルの値を一部変更した際に、  更新内容を保存しないでファイル出力をする】 という処理のコードはどのようにすればよろしいでしょうか? ↓↓例えば↓↓ Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset("SELECT 列名 FROM テーブル名)", dbOpenDynaset Do Until rs.EOF rs.Edit rs!列名 = Replace(rs!列名, "変換したい文字", "変換する文字") rs.Update Loop rs.MoveNext rs.Close Set rs = Nothing 上記コードの6行目を rs.update にしてしまうと当然ながらテーブルが更新されてしまいます。 どのようにすれば、テーブルの更新内容を保存しないでファイル出力ができるのでしょうか おわかりになる方がいらっしゃいましたら、ぜひ教えてください! よろしくお願いいたします

  • accessからsqlserverにアップサイジングしましたが,テーブ

    accessからsqlserverにアップサイジングしましたが,テーブルにデータを入力出来なくなってしまいました。 Dim rs As DAO.Recordset Dim db As DAO.Database Set db = CurrentDb() Set rs = db.OpenRecordset("確認用", dbOpenDynaset) rs.AddNew rs!品番 = Me.品番 rs.Update 上記のようにDAOを介してテーブルにデータを入れていました。 アップサイジングする前は、問題なかったのですが、どういったことが原因になりますでしょうか?

  • 空欄を含む項目のレコードセット

    Access 2003 DAO.Recordsetにてデータを取得しようと思うのですが テーブル項目に空欄がある場合はどのように書けばよろしいのでしょうか? Dim DB As DAO.Database Dim RS As DAO.Recordset Set DB = CurrentDb Set RS = daoDB.OpenRecordset("Aテーブル", dbOpenDynaset) RS.AddNew daoRS!ああ ああ = xx RS!Update ・・・ とするとエラーになります。 項目名"ああ ああ"はどのように書けばいいのでしょうか? よろしくおねがいします。

  • Access VBA 添付型フィールド

    Access VBAで添付型フィールドからファイル名を取りだしたいのですが、どのようにすればいいでしょうか? Private Sub Sample() Dim DB As DAO.Database Dim RS As DAO.Recordset Dim SQL As String   Set DB = CurrentDb SQL_1 = "SELECT * FROM ボランティア情報 ORDER BY 分野 & 団体名読み;" Set RS = DB.OpenRecordset(SQL_1, dbOpenDynaset) With RS   Do While Not .EOF   MsgBox (!写真.FileName)  ←ここでエラーが出ます。 .   MoveNext   Loop End With RS.Close Set RS = Nothing Set MDB = Nothing End Sub

  • accessからexcelへ出力時。。。

    3つのクエリを一つのエクセルシートへ出力しようとしているのですが、 3つ目が張り付きません。なんでなんでしょうか?どなたか教えてください。 Dim dbs As Database Dim rst1 As Recordset Dim rst2 As Recordset Dim rst3 As Recordset Dim intRow As Integer Dim intCell As Integer Dim xlsx As Object Set dbs = CurrentDb Set rst1 = dbs.OpenRecordset("クエリA") Set rst2 = dbs.OpenRecordset("クエリB") Set rst3 = dbs.OpenRecordset("クエリC") Set xlsx = CreateObject("Excel.Application") 'Excelオブジェクトを生成 With xlsx .ScreenUpdating = False '画面の再描画を抑止 .Workbooks.Add '新しいブックを追加 '---"クエリA"---------------------------------------------------- intRow = 1 For intCell = 1 To rst1.Fields.Count .Cells(intRow, intCell).Value = rst1.Fields(intCell - 1).Name .Cells(intRow, intCell).Interior.ColorIndex = 15 Next intCell '各レコード出力 intRow = 2 Do Until rst1.EOF For intCell = 1 To rst1.Fields.Count .Cells(intRow, intCell).Value = rst1.Fields(intCell - 1) Next intCell intRow = intRow + 1 rst1.MoveNext Loop '集計Sum For intCell = 4 To rst1.Fields.Count .Cells(intRow + 1, intCell) = "=SUM(" & Cells(2, intCell).Address & ":" & Cells(intRow, intCell).Address & ")" Next intCell ・ ・2目のクエリはOK ・ ・ ’以下3つ目のクエリ Dim intRow3 As Integer Dim intCell3 As Integer intRow3 = intRow + 5 intCell3 = 5 For intCell3 = 5 To rst3.Fields.Count .Cells(intRow3, intCell3).Value = rst3.Fields(intCell3 - 1).Name .Cells(intRow3, intCell3).Interior.ColorIndex = 15 Next intCell3 '各レコード出力 intRow3 = intRow + 6 Do Until rst3.EOF For intCell3 = 5 To rst3.Fields.Count .Cells(intRow3, intCell3).Value = rst3.Fields(intCell3 - 1) Next intCell3 intRow3 = intRow3 + 1 rst3.MoveNext Loop '---- Dim rst3RC As Integer rst3RC = intRow + 5 + rst3.RecordCount '863 '集計Sum For intCell3 = 6 To rst3.Fields.Count - 1 .Cells(rst3RC, intCell3) = "=SUM(" & Cells(rst3RC - rst3.RecordCount, intCell3).Address & ":" & Cells(rst3RC - 1, intCell3).Address & ")" Next intCell3

専門家に質問してみよう