• ベストアンサー

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

  • EXCEL 「ASC」関数  英数字の全角を半角に変換するよい方法があれば教えてください

    EXCELで入力しているデータをフィルターを使用して検索できる データベースにしたいのですが、以前からの入力しているデータの英数字が全角、半角が混在していてます。 フィルター検索の際に全角で入力すると半角入力のものがヒットしないので不便で、英数字の半角統一にしたいと考えています。 ASC関数を使用して英数字の全角→半角を行なうこと考えたのですが ASC関数ですとカタカタも半角カタカナに変換されるので 英数字だけを全角→半角にする関数や方法などあれば教えてください。 入力データは 漢字、ひらがな、カタカナ、英数字が混在しています。 希望 全角→漢字、ひらがな、カタカナ 半角→英数字 宜しくお願い致します。

  • 全角、半角、改行コードが混在文を指定文字数でカットしたい。

    こんにちは。 現在、phpで簡単な動的ページを作成しています。 行き詰っていますのは、文字列抽出?です。 ある文字列を先頭文字から300文字だけ切り出して以降はカットしてしまいたいのです。 但しその文字列が全角、半角、改行コード(EUC)が混在していまして、うまく切り出せません。 混在文字列からも文字列指定で切り出す関数や手段をご存知の方はいらっしゃいませんか? お手数では御座いますが、お教え下さい。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 全角半角を調べるライブラリ関数はありますか?

    文字列検索プログラムを作成しています。 ライブラリ関数の"strcmp"を利用せず、 ==演算子で文字同士を照合しています。 問題がありまして、 検索文字列に一文字指定し検索しますと、 漢字にヒットしてしまいます。 例) 大文字(半角)   I ヒットした文字  "終"の2バイト目 この状態を改善したいのですが何かよい方法を教えてください。宜しくお願いします。

  • クエリーで、全角混じりデータの抽出[access95]

    半角で入力すべきフィールドの中に全角文字が混在している時に、 この全角文字が混在しているデータを、クエリーで抽出する方法を 教えてください。 データ型はテキストで、フィールド長は50です。 また入力されているデータは、任意<50文字とないっています。

  • 全角半角混在の文字列から○文字まで取得する方法

    はじめまして! MySQLから取得した文字列をPHPで例えば10文字まで表示したいのですが、良いやり方ありますでしょうか? 文字列には全角半角が混在しているので substr関数だと、うまく取得できない場合があります。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 全角、半角のデータの抽出方法

    あるシステムからデータを受け取る際に氏名の領域が16バイト取ってあるのですがこの領域だけ抽出しようとしたらうまくいきません。 漢字が4バイトでスペースが2バイトの為MID関数を使うと名前の字数で抽出される領域が16バイトとることが出来ないのでうまく16バイト取る方法ご存知の方お教えください。お願いします。

  • 全角・半角混在の文字列から半角文字のみ取り出す

    エクセル勉強中です。問題集で理解できないところがあります。 数式がどういう意味をもつのか教えて頂けるとありがたいです。 よろしくお願いします。 画像添付の問題になります。 A列に製品名が入っています。(製品番号:半角文字)(製品名:全角文字) B列に半角文字の製品番号だけを取り出しなさいというものです。 半角文字の開始位置がバラバラになっているところが問題のポイントになっています。 回答ですが B2: =MID(A2,MATCH(1,INDEX(LENB(MID(A2,COLUMN(2:2),1))*1,0),),LEN(A2)*2-LENB(A2)) こちらで半角文字のみ取り出せるようです。回答には数式のみで何故この関数を使うのか? 使うことでどういった結果を導くなどの解説が一切ありません。(ちなみに出版会社の便利技的な問題集です) MID関数で製品名A2から開始位置を指定して、全角半角をLEN関数LENB関数で半角文字数を 算出して文字列を抽出するという事は理解できます。 ただ、この開始位置の指定の所が理解できません。 数式を分割してみましたが =MID(A2,COLUMN(2:2),1)の所はどの行も製品名の1文字目ですよね・・・ その値にLENB関数で文字数? 数式の検証で見てみると配列のような結果が次々と現れて・・・ MATCH関数もありますしINDEX関数が何か関係しているような気はしているのですが、 INDEX関数と言えば配列に行番号・列番号と例えば表の該当するセルの位置抽出の 知識しかありません。一つのセルでINDEX関数? すいません。独学で勉強していてこの程度の知識ですが、この数式の考え方教えてくださる方よろしくお願いします。

  • ACCESSで全角と半角を変換する

    いつもお世話になっております 早速ですが、 ACCESS2000(OSはWindowsXP)での質問です 住所録を整理しているのですが、 住所欄に全角と半角の入力が混在しています 英数字及びハイフンは半角に カタカナは全角に変換したいのですが、 いい方法はないでしょうか? ちなみにStrconv関数をつかって 何とかしようと思ったのですが、 すべて変換されるので、どうもうまくいきません よろしくお願いします

  • Access2000のクエリで全角文字を半角にするには?

    もともとのデータが全角英数字になっているフィールドを半角に変換したいのですが、クエリー実行時に変換できますでしょうか? 文字列関数のASCかな?とも思い、やってみたのですが、うまくいかず、とりあえず元のテーブルのデータを編集を置換でもって半角にしました。 でも、出来ればテーブルのデータは変更したくないので、クエリーでやる方法はありませんでしょうか? あまり専門的なことは分かりません。VBAは使ったことがありませんのでよろしくお願いします。

  • Excelで全角数字と半角数字の混在について

     Excelについて、以下のように全角数字と半角数字が混在しているワークシートがあるので、全部を半角数字に置き換えることは出来ないでしょうか? EZ123 123 486 このように文字列としての数字・数値としての数字が混在しています。これらを全て半角数字にしたいのですが。あくまでも、見栄えの問題ですので、特に、計算等の必要はありません。  よろしくお願いします。

専門家に質問してみよう