• ベストアンサー

AccessVBA SQLのWHERE句について

こんにちは! テーブルAのBフィールドの中に以下のデータがあるとき(昇順です) 1,2,5,6,12.... 3という数値を得たいです。 3,4がフィールドに含まれる場合は、7です。 数字がバラバラなので、データを新規追加した時に穴埋めをしていきたいのです。 データの登録した順番は関係ないものとして、どのように実現できますでしょうか? ORDERでデータを取ってきて、ループするしかないのでしょうか・・・? 特殊な例ですみませんが、宜しくお願い致します。

  • jobvba
  • お礼率60% (166/274)

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

  • ベストアンサー
noname#140971
noname#140971
回答No.2

tab1: ID 1 2 4 クエリ1: SELECT tab1.ID, DBLookup("ID","Tab1","ID>" & [ID],0) AS NextID FROM tab1; [イミディエイト] ? DBLookup("ID+1", "クエリ1", "(NextID-ID)>1") 3 簡単なのは[クエリ1]で、現行の値を次の値を発生させること。 で、その差が1以上の時の値+1が空番号。 Public Function DBLookup(ByVal strField As String, _              ByVal strTable As String, _              Optional ByVal strWhere As String = "", _              Optional ByVal ReturnValue = "") As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim strQuerySQL As String   Dim rst     As ADODB.Recordset   Set rst = New ADODB.Recordset   strQuerySQL = "SELECT " & strField & " FROM " & strTable   If Len(strWhere) > 0 Then     strQuerySQL = strQuerySQL & " WHERE " & strWhere   End If   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function

jobvba
質問者

お礼

回答ありがとうございました。

その他の回答 (2)

noname#140971
noname#140971
回答No.3

クエリなしの複文化は試してください。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

1~フィールドBの最大値までの値を持つ別テーブルをひとつ用意する。 で、不一致クエリを利用して「無い物ねだりリスト」を作成。

jobvba
質問者

お礼

回答ありがとうございました。

関連するQ&A

  • AccessVBA SQL テキスト型は大小判定できない?

    こんにちわ。 AccessVBA業務暦1ヶ月の新米です。 テーブルからテキスト型のフィールドを抽出するとき、抽出条件として「A~B」とか「Aより大きいもの」 という条件で抽出しているのですがうまくいきません。フィールド自体はテキスト型でとっているのですが、中身のデータは「00001、000023・・・」とか数字で入っています。フィールドを数値型にしたらうまくいくのに、テキスト型にするとうまく抽出できません。解決方法はあるでしょうか?他のシステムとの連携があるので、できればAccess側はテキスト型でとっておきたいです。説明不足かもしれませんが、よろしくお願いします。

  • SQL書けますか?

    field1,field2がありまして、データが4件あるとします。 データの内容はそれぞれ、 1,B 2,C 3,A 4,B が入っています。 この時selectで 1,B 4,B 2,C 3,A と言う順番で取ってきたい場合どのように書けばいいのでしょうか? field1の昇順が基本だけど、field2が同一の場合優先順位関係なしに連続して表示したいんです。 よろしくお願いします。

  • AccessVBAでの事です。

    こんにちは。 よろしくお願いします。 Access2000/WindowsXP にて、VBAを使いデータベースを組んでいます初心者ですー。 あるベースとなるフォーム上に、サブフォームがあり、そのサブフォームは データシートビューで、あるテーブルを表示しています。 そのサブフォームのデータシートをどこかのフィールドをキーにして並べ替えをします。 (フィールド名の上で右クリックメニュー出して「並べ替え昇順」とかを実行) そうするとちゃんと並べ変わります。 さてその様な状態で、VBAにて、そのサブフォームのレコードソースとなっている テーブルをいじろうと思って、ADOのRecordSetでそのテーブルをオープンし、最初から MoveNextでレコードを手繰っていくと、さっきフォーム上で並べ替えた順番でなく、 最初にそのテーブルを作成した順番のままで取得されてしまいます。 これを、フォーム上で並べ替えた順番でレコードセットを取得する方法というのは ないのでしょうか? または 今現在サブフォームのデータシートがどのような条件で並び替えがされているか を知る方法はないでしょうか? ※どのフィールドで並び替えるかは、ユーザーのその時の操作によって不定ですので あらかじめ並び替えのクエリーを作っておいて   Dim cnt As New ADODB.Connection   Dim rst As New ADODB.RecordSet   Set cnt = CurrentProject,Connection   rst.Open "クエリQ1", cnt, adOpenKeyset, adLockOptimistic と、クエリーでオープンする事もできません。。 どうか、よろしくお願いいたします!!!

  • SQLで、Join句で結合したテーブルにデータが無い場合について

    SQLについての質問です。 Join句を使ってテーブルを結合しています。 Aテーブル(社員データ)に存在する勤務区分フィールドの値に対応して、 Bテーブル(勤務データ)から勤務区分(一意)に対応したデータを持って来るSQLを作成したところ、 Bテーブルに存在しない勤務区分を持つAテーブルのデータは結果に出ませんでした。 このように、結合したBテーブルに対応するデータが無い場合でも、Aテーブルに存在するデータを全て出したい場合、 何か方法はあるのでしょうか? 現在は一度Aテーブルから全てのデータをセレクトした後に、1件1件ループしてBテーブルからセレクトする方法をしていますがもっと簡潔にできるなら簡潔にしたいと思っています。 どなたかお答え頂けると幸いです。よろしくお願いします。

  • order by について

    質問させてください。 下記テーブルがあるとします。 [samle_tbl](フィールドa, b(integer)) ====== a|b ====== 2|* *|4 3|5 4|2 *|1 2|6 1|2 (※*はNULLデータ) 上記のテーブルでa, bフィールドにおいて数字の大きいレコード順に取得したいとかんがえています。 2|6 3|5 *|4 4|2 2|* 1|2 *|1 簡単にいうとa, bフィールドの値においてどちらかの数値がa, bフィールド内において降順にレコードをシュとくしたいです。 同じ順番に値する場合*(NULLデータ)を含むレコードと含まないレコードの順番は気にしません。 どのようなSQLを実行すれば取得できますでしょうか?

  • SQLのbetweenについて

    現在SQLを勉強しています。 C♯とSQLServerを使用しているのですが betweenを使って困った点があります。 自分で入力するAとB(どちらも数字)をbetweenの条件にしていしているのですが 例) select フィールド名 from テーブル where フィールド名 between A and B; → テーブルのフィールド名 の中のAからBのデータを選択する は問題ありません。 ですがAとBが未入力だとエラーが当然でてしまいます。 そこで未入力だとフィールド名の中を全件selectするようにしたいのですが、これはbetween で出来るのでしょうか? おそらくは条件であれこれ指定するのだと思いますが… 回答お願いします

  • ACCESS2003クエリの結合した表示形式が

    ACCESS2003でクエリを作成しました。各テーブルのフィールドを結合したのですが 表示形式が思ったようになりませんでした。 【Aテーブル】 フィールド:学部NO データ型:数値型 書式:00 【Bテーブル】 フィールド:学科NO データ型:数値型 書式:00 【ABクエリ】 フィールド:学籍NO:[Aテーブル]![学部NO]&[Bテーブル]![学科NO] 【ABクエリ】の結果が数字が4桁表示されません。 (例) 0101 と表示してほしいのですが、   11  と表示されます。 各テーブルでは、01と表示されるのですが・・・。 宜しくお願いします。

  • Access97でテーブルのデータを並べ替える方法

    Access97で(OSは98)テーブルで入力したデータをクエリーで並べ替えをかけるのですが、 そのフィールドのデータを昇順、降順以外で自分の思うような順番で 並べ替えることができますか? 例) パソコン、デジタルカメラ、プリンタ、メディアのような順番で。。。 今後他のテーブルと結合するのでこれら以外にコード番号を入力する フィールドを作り、これらをこの順番で入力すればよいのかもしれませんが Excelのユーザー設定リストを並べ替えで使うような機能がAccessにあったかと思いまして。よろしくお願いいたします。

  • SQLを教えてください

    毎月月末に、当月分のtbl_orderのデータを tbl_order_oldに移す作業を手動で行っているのですが、 SQL一回もしくは、二回で出来ないしょうか tbl_order_oldテーブルはtbl_orderテーブルと全く同じ構造になっています。 tbl_order itemname orderday りんご 2015/11/1 みかん 2015/11/2 もも 2015/11/30 かき 2015/12/1 いちご 2015/12/2 (1)tbl_order_oldにorderdayが2015/11/1~2015/11/30までのデータを追加 (2)tbl_orderからorderdayが2015/11/1~2015/11/30までのデータを削除

    • ベストアンサー
    • MySQL
  • MSアクセス SQLの書き方(UPDATE)

    MSアクセス2010 テーブルA フィールドA=テキスト型(4文字) テーブルB フィールドA=テキスト型(2文字) フィールドB=Yes/No型 テーブルBの2文字が、テーブルAの4文字に含まれていたら、テーブルBの全てのレコードのYes/No型をTrueにしたい。 rs.MoveNextでループを使わず一括でする方法はないですか? DoCmd.RunSQL "UPDATE テーブルB SET フィールドB=True WHERE (テーブルAの文字にテーブルBの文字が含まれていたら) みたいな感じで。

専門家に質問してみよう