アプリ版:「スタンプのみでお礼する」機能のリリースについて

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$で抽出するには?)

よろしくおねがいいたします。

A 回答 (4件)

>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))
で簡単に抽出出来ます。
    • good
    • 1
この回答へのお礼

大変わかりやすい解説をありがとうございました。

バイト換算ではなく文字数換算というのがポイントなのですね。
本当に助かりました。

お礼日時:2006/01/24 23:10

s_husky です。



勉強不足でした。

Left([フィールド名],(InStr(1,[フィールド名],"G")+1), 1)

でもOKですね!
    • good
    • 0

s_husky です。



補足しておきます。
Access クエリーでは、

SELECT CutStr(Table1!Item,"GG",1) AS LeftData FROM Table1;

という組み込み方をします。
    • good
    • 0

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

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

お礼日時:2006/01/24 23:17

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

このQ&Aを見た人はこんなQ&Aも見ています