• ベストアンサー

アクセスのテキスト型フィールドサイズ指定方法

アクセス2003を使用しています。 選択クエリAのレコードを追加クエリBを使用してテーブルCに追加しているのですが、 テーブルCのフィールドサイズを「半角40文字、全角20文字」に制限したいです。 フォームを使ってテーブルに入力する場合はテーブルの入力規則に式を入れればできる ということは調べてわかったのですが、追加クエリを利用する場合どのようにしたらよいかわかりません。 お分かりの方、お教えいただければ幸いです。 よろしくお願いいたします。

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

  • ベストアンサー
回答No.4

標準モジュールに下記の関数をコピーして貼り付けてください。 '文字列の右側を指定されたバイト数の個所で切り取る。(左側を残す) '指定された文字列を、ASCIIコードで言うところの1バイト文字と2バイト文字を考慮に入れて '指定されたバイト長を超えず、最後の文字が2バイト文字の1バイト目文字にならないように、 '左側を残して切り取る ' (例) getStrByLenLeft("あいうえお", 4) → "あい" '   getStrByLenLeft("あいうえお", 7) → "あいう" (7バイト目が2バイト文字"え"の1バイト目文字に当たるため) '   getStrByLenLeft("12345あいうえお", 7) → "12345あ" '   getStrByLenLeft("12345あいうえお", 6) → "12345" (6バイト目が2バイト文字"あ"の1バイト目文字に当たるため) Public Function getStrByLenLeft(ByVal strSrc As String, ByVal intLen As Integer) Dim strBuff As String '変換途中の文字列 '指定バイト長に切り取る strBuff = StrConv(strSrc, vbFromUnicode) '指定された文字列を一旦ASCIIコードに変換する strBuff = LeftB(strBuff, intLen) 'ASCIIコードのまま指定されたバイト長に切り取る strBuff = StrConv(strBuff, vbUnicode) '切り取った文字列をUniCodeに戻す '2バイト文字の1バイト目文字チェック '最終文字が2バイト文字の1バイト目文字ならば、その1文字も切り取る If Right(strBuff, 1) <> Mid(strSrc, Len(strBuff), 1) Then strBuff = Left(strBuff, Len(strBuff) - 1) End If '得られた文字列を返す getStrByLenLeft = strBuff End Function 下記からの引用です。 プログラミング・ノウハウ集 ~ Visual Basic 編 (1) http://www.m-hoz.com/know_how/v_01.html

shima-008
質問者

お礼

長期間に渡り何度もお付き合いいただきまして本当にありがとうございます。 上記の関数をモジュールに貼り付けたところ、おかげさまで希望通りの結果が出るようになりました。 本当に助かりました。ありがとうございます。

その他の回答 (3)

回答No.3

> テーブルCのサイズを規定したいフィールドについて、入力規則欄に教えていただいた式を入れて追加クエリBを実行したところ テーブルの入力規則欄に設定するのではなく、 追加クエリのデザインビューで、フィールド欄に設定してください。 追加したフィールドをすべてフィールド欄に表示させて、 桁数を制限したいフィールド欄に前回の式を設定します。 例  F1、F2、F3 とフィールドがあって、F3 を40桁に制限したい場合 フィールド    F1 F2 F3: getStrByLenLeft([テーブル名].[F3], 40) レコードの追加 F1 F2 F3

shima-008
質問者

補足

お礼、回答が大変遅くなり誠に失礼いたしました。 丁寧にお教えいただきありがとうございます。 ご説明いただいたように追加クエリ側で設定して実行したところ "式に未定義関数'getStrByLenLeft'があります。" というアラートが出てしまい処理ができませんでした。 この関数についてもう少し調べてみます。

回答No.2

No.1 ですが、分かっているとは思いますが、10バイトで切り取る式になってます。40バイトのときは、 フィールド名: StrConv(LeftB(StrConv([テーブル名].[フィールド名], 128),40),64) です。 全角の途中で切れてしまって場合の対処をした関数は、 プログラミング・ノウハウ集 ~ Visual Basic 編 (1) http://www.m-hoz.com/know_how/v_01.html のgetStrByLenLeftを使うといいでしょう。 getStrByLenLeft関数をコピーして標準モジュールに貼り付けます。 クエリの式は、 フィールド名: getStrByLenLeft([テーブル名].[フィールド名], 40)

shima-008
質問者

お礼

先ほど4番目のご回答をベストアンサーにさせていただいた後、 あらためて過去のご回答を見直していたのですが >getStrByLenLeft関数をコピーして標準モジュールに貼り付けます。 既にこちらで指示していただいていたのですね。 見落としていました。申し訳ありません。 こちらが出来るまで繰り返しご説明いただいて、本当にありがとうございます。

shima-008
質問者

補足

詳細をご説明いただきありがとうございます。 テーブルCのサイズを規定したいフィールドについて、入力規則欄に教えていただいた式を入れて追加クエリBを実行したところ 「追加クエリですべてのレコードを追加できません。」というアラートが出てしまいました。入力規則違反が発生したため一部のレコードで追加ができないと記載されています。 選択クエリAのレコードで40バイトを超えているものが追加できないようです。 度々で申し訳ございませんが、何か対処方法をご存知でしたらぜひご教示下さい。

回答No.1

フィールドに下記の式で設定して変換するといいでしょう。 フィールド名: StrConv(LeftB(StrConv([テーブル名].[フィールド名], 128),10),64) ただし、全角、半角が混在する場合は、最後の文字が文字化けする場合があります。 これに対処するには自作関数を作成する必要がありますね。

関連するQ&A

  • Accessのフィールドサイズ

    Access2000を使用していますが、テーブル作成時に 「テキスト型」でフィールドサイズを「10」に設定して データを入力すると、半角でも全角でも「10桁」までの入力に なりますが、フィールドサイズは半角も全角も関係ないのでしょうか? 「テキスト型」の最大フィールドサイズは「半角255文字」と 思っていたのですが、全角でも255文字入力できました。

  • accessでテキスト型のフィールドサイズについて…

    accessで作った受注管理のデータを抜き出してクロネコヤマトのi-cats(b2)に入力するように作りました。 b2のデータ交換規約(?)の方のテキスト型のフィールドサイズの指定が 半角英数字10文字 となっていたり、 15文字/30文字 全角/半角 というようになっています。 質問なんですが このフィールドサイズにぴったり合うようにフィールドサイズの設定をするにはどうしたらいいでしょうか? また、半角英数字・半角カタカナ・数字等、特定の文字の種類だけ入力できるようにたりしたいです。 もうひとつ別の質問です VBAで、設定したフィールドサイズよりも大きいテキストを入れようとするとエラーが出るんですが、VBAで後ろを切り捨てたりして入るサイズに縮める方法を教えてください。 長くなりましたが宜しくお願いします。

  • Microsoft Accessのテーブルのテキスト型のフィールドサイズについて

    Microsoft Accessのテーブルを作成する際の、 テキスト型のフィールドサイズですが、全角で考えればいいのか、半角で考えればいいのかが、はっきり分かりません。 Ver.2002では、例えば5バイトの設定で、全角5文字が入力できてしまいます。どのように設計されているか、確かな情報が分からないので、ご存知の方、教えてください。 バージョンによっても、異なるのでしょうか。その辺りも教えてください。 よろしくお願いします。

  • アクセスのテキスト型フィールドの初期値

    アクセスのテーブルにテキスト型フィールド「●●日付」を作成しました。さらに、定型入力の方法として、日付(____/__/__)を指定しています。 このテーブルから、クエリでデータを取得する際、●●日付にデータを入力していないレコードのみを取得したいと思い、クエリの抽出条件として=""(ダブルクォーテーション)や=''(シングルクォーテーション)と記載したのですが、レコードが1件も抽出されません(もちろん●●日付にデータを入れていないレコードは複数あります)。一方で、<>""や<>''で、●●日付にデータが入力されているレコードを抽出しようとした場合は、●●日付にデータが入力されているレコードが抽出されます。 テキスト型フィールドにデータが入力されていないレコードを抽出するクエリはどのようにしたら作成できるのでしょうか?

  • Microsoft Accessでどうしても上手くいきません。

    (1)テーブル作成クエリ クエリA で テーブルB を作ります。 (2)テーブルB にフィールドを一つ追加して、変更を保存 (3)テーブルB のレコードを削除 (4)クエリA を 追加クエリ に変更 で追加クエリAを実行すると、入力規則違反でレコードの追加ができません。 追加するフィールドは、オートナンバー型です。 以前は同様の作業で成功したんですけど・・・ すみません助けてください

  • ACCESS SELECTで始まるフィールド

    ACCESS2003です。 他部署の人が使用していたACCESSの改変を依頼されました。 フォーム部を変更したいとのことだったので、 フォームのフィードリストを確認しながら、参照先に該当するクエリを変更していました。 あるフォームのフィールドリストを確認したら、「SELECT」で始まるフィールドがありました。 しかし、どこを探しても「SELECT」で始まるクエリもテーブルは存在しません。 どこから参照されているのかがわかりません。 プロパティのレコードソースから変更して保存しようとしたら、上書きできずクエリ名を求められてしまいます。 追加を行うには、どこから行えばいいのでしょうか?

  • アクセス フィールド 500個

    アクセスでは、1テーブルでフィールド個数が255までと、制限があるようですが、1レコードに500個のフィールドが必要となりました。2個のテーブルを開いて、500個のフィールドに対して、レコードを単票形式で入力できる様にするには、どうしたらよろしいか?よろしくお願いいたします。

  • Accessでの新規レコードの追加の方法

    Windows XP上でMicrosoft Access 2000を使用しています。 オートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加したいのですが、クエリやそれを基にしたフォームを介した方法はもちろんのこと、テーブルをデータシートビューで表示した状態でも追加することができません。 例えばレコードセレクタからレコード追加を選んでレコード保存を選んでも追加されません。 このテーブルに別のフィールドを追加してデータを入れるとレコードの追加が可能なのですが、オートナンバー型フィールド1つのみではうまくいきません。 どなたかオートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加する方法を御存知でしたら御教示下さいませ。

  • Access 97 2K:テキスト型フィールドサイズ

    お世話になっております。 Access2K、Access97の テーブルのフィールドのサイズを、文字列の5 とし、 固定文字"あいうえお" を入力使用としたところ、 Access2Kでは"あいうえお" Access97では"あい" としか入力できません。 固定文字"aiueo" を入力使用としたところ、 どちらも全て入力できました。 おそらく、バイト長と文字数の違いだと思うのですが、 2Kのヘルプではバイト単位で入力するように 載っているのになぜ指定した長さの全角文字列が 入力できるのでしょうか。 ご教授のほど、よろしくお願いいたします。

  • ハイパーリンク型フィールドからファイルを開く

    ACCESS2007を使用しています。 まず、ハイパーリンク型のフィールドをひとつ持つテーブルAがあります。 そのフィールドには、例えば C:\My Documents\workbook1.xis というリンクが格納されています。 フォームからの条件入力により、テーブルAよりレコードが抽出されるクエリBを作りました。 そのクエリBに含まれる、レコードのハイパーリンク先のファイルを一括で開くVBAを作ろうとしたのですが、まったく方法が思いつきません。 どなたか、ご教授願えないでしょうか?

専門家に質問してみよう