• ベストアンサー

Access Left$関数で全角半角が混在したデータの抽出 バイト数がずれる

AccessクエリーでのLeft$関数について教えてください。 半角英数字と漢字文字列が混在したフィールドから Left$関数で17バイト抽出したいのですが、 漢字を一文字=1バイトで換算した結果がかえってしまいます。 例) 1001-500本aaa-GG-りんご ⇒ 1001-500本aaa-GG-り 1002-500mLaaa-GG-みかん ⇒ 1002_500mLaa-GG ※[本]が漢字で[mL]は半角英数です。 後で抽出が自由にできるように、 [GG]以前の文字列のバイト数を固定にしていたのですが 全角・半角が混在していると抽出にずれがでてしまうことを知りませんでした。 ※[4バイト]+"-"+[8バイト]+"-"+[GG]+"-"としていました。 GGを含むGGより以前の文字列を抽出するにはどうすればよいでしょうか? (漢字1文字を2バイトと換算しながらLeft$で抽出するには?) よろしくおねがいいたします。

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

  • ベストアンサー
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.3

>Left$関数で17バイト抽出したいのですが漢字を一文字=1バイトで換算した結果がかえってしまいます Left関数で指定するlengthの数値はバイト換算ではありません。文字数です。そのため漢字1文字を2バイトとはしません。 Access2000以降(?確か)はテキスト型のフィールドはバイトではなく文字数で管理しています。そのため「全角・半角が混在していると抽出にずれがでてしまう」ではなく「文字数管理を知らなかった」という事になります。 そういう事なので 1001-500本aaa-GG-りんご は 1001-500本aaa -GG-りんご と500本aaaの後にスペースでも1つ入れなくてはAccessでは固定とならなかったのです。 >GGを含むGGより以前の文字列を抽出するにはどうすればよいでしょうか クエリで抽出するなら("GG"の前にGが入るレコードはないとすれば) Mid([フィールド名],1,(InStr(1,[フィールド名],"G")+1)) かLeft関数を使用するなら Left([フィールド名],(InStr(1,[フィールド名],"G")+1)) で簡単に抽出出来ます。

nonnon555
質問者

お礼

大変わかりやすい解説をありがとうございました。 バイト換算ではなく文字数換算というのがポイントなのですね。 本当に助かりました。

その他の回答 (3)

noname#22222
noname#22222
回答No.4

s_husky です。 勉強不足でした。 Left([フィールド名],(InStr(1,[フィールド名],"G")+1), 1) でもOKですね!

noname#22222
noname#22222
回答No.2

s_husky です。 補足しておきます。 Access クエリーでは、 SELECT CutStr(Table1!Item,"GG",1) AS LeftData FROM Table1; という組み込み方をします。

noname#22222
noname#22222
回答No.1

Public Function CutStr(ByVal Text As String, _               ByVal Separator As String, _               ByVal N As Integer) As String   Dim strDatas() As String      strDatas = Split("" & Separator & Text, Separator, , 0)   CutStr = strDatas(N * Abs((N <= UBound(strDatas)))) End Function ? CutStr("1002-500mLaaa-GG-みかん", "GG", 1) 1002-500mLaaa- と、上記 CutStr関数を利用すればGGより以前の文字列を抽出できます。 なお、バイト数は、次の関数を利用すると良いでしょう。 Public Function LenH(ByVal Text As String) As Integer   LenH = LenB(StrConv(Text, vbFromUnicode)) End Function

nonnon555
質問者

お礼

色々とご丁寧に解説していただき本当にありがとうございました。 こちらの方法も一度試してみて、スキルアップさせていただきます。 本当にありがとうございました。

関連するQ&A

専門家に質問してみよう