Accessの文字変数についての質問

このQ&Aのポイント
  • Access2010でstring変数に文字を代入する方法と文字数の制限について教えてください。
  • データベースの購入者一覧フィールドの表示文字数が最大で255文字までと制限されていますが、実際には500文字まで必要です。この制限を回避する方法を教えてください。
  • 購入者一覧フィールドに表示される文字数の制限を回避する方法を教えてください。
回答を見る
  • ベストアンサー

Accessにおける文字を代入する変数について

 いつもお世話になっております。  Access2010を使用しています。  string変数に文字を代入できる、文字数についてご教示をお願いします。  下記のようなデータがあるとします。 【T_購入】 番号  チケット購入者  実購入者  実購入者番号 1   あああ      あああ   1 2   いいい      あああ   1 3   ううう      あああ   1 4   えええ      えええ   4 5   おおお      えええ   4 6   かかか      かかか   6 7   ききき      かかか   6 8   くくく      かかか   6 9   けけけ      けけけ   9 【Q_購入者一覧】 番号  実購入者  購入者一覧 1   あああ   あああ、いいい、ううう 4   えええ   えええ、おおお 6   かかか   かかか、ききき、くくく 9   けけけ   けけけ  購入者一覧フィールドに自動でチケット購入者が表示されるよう、下記のモジュールを入れています。  ※このモジュールもこのサイトで教えていただきました。ありがとうございました。 Public Function MyJoin_zentai(Buyer As Long) As String On Error GoTo ErrorHandler ' 定数/変数宣言部 Dim rs As DAO.Recordset Dim strSQL As String Dim strResult As String strSQL = "Select チケット購入者 From T_購入 " & _ "Where 実購入者番号=" & Buyer Set rs = CurrentDb.OpenRecordset(strSQL, _ dbOpenForwardOnly, _ dbReadOnly) ' メインループ Do Until rs.EOF ' 連結する文字列を取得し、追加します。 strResult = strResult & "、" & rs(0).Value rs.MoveNext Loop strResult = Mid(strResult, 2) ExitProcedure: On Error Resume Next rs.Close: Set rs = Nothing MyJoin_zentai = strResult ' 戻り値をセットします。 Exit Function ErrorHandler: ' クエリー内での使用を考慮して、エラーのダイアログ表示は ' 行なわず、エラーをそのまま戻り値に入れます。 strResult = Err & ":" & Err.Description Resume ExitProcedure End Function  ここで問題となったのが、購入者一覧フィールドに表示される文字数が255文字までとなることです。  実際使用しているデータでは、購入者一覧に表示される文字数が最大で500文字になる場合があり、途中で切れてしまいます。  この255文字制限を回避できる方法をご教示お願いします。

  • ankle
  • お礼率43% (80/182)

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1616/2455)
回答No.7

もしかして クエリ内のFirstが関係しているのかもと思ったのですが SQL FIRST関数 LAST関数は不安定 https://www.feedsoft.net/access/sql/sql54.html たとえば、以下のようにしてクエリで 式: MyJoin_zentai(5) として出したら800文字分のデータが出たりしませんか。 Public Function MyJoin_zentai(Buyer As Long) As String Dim strResult As String strResult = 800文字分のデータ MyJoin_zentai = strResult ' 戻り値をセットします。 End Function 出たら元のSQLの FirstをLASTにしてみるとかでしょか。

ankle
質問者

お礼

 kkkkkmさん、いつもお世話になっております。  クエリで「First(MyJoin_zentai([実購入者番号]))」のFirstを削除して「MyJoin_zentai([実購入者番号])」で実行したら、見事全部表示になりました。  大変助かりました。ありがとうございました。  kkkkkmさん、今後ともよろしくお願いいたします。

その他の回答 (6)

  • kkkkkm
  • ベストアンサー率65% (1616/2455)
回答No.6

> 購入者一覧フィールドに表示される文字数が255文字まで フィールド数は255だったと思いますが、フィールドに表示できる文字数は255なのでしょうか。255までしか表示できないとしたら、メモ型(確か2010ではメモ型だったと思います)だと255文字以上格納できるので、それをもとにしたクエリで内容が表示できないという事になってしまいます。 String変数も255文字以上格納できると思いますから strResult = "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああい" でエラーにならなければ 、何か別の所で制限を受けているのではないでしょうか。

ankle
質問者

補足

 kkkkkmさん、いつもお世話になっております。  モジュールのイミディエイトウィンドウで確認してみると、「strResult」には表示したい約800文字が全部代入になっています。  ただ、これをクエリで表示すると、255文字までとなってしまうのが現状です。

  • chayamati
  • ベストアンサー率41% (254/607)
回答No.5

締め切る積りでしたが解答を追加させて頂きます。 >今回お聞きしたかったのは、上記モジュールの「MyJoin_zentai」を  クエリで利用した際、表示になる文字数が255文字までとなってしまいます。 ◎そうですね、クエリのまま開くと開くと画面の幅を超えると  一部が隠れてしまいますね  このクエリをレコードソースとして、メモ型のフィールドを  フォームフッターに配置すると添付のようになります  1.添付図の下方の「薬の働き」と「注意事項・副作用」を   フォームフッタ配置  2.上段の複数のレコードの左端のレコードセレクタにマークがあり   フォームフッタのフィールドと連動します システムのデザインはExcelよりも数段簡単ですので Accessを見直して頂きたく思います お付き合いありがとうございました。

  • chayamati
  • ベストアンサー率41% (254/607)
回答No.4

>さて、なかなか難しいことがわかりました。  企業で「社員の家族名簿」を設計します 1.M社員  ・社員№(主キー)  ・社員名  ・生年月日  ・性別  ・入社年月日 2.S家族  ・ID(主キー)  ・家族名  ・生年月日  ・性別  ・社員№  ・続柄 Accessではこれでテーブルの設計は完了ですが Excelで作成は出来ますか、たぶん家族人数を5名以内等色々制約が必要になります >モジュール一つで256文字以上を表示するのは無理があるということですね。  これはどう云う事かと気になっています  テーブルのフィールドのデータ型に  「短いテキスト」と「長いテキスト」があります  ・短いテキスト 255文字以内の文字列  ・長いテキスト 文字数に制限がありません   このフィールドはフォーム上ではEnterキー押下で改行され    メモ帳のように際限なく入力可能です このご質問への回答はここまでとさせていただきます

ankle
質問者

お礼

 chayamatiさん、最後にまた教えていただきまして、誠にありがとうございます。  さて、テーブルでフィールドの型式をメモ型にした場合、多くの文字を入力できるのは私も理解しています。  今回お聞きしたかったのは、上記モジュールの「MyJoin_zentai」をクエリで利用した際、表示になる文字数が255文字までとなってしまいます。このため、このモジュールを生かして256文字以降も表示できるようにできないか、という趣旨でした。  chayamatiさん、今回も大変お世話になりました。今後ともよろしくお願いいたします。  

  • chayamati
  • ベストアンサー率41% (254/607)
回答No.3

>さて、モジュール一つで256文字以上を表示するのは無理がある ◎このような制限はありません  一つのテーブルだけのシステムではExcelのままの方が益しで  Accessに変えるメリットはありませんので  Accessの特徴を活用したシステムに組み替えてはという提案です。  回答をこのまま続けるにはAccessのマニュアル一式になります。  ご質問の趣旨から大きくかけ離れてしまうので、  新規のご質問を立ち上げていただきたく思います。 Excelと違って、Accessはテーブル、クエリ、フォーム、レポート、 モジュールと機能別に5つのグループに分割されています。 ・テーブル:情報を記録するAccessの基本部分 ・顧客テーブルと見積テーブルのように  テーブル間に関連付けを定義。  これをリレーションシップと呼び、リレーションで関連付ける  ため、2つのテーブルにそれぞれに  リンクフィールドを配置。  この2つのフィールドのデータ型が同じで、  どちらかに「重複なし」に定義。  この「重複なし」に定義したフィールドのあるテーブルを  主テーブル、他方をサブテーブル呼ぶ事がある。 ・これでサブテーブルのレコードが確定するとリレーションを辿って  主テーブルのレコードが特定できて、主テーブルの全ての  フィールドを参照出来る 添付の大枠はデータ型が短いテキストのフィールドのプロパティー  (データ型が数値、日付は別のプロパティーが表示されます) ・フィールドサイズ:255文字迄、長いときは長いテキスト型 ・書式 ・定型入力:郵便番号、電話番号、チケット№もここで定義 ・標題:見出し項目をフィールド名と別の文字列とする事が出来る ・規定値:数値型のとき必ず0 ・入力規則:1-6,7-12 ・値要求:はい いいえ ・インデックス:いいえ、重複なし、重複あり ・IME入力モード ・IME変換モード ・ふりがな:利用者名を入力したとき自動的に取り込む ・住所入力支援:郵便番号と住所の双方向的に自動変換  リレーションシップで関連付けられたフィールドには  ルックアップからコンボボックスが作成  【サブテーブルのリレーションフィールド】  →【ルックアップタグ】  ここで右下の小枠が表示され、表示コントロールが  テキストボックス  →【表示コントロール】→【コンボボックス】→【値集合ソース】  →【実購入者】→【連結列】→【M実購入者の主キーのID位置=1】  →【列数=2 実購入者のIDと実購入者名】  →【列幅=0 IDは表示しない】→【リスト行数=任意】  ここで値集合ソースの右端の…クリックでクエリビルダーが起動し  並び替え、参照データの選択ができる

ankle
質問者

お礼

chayamatiさん、ご回答ありがとうございます。 Accessの機能を詳しくお教えいただき、重ねてありがとうございます。 さて、なかなか難しいことがわかりました。 chayamatiさんに、あまりご苦労をおかけしたくありませんので、この質問はこれで終了させていただきます。 今後ともどうぞよろしくお願いします。 ありがとうございました。

  • chayamati
  • ベストアンサー率41% (254/607)
回答No.2

3 このシステムのテーブルはこれだけですか。  → はい、これだけです。 ----------------------------------------------------------------------------- Excelの仕組みをそのままAccessに置き換えたらとお考えですね 少し無理があります。 Excelでは情報のすべてを1枚のSheetに記述しますね Accessは役割毎に[M:マスタテーブル、S:サブテーブル、T:トランザクションテーブル]と分割します またテーブル間の関連付けのリレーションシップが有用です 一例として添付のような構成を考えてみました M実購入者、S利用者、T売上履歴、M催事 ここではそれぞれのテーブルがリレーションシップ(関連付け)で結ばれています。 これ等のテーブルはクエリで一つテーブルのスタイルにまとめることが出来る為 テーブルの情報を個別に登録しクエリで纏めてテーブルスタイルにします この後 1.テーブルデザイン→ルックアップ 2.リレーションシップ 3.クエリ 4.フォームデザイン→サブフォーム と進みたいのですが興味をお持ちでしたら、 項目ごとに新規の質問お願いします 先へ進んでいいですか

ankle
質問者

補足

 chayamatiさん、いつもお世話さまです。また、いろいろとお考えいただきまして、誠にありがとうございます。  さて、モジュール一つで256文字以上を表示するのは無理があるということですね。勉強になります。256文字以上表示できた方が仕事がはかどりますので、先へ進めていただければ幸いです。  どうぞよろしくお願いいたします。

  • chayamati
  • ベストアンサー率41% (254/607)
回答No.1

補足願います 1.チケット購入者と実購入者はどのような関係ですか   代理人の事ですか 2.購入者番号は主キーですか 3.このシステムのテーブルはこれだけですか  私はチケットテーブル、購入者テーブル、購入履歴テーブルの3つが最小限必要かと

ankle
質問者

補足

chayamatiさん、いつもお世話になっております。 では、補足いたします。 1 チケット購入者と実購入者はどのような関係ですか。 → 実購入者は、本人の分も含めて実際チケットを購入  した人です。番号1~3を例にすると、「あ」の人が自分の分の他に、家族の分「い」と「う」の人の分も一緒に購入したという意味になります。このため、chayamatiさんの お見込みのとおり、代理人になります。 2 購入者番号は主キーですか。  → T_購入テーブルの番号は、主キーです。 3 このシステムのテーブルはこれだけですか。  → はい、これだけです。  以上、よろしくお願いいたします。

関連するQ&A

  • 【Access2003】VBAで削除のSQL実行ができない

    初歩的な質問かもしれませんが・・・ ACCESS2003VBAでADOを用いて削除を実行しようとしているのですがエラー(エラーは「オーバーフローしました」です。)が出て実行できません。 ソースは以下の通りです。 Dim strSQL As String Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection strSQL = " DELETE FROM D_TB" rs.Open strSQL, cn, , adOpenStatic, adLockOptimistic       '←ここでエラー Do Until rs.EOF rs.Delete rs.MoveNext Loop rs.Close cn.Close どこがおかしいのでしょうか? 大変困っています。教えてください。よろしくお願いいたします。

  • VBA 修正箇所について

    (※)の行にエラーがでているのですが、何を指摘されているのか、どう直せば良いのかが分かりません。下記の情報だけで何かわかりますか?エラー名はインデックスが有効範囲にありませんです。 '******************************************************************************* '機能名  :指定文字を含むシートを検索し、指定文字を含んだシート名を返す '引数   :指定文字(String型) '戻り値  :指定文字を含んだシート名を返す(String型) '備考   :指定文字を含んだシート名が存在しない場合は"NotFound"が返される '******************************************************************************* Public Function gFnc_strSelectSheet(ByVal strTargetSheetName As String) As String Dim i As Integer, intChkFlg As Integer Dim strResult As String intChkFlg = 0 For i = 1 To Sheets.Count (※)If InStr(Worksheets(i).Name, strTargetSheetName) > 0 Then strResult = Worksheets(i).Name intChkFlg = 1 End If Next If intChkFlg = 0 Then strResult = gcnstrNotFound gFnc_strSelectSheet = strResult End Function

  • ACCESS97のMAX関数について

    ACCESS97を使用しています。 "関数"の使い方が全くわかりません。 (というより、SQLも含めて…)  テーブル"TBL_A"の"項目B" から最大値を変数SDHSに取得したいのですが どうすればいいのでしょうか?  Dim db As DATABASE Dim RS As Recordset Dim SDHS, strSQL As String Set db = CurrentDb() strSQL = "SELECT Max(項目B) FROM TBL_A ;" Set RS = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) SDHS = Max(項目B)

  • DAOでデータベースを二つ開くには?

    環境 Windows2000 VB6 DAOで同じデータベースを開くためのやり方がわかりません。 下記のようにマスタのキーを使用して他のテーブルの 内容を更新したいのですが よろしくお願いします。m(__)m Dim ws As Workspace Dim db As Database Dim qd As QueryDef Dim rs As Recordset Dim STRSQL As String dim strsql2 as string Set ws = DBEngine.Workspaces(0) Set db = ws.Databases(0) STRSQL = "SELECT KEY FROM マスタ" Set qd = db.CreateQueryDef("", STRSQL) Set rs = qd.OpenRecordset() Do While Not rs.EOF strsql2 = "Update data from マスタ where key = " & rs!key ???? rs.MoveNext Loop rs.Close qd.Close db.Close

  • ExcelVBA Accessにデータ書き込み

    VBAでコマンドボタンを押した際に特定のセルの値をAccessDBに入力するプログラムを作りたいのですが、上手くいきません...。 実行した際に「実行時エラー '21472179000 (80040e 14)': オートメーションエラーです。」と表示されます。 また、ステップインで実行してみるとEnd Withのところでエラーが発生します。 恐らくインサート文が間違っていると思うのですが、試行錯誤しても解決できませんでしたので教えて頂きたいです。 以下プログラムです。 Private Sub CommandButton1_Click() Dim cn As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset Dim constr As String Dim strSQL1 As String Dim a As String a = Range("A1").Value Dim b As String b = Range("A2").Value Dim c As String c = Range("A3").Value constr = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=~.accdb strSQL1 = "insert into " & _ "TableName (1,2,3) " & _ "values ('" + Range("A1").Value + "','" + Range("A2").Value + "','" + Range("A3").Value + "')" Set cn = New ADODB.Connection cn.ConnectionString = constr cn.Open Set cmd = New ADODB.Command With cmd .ActiveConnection = cn .CommandText = strSQL1 .Execute End With Set cmd = Nothing Set rs = Nothing cn.Close Set cn = Nothing End Sub 以上、宜しくお願い致します。

  • 各変数に何文字格納できるのでしょうか?

    Dim myStr As Variant と Dim myStr As String では、 それぞれmyStrには何文字格納できるのでしょうか?

  • アクセスVBA 変数での抽出条件の書きかた

    顧客データテーブルからの抽出です。 変数を使った書き方がわかりません。 よろしくお願いします。 テーブルのレコードには [氏名]:鈴木 [telnum]:0123456789 が存在します。 Private Sub テキスト0_BeforeUpdate(Cancel As Integer) Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("顧客マスタ", dbOpenDynaset) Dim str As String str = "0123456789" rs.Filter = "[telnum] = ' " & str & " ' " Set rs = rs.OpenRecordset MsgBox (rs!氏名) ’←エラーメッセージ”カレントレコードがありません。”が出ます End Sub

  • Access ADOについて質問です。

    Access ADOについて質問です。 以下コードでレコードセットを返す関数を使用しています。 動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。 Private Sub Form_Open(Cancel As Integer) Dim rs2 As ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;") Set Me.Recordset = rs2 rs2.Close: Set rs2 = Nothing end sub '標準モジュール Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=O:\標準DB\StandardBackEnd.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockReadOnly Set CreateRecordSet = rs ' rs.Close: Set rs = Nothing   ←この部分 ' cn.Close: Set cn = Nothing   ←この部分 End Function 標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • レコード件数が返らない理由がわからない

    テーブル1にはレコードが5件入ってるのですが Private Sub レコード件数() Dim strSQL As String Dim rs As DAO.Recordset strSQL = "SELECT * FROM テーブル1;" Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset) Debug.Print rs.RecordCount End Sub これをすると1が返るのですがなぜでしょうか? レコードの数が返ると思ってるのですが違うのでしょうか?

  • Access VBA フォームに表示したい

    Access2000で、帳票フォームにSQLの値を表示させたいのですが、 以下のコードだとフォーム上に最後のレコードしか表示されません。 取得したデータを正しく表示するにはどうしたらよいでしょうか。 ・フォームのtext1のコントロールソースにfld1と書く 以外の方法でできますか? できればすべて非連結で、作成したいです。 (本当はフォームのrecordsourceも設定したくないのですが それは無理でしょうか?) よろしくお願いいたします。 Private Sub Form_Load() Dim conn As Connection Dim rs As ADODB.Recordset Dim strSql As String Set conn = CurrentProject.Connection Set rs = New ADODB.Recordset strSql = "select * from table1" rs.Open strSql, conn, adOpenKeyset, adLockOptimistic, adCmdText Me.RecordSource = strSql rs.MoveFirst Do Until rs.EOF me!text1 = rs!fld1 rs.MoveNext Loop rs.Close Set rs = Nothing conn.Close Set connn = Nothing End Sub

専門家に質問してみよう