• ベストアンサー

アクセスのレコードデータ一部置換 Part 2

以前http://okwave.jp/qa/q7757612.htmlで質問した内容の続きなのですが、tsubuyukiの回答で目的を達成することができましたが、式の意味を教えてはいただけませんか。Mid以降がわかりません。どこでOを0に置換しているのでしょうか。 IIf(InStr(1,[フィールド],"O")=0,[フィールド],Mid([フィールド],1,InStr(1,[フィールド],"O")-1) & "0" & Mid([フィールド],InStr(1,[フィールド],"O")+1,99));

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

IIf(InStr(1,[フィールド],"O")=0,[フィールド],Mid([フィールド],1,InStr(1,[フィールド],"O")-1) & "0" & Mid([フィールド],InStr(1,[フィールド],"O")+1,99)) を 12345 の 3 を 0 に書き換える 例にとって説明します。 [フィールド] には、12345 が入り、置換対象文字は 3、置換文字は 0、なので実際には IIf(InStr(1,"12345","3")=0,"12345",Mid("12345",1,InStr(1,"12345","3")-1) & "0" & Mid("12345",InStr(1,"12345","3")+1,99)) となります。 使われている関数は、IIF と Mid と Instr の三つの至ってシンプルです。 詳しくは関数のヘルプを見てもらえばよく分かります。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IIF は 『条件文、成立した場合の処理、しなかった場合の処理』です。 条件文 = InStr(1,"12345","3")=0 成立時 = "12345" 不成立時 = Mid("12345",1,InStr(1,"12345","3")-1) & "0" & Mid("12345",InStr(1,"12345","3")+1,99) です。 Instr 関数は探す文字が無かったら ゼロ を、あればその文字位置を返します。 なので、 条件分 = InStr(1,"12345","3")=0 → 『3』 が見つからなかったら・・です。 例題では見つかって、3が返るので不成立の所に行きます。 もし見つからない場合は、[フィールド]の値そのもの→12345 をそっくり返します。 さて、 不成立(見つかった場合)の時の処理に、回答者さんはMid関数とInstr関数で処理しています。 ねらいは 『3』の文字位置を探し出して、『3』よりも前の文字列と 『0』 と 『3よりも後の文字列』を 繋げれば・・・と考えています。 InStr(1,"12345","3") は3番目に『3』があると教えてくれます。 そこで、 1・2文字目と 『0』 と4・5文字目を繋げます。 Mid関数は、『対象文字列、開始位置、抜き出す長さ』です Mid("12345",1,InStr(1,"12345","3")-1) & "0" & Mid("12345",InStr(1,"12345","3")+1,99) はInstr関数により3が返ってきますから Mid("12345",1,3 - 1) & "0" & Mid("12345",3 + 1,99) となります。 3 - 1 と 3 + 1 は、よりも前、よりも後 の目的のためです。 で、 Mid("12345",1,3 - 1) は 12345 の先頭文字から2文字取って、12 です。 Mid("12345",3 + 1,99) は、12345 の4文字目から取り始めます。 ここで、99 を抜き出す長さに指定していますが、 『3よりも後の文字列』全部が必要なので、苦し紛れに 99 にしちゃったのだろうと思います。 Mid("12345",3 + 1) のように長さの指定をしなければ、最後まで取ってきてくれます。 これで目出度く、12 と 0 と 45 が繋がりました。 でも前回の質問の場合だと Replace関数を使い Replace([フィールド名],"対象文字","置換文字") → Replace([フィールド名],"3","0") が一般的だと思います。 12345345 のように複数回 3 が出現する場合でも有効です。 全部変えてしまいます。 最初の3 は変えたいけど 後の3 は変えたくない・・などの場合もありますので 回答者さんの方法も覚えといてください。 ◆宿題◆ 12345345 の後ろの3だけ0にしたい場合は、どうしたら良いですか? 回答はしません。考えてみてください。 私からは以上です。

ticktak
質問者

お礼

丁寧な回答ありがとうございました。 宿題ですが、簡単そうで難しくまだ答えが出ていません。 もう少し頑張ってみます。

関連するQ&A