• 締切済み

アクセスのフォームにカンマ区切りで数値を入力し、そのまま反映させデータ

アクセスのフォームにカンマ区切りで数値を入力し、そのまま反映させデータ出力したいです。 つい先日はお世話になりました。 おかげさまで出したい表を作れるようになりました。 そ、そして今度は、その表をマクロやフォームを使って簡単に出そうと試みています。 JANコードというフォームにJAN「aaaaaaaaaaaaa」を入力すると、 「aaaaaaaaaaaaa」という商品の在庫を所持している店舗を出すというものです。 ↓↓↓ -------------------------------- JAN |店舗 | -------------------------------| aaaaaaaaaaaaa |1,2,4,6 | -------------------------------- 理想は、カンマ区切りの複数JANをフォームに入力したら、それらの一覧表が出力される仕様です。 ↓↓↓ -------------------------------- JAN |店舗 | -------------------------------| aaaaaaaaaaaaa |1,2,4,6 | -------------------------------- bbbbbbbbbbbbb |1,3,5,6 | -------------------------------- ですが、今現在は単品でしか表が出せないという問題です。 下記のクエリの抽出条件で、入力した数値を導きだそうとしています。 In ([Forms]![在庫所持店舗表作成]![JAN]) 単品なら上手く事が運び、表がでるのですが、 カンマ区切りの複数になると抽出条件が一致しませんとエラー表示が出ます。 どうやら、フォームで入力したカンマ区切りの数値が、 クエリ抽出条件側では「カンマ」が取り除かれています。 フォーム「aaaaaaaaaaaaa,bbbbbbbbbbbbb」 ↓↓↓ クエリ上「aaaaaaaaaaaaabbbbbbbbbbbbb」 このクエリで使用しているテーブルには勿論、 26桁のJANなんか存在しませんので、エラー表示です。。 カンマ区切りJAN「aaaaaaaaaaaaa,bbbbbbbbbbbbb」のまま反映させる方法はありませんか?? 複数商品の検索が出来ないとほぼ使い物になりませんorz アクセス2000を使用しています。 何卒!何卒よろしくお願い致します。。。

みんなの回答

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

#1,2です。 文章書いていたら回答があったみたいですね。 せっかくですので、出来上がったものを回答してみます。 > 抽出時間が大幅に伸びた・・・・この関数を使っているからでしょうか? そうだと思います。(全件処理していると思うので) 他にもやり方はあるので、試されますか? 1)複数指定する上限(個数)を決めてやる 1-1)JAN 入力の更新後処理でテキストボックスに分割する 1-2)クエリ内で JAN をカンマ区切りで抜き出す 2)クエリの内容を参照&書き換え実行 3)テンポラリテーブルを使用した絞込みをする 1-2)2)の動くサンプルは私のブログからDLできますが、 規約によりアドレスは書けません。キーワードの提示もできません。 以下に簡単に書いていきます。 1)複数指定する上限(個数)を決めてやる 文字数制限もあるので、 フォーム名を「F1」、検索用テキストボックス名「JAN」とし、上限を5つとします。 上限をもっとしたい場合には同様な記述で追加してください。 (★★ 書いていった結果、文字数オーバしたので2つに分けます ★★) 1-1)JAN 入力の更新後処理でテキストボックスに分割する フォームにクエリで参照するテキストボックス「tx0」~「tx4」を不可視で配置します。 検索用テキストボックス「JAN」の更新後処理で「tx0」~「tx4」へ分割設定します。 Private Sub JAN_AfterUpdate()   Dim sAry() As String   Dim i As Long   If (IsNull(Me.JAN)) Then     ReDim sAry(0)     sAry(0) = ""   Else     sAry = Split(Me.JAN, ",")   End If      For i = 0 To 4     If (i <= UBound(sAry)) Then       Me("tx" & i) = sAry(i)     Else       Me("tx" & i) = Null     End If   Next End Sub クエリの変更箇所での記述は、 ((_単品在庫リアル.自社コード) In ([Forms]![F1]![tx0],[Forms]![F1]![tx1],[Forms]![F1]![tx2],[Forms]![F1]![tx3],[Forms]![F1]![tx4])) とします。 IN句のところで、参照するテキストボックスをカンマ区切りで羅列していきます。 (テキストボックス1つに、自社コードが1つ入っている状態にして) 1-2)クエリ内で JAN をカンマ区切りで抜き出す 標準モジュールに以下関数を記述しておきます。 Public Function mySplit(vS As Variant, iNum As Integer) As String   On Error Resume Next   mySplit = ""   mySplit = Split(vS, ",")(i - 1) End Function クエリの変更箇所での記述は、 ((_単品在庫リアル.自社コード) In (mySplit([Forms]![F1]![JAN],1),mySplit([Forms]![F1]![JAN],2),mySplit([Forms]![F1]![JAN],3),mySplit([Forms]![F1]![JAN],4),mySplit([Forms]![F1]![JAN],5))) aaaa,bbbb の入力があった場合、 mySplit([Forms]![F1]![JAN],1) では、aaaa が mySplit([Forms]![F1]![JAN],2) では、bbbb が得られます。 第2引数部分が、何個目、 の意味になっています。 必要な分を羅列していきます。書いた分が制限になります。 mySplit([Forms]![F1]![JAN],10) まで順に書いたとすると上限は10個に 【つづく】

全文を見る
すると、全ての回答が全文表示されます。
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

確認したところ、クエリの抽出条件でフォームのテキストボックスの 値を参照する場合、Split関数を使用するなどしても、複数要素として 扱うことはできない(=「aaaaaaaaaaaaa,bbbbbbbbbbbbb」は全体で 1つの値としてしか扱えない)ようです。 ただ、VBAから直接SQL文を作成するなら、この縛りから逃れることが できますので、最初にyukinosuke1104さんが示された通り、「In句」を 使用したSQL文を、VBAから作成するのがよいかと思います。 (In句なら完全一致分しか抽出しないので、上記の問題は発生しない:  検索条件に入力ミスがあれば結果が表示されないため、入力者が  ミスに気づきやすい、と) 以下、『在庫所持店舗表データ作成』コマンドボタンのクリックした時に 表示しているのが、クエリなのかフォームなのかがわからないため、 それぞれの場合を回答します。 なお、No.1の補足欄に貼り付けたSQL文を、予め以下の3つに分割して、 細工をしておいてください。  式【A】:   先頭の「Select」から「In (」までを「"」(ダブルクォート)で括ったもの   (「"SELECT _単品在庫リアル.~~~自社コード) In ("」)  式【B】:   フォームのテキストボックスを指定する「Forms!~」の式(そのまま)   (「[Forms]![在庫所持店舗表作成]![JAN]」)  式【C】:   上記の式の直後の「)) AND」から最後までを「"」で括ったもの    (「")) AND ((_単品在庫リアル.~~~.店舗コード;"」) 【フォームの場合】 上記コマンドボタンのクリック時イベントのVBAまたはマクロに、以下の ようなコードを追記します:  <VBAの場合>   '当該フォームを開く「DoCmd.OpenForm」の行の後に、以下の   'コードを追記   Forms!店舗一覧.RecordSource = 【A】 & Me!JAN & 【C】  <マクロの場合>   当該フォームを開く『フォームを開く』アクションの後に、   『値の代入』アクションを追加     ・『アイテム』:Forms!店舗一覧.RecordSource     ・『式』:【A】 & 【B】 & 【C】 ※一覧表示用のフォーム名を「店舗一覧」と仮定しました。   なお、上記コードでレコードソースを設定するので、同フォームの   デザインビューでの『レコードソース』は空白にしてしまって下さい。 【クエリの場合】 ※こちらの場合、マクロのみでの対応はできません。 上記コマンドボタンで■クエリを開く前に■ 、以下のコードを追記します:   '<以下は、変数宣言部分に追記>   Dim qdf As DAO.QueryDef   '<以下は、クエリを開く前の部分に追記>   'フォームで指定したJANコードを、当該クエリの抽出条件に直接記述   Set qdf = CurrentDb.QueryDefs("クエリ名")   qdf.SQL = 【A】 & Me!JAN & 【B】   Set qdf = Nothing ・・・以上です。

全文を見る
すると、全ての回答が全文表示されます。
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

((_単品在庫リアル.自社コード) In ([Forms]![在庫所持店舗表作成]![JAN])) の部分を (Nz(InStr([Forms]![在庫所持店舗表作成]![JAN],_単品在庫リアル.自社コード),0) > 0) にするとどうなりますか。

yukinosuke1104
質問者

補足

う、うぉ~~~!!! ううう、うぉ~~~~~!! 複数のデータ抽出できましたーーー!!!!!!!!!!! 感激です。。。;; ありがとうございます!! お蔭様で効率よく仕事がこなせそうです>< 最後に質問なのですが、単品で出した時に比べ(2、3秒)、 抽出時間が大幅に伸びた(アクセス応答無し表示になる)(3~4分)のは、この関数を使っているからでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

現在そのクエリをSQLビュー表示した際、WHERE 部分は WHERE [JAN] In ([Forms]![在庫所持店舗表作成]![JAN]) のようになっているかと思いますが、以下に変更してみてどうなりますか。 WHERE Nz(InStr([Forms]![在庫所持店舗表作成]![JAN],[JAN]),0) > 0

yukinosuke1104
質問者

補足

SELECT _単品在庫リアル.自社コード AS JAN, _単品在庫リアル.店舗コード INTO T1_在庫保持 FROM _単品在庫リアル INNER JOIN _店舗マスタ ON _単品在庫リアル.店舗コード = _店舗マスタ.店舗コード WHERE (((_単品在庫リアル.自社コード) In ([Forms]![在庫所持店舗表作成]![JAN])) AND ((_単品在庫リアル.理論在庫数量) Not In (0,Null)) AND ((_店舗マスタ.事業部コード)=0)) ORDER BY _単品在庫リアル.自社コード, _単品在庫リアル.店舗コード; 該当クエリのSQLビューとはこのことでしょうか?? 変更する箇所にカッコが多くてどう変えてみればいいのかわかりません。。 お願い致します><

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • カンマ区切りの数値文字列を数値に変換

    JSPで数値を入力して、データベースへ更新するプログラムを作成しています。 入力はカンマありでもなしでも通すようにしたいと思っています。 しかも、カンマの位置は特にチェックせずにしたいのです。 ちゃんとしたカンマ区切り数値なら、NumberFormatで数値変換できますよね? データベースの数値を表示する際にもカンマ区切り数値にしますので、1桁目を削除した場合には、カンマの位置が違ってきますよね。 そのためにカンマの位置は意識しないでいきたいのです。 StringTokenizer という便利なクラスがあったので使用してみたのですが、インスタンスを生成した後、トークン分をループで回して文字列を連結する必要がありますよね。 もっとスマートに一発で変換できないでしょうか? 「ある文字列からデリミタを省いた文字列を返すメソッド」みたいな。 よろしくお願いします。

  • アクセス 数値型にするとフォームの入力ができない

    お世話になります。色々調べたり、実験してみたのですが、分からない点があります。 簡単でいいので、可能性のある原因を教えてください。 アクセス2003です。 ■パターン1  フォームC の入力ができる テーブルA(主キーがオートナンバー型)、その他4つのテーブル(これら5つのテーブルは、参照整合性リレーションで結ぶ) →それらを元にクエリBを作る→クエリBを元にフォームC を作る ■パターン2  フォームC の入力ができない テーブルA(主キーが数値型)、その他4つのテーブル(これら5つのテーブルは、参照整合性リレーションで結ぶ) →それらを元にクエリBを作る→クエリBを元にフォームC を作る 簡単にいうと、テーブルのデータ型によって、入力可否が変わるのです。 なぜ、パターン2は、入力できないのか分かりません。 よろしくお願いします。

  • 【Excel】「リスト」数値入力でカンマを使うには

    「データの入力規則」で作るリストにて、数値入力の際にカンマを使うことはできないのでしょうか? たとえば「1,000円」と「2,000円」の場合、「元の値」に入力したときにカンマを使うと、このタスク上では区切りとして扱われてしまうようで実際にリスト化したときに 1 000円 2 000円 というリストになってしまいます。 カンマが入った数値のリスト化の方法はあるのでしょうか? Excel2007利用です。

  • クエリの抽出条件をフォームで入力したものにしたい

    こんにちは。すみませんうまくいかないのでどなたか助言していただきたくお願いいたします。 クエリの抽出条件をフォームで入力した値にしたいと思っており、クエリの抽出条件欄に >=[集計フォーム]![開始日入力] と入力しました。「フォームの名前」!「テキスト名」です。 そしてフォームに値を入力してクエリ実行ボタンをクリックするとパラメータクエリのようになってしまいます。 フォーム内で何か設定をしないといけないのでしょうか? すみませんがよろしくお願いいたします。

  • Access2000 フォームでのデータ入力について

    質問させていただきます。 以下のようなフォームを作りました(帳票フォーム)。 入庫予定日 原料 在庫数 発注数 ○○○   ○○   ○   ○ ○○○   ○○   ○   ○ 入庫予定日、原料、在庫数は選択クエリー(前日までの在庫を求めるため。また、この項目を変更することはありません)から、発注数(非連結)は手入力で行います。そして発注数に値を入力するとすべてのレコードが同じ値になってしまいます(非連結だから?)。これを回避する方法はあるでしょうか。

  • Access2000 フォームでのデータ入力について

    質問させていただきます。 Access2000で、あるフォームを作りました(帳票フォーム)。フォームの基になるレコードソースはクエリーです。このクエリーは原料伝票テーブルから在庫数が特定の数量を下回った原料を抽出しています。 フォームは以下イメージです。 原料コード 原料名  在庫数  発注数 原料コード~在庫数をクエリーから、発注数を手入力 にしました(発注数のコントロールソースは非連結です)。 で・・・発注数に値を入力すると全部の行が同じ値になってしまします。これを改善したいのですが・・・。 このやり方は根本的に間違っているのでしょうか?

  • フォームからクエリの抽出条件を入力する方法

    既存のデータベースより複数のテーブルを結合し、必要なカラムだけを表示させるようなクエリを作成しました。 他の人でも操作ができるように、フォームを作成し、テキストボックスにて抽出条件を指定し、クエリやレポートを出力するような形にしたいと思っています。 このクエリの抽出条件をフォームより指定する方法で悩んでいます。 現在、作成したクエリの抽出条件の中に [Forms]![フォーム名]![テキストボックス名] と入力し、フォームのテキストボックスで抽出条件を記入してクエリを実行させているのですが、これでは複雑な条件 (Between~ や 条件1 or 条件2 等の指定) を入れると「直前の操作はキャンセルされました」とポップアップが出てしまい、思うとおりにうごきません。 フォーム内でこのような抽出条件範囲の指定ができるようにするにはどうしたらよろしいでしょうか? よろしくおねがいします。

  • ACCESS フォーム入力内容を条件にクエリを作る

    ACCESS2003です。 フォーム上に、 会社名 住所 というフィールドがあります。 クエリで、 ・フォームの会社名が未入力の場合は、全ての会社が対象 ・フォームの会社名が入力されている場合は、会社名で抽出(部分一致 クエリだと 「Like "*条件*"」になるような条件) というような条件式を作りたいのですが、うまくいきません。 どのような条件式を作ればよいでしょうか。

  • リストボックスで複数データを選択、入力(Access97)

    Access97で初めて入力フォーム作成にチャレンジしています。 リストボックスやコンボボックスで複数データを選択し、1つのフィールドに入力したいのですが、可能でしょうか? よろしくご教示ください。 例:”趣味”というフィールドに   リストからの選択で   ”読書,映画,テニス”のように入力したい。   (カンマ区切り、スペース区切り、区切りなし   など何でも結構です。)   *ベストはカンマ区切り。  

  • ACCESS2000で入力中のレコードを印刷したい

    初心者ですみません。現在入力中の情報だけを印刷したいので、フォームのキーを抽出条件にて設定したクエリーでレポートを作成したのですが、単票、表形式共に#Errorが出ます。クエリーを見ると抽出条件でのレコードが無いのであたりまえかとも思いますが..過去に入力したレコードや、アクティブ状態?(レコードセレクタをクリックした状態)の表形式のレコードは正常に印刷されます。OS=WIN98です。宜しくお願いします。

専門家に質問してみよう