• ベストアンサー

日付の最大値を求めるには

DLookup関数と、DMAX関数を組み合わせて、検索をすれば良いのですが、 表示する項目が多い為、DAOを使って検索を考えています。 検索するコードが複数存在し、最大の日付のレコードを表示 したいと思っています。 コードの名称は・・・ Quotation_B_Noです。 日付が入っている名称は Input_dayです。 フォーム内のMe.W_Revise_Noにコードを入力して、検索を行います。 検索するテーブルは、T_Quotation_B_request_received_tableです。 この中にある。 コードを最初にあるか、どうかをチェックして、 あれば、そのコードに対する、最大の日付のレコードを 検索したいと思っています。 現在、このように組みましたが、 Dim db As DAO.Database Dim rs As DAO.Recordset Dim han As Date Set db = CurrentDb() Set rs = db.OpenRecordset("T_Quotation_B_request_received_table", dbOpenDynaset) rs.FindFirst "Quotation_B_No ='" & Me.W_Revise_No & "'" If rs.NoMatch = True Then MsgBox "Not found Supplier code" Cancel = True Me.W_Revise_No.Undo Exit Sub Else han = DMax("Input_day", "T_Quotation_B_request_received_table ", "Quotation_B_No ='" & Me.W_Revise_No & "'") rs.FindFirst "#" & "han" & "#" And "Quotation_B_No ='" & Me.W_Revise_No & "'"→ここで、エラーが発生します。 Me.W_Control_No = rs!Control_No       ・・・・・ End If rs.Close Set rs = Nothing db.Close Set db = Nothing どのように組めば良いのか、さっぱり分かりません。 ご指導、宜しくお願いします。

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

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

先にテーブル[T_Quotation_B_request_received_table]の列[Quotation_B_No]毎の最大日付を取得するクエリを作成しておく、ではいかがでしょう? select Quotation_B_No, max(Input_day) from T_Quotation_B_request_received_table group by Quotation_B_No; Quotation_B_Noが存在しないものは検索できませんので、(1)検索できるか(2)検索できたら最大日付を取得、の二段階を踏まなくてもすみます。

その他の回答 (2)

noname#140971
noname#140971
回答No.3

<tab1> ID___Quotation_B_No___Input_day 1____A_001________________2007/10/01 2____A_001________________2007/11/01 3____A_002________________2007/10/01 4____A_002________________2007/12/01 このようなテーブルがあるとします。 フォームには、 field_ID field_Quotation_B_No field_Input_day という検索したレコード情報を表示するテキストボックスを配置。 さらに、[W_Revise_No] を配置。 さて、コマンドボタンをクリックして該当するレコード情報を表示したいとのこと。 で、実際に以下のコードを書いて試してみました。 Private Sub コマンド0_Click()   Dim isOk    As Boolean   Dim strHiduke  As String   Dim Msg     As String      If Len(Me.W_Revise_No & "") Then     strHiduke = DBMax("input_day", "Tab1", "Quotation_B_No='" & Me.W_Revise_No & "'") & ""     If Len(strHiduke) Then       isOk = DisplayRecord(Me, "SELECT * FROM Tab1 WHERE Input_Day=#" & strHiduke & "#")       If isOk Then         Msg = "フォームに該当するレコード情報を表示しました"       End If     Else       Msg = Me.W_Revise_No & " に対応する日付はありません。"     End If   Else     Msg = "先に、'W_Revise_No' を入力して下さい。"   End If   MsgBox Msg End Sub まあ、ごくごく簡単なコードを書いているだけです。 こんなやり方もありますよ。 要は、質問者の書いているコードを関数化しただけです。 よかったら、DBMax関数とDisplayRecord関数を補足します。

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.2

>rs.FindFirst "#" & "han" & "#" And・・・ エラーの原因はFindfirstの構文がおかしいからです 引数にはcriteria(条件式)を与えなきゃだめですよ >"#" & "han" & "#" これは日付リテラルで条件式ではありません それより >日付の最大値を求めるには > DLookup関数と、DMAX関数を組み合わせて、検索をすれば良いのですが、 この認識がおかしいですね 普通日付が最大のレコードを求めるには抽出クエリで 抽出条件にサブクエリまたはDMax関数を使います >表示する項目が多い為 だったらなおさらクエリのほうが便利だと思いますが

関連するQ&A

  • ACCESS どこがおかしいのか?

    ACCESSで。クエリからフォームを作成し、検索フォームを作成しようとしています。 AND条件とOR条件を作り検索(抽出)を行いたいのですが、何が間違っているのか、 検索をかけるとすべて「登録がありません」になってしまいます。 どこが間違っているのか、もしくは代替案を教えていただけますでしょうか。 以下は記述した、VBAコードです。 Private Sub 検索ボタン_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Dim stFil As String Set db = CurrentDb() Set rs = db.OpenRecordset("Q_Autoweb", dbOpenDynaset) 'オプションボタンで条件を選択 If 検索条件 = 1 Then rs.Filter = "[タイトル]='" & タイトル検索 & "' and [本文]='" & テキスト15 & "'" Else rs.Filter = "[タイトル]='" & タイトル検索 & "' or [本文]='" & テキスト15 & "'" End If Set rs = rs.OpenRecordset Set Me.Recordset = rs If rs.EOF = True Then MsgBox "登録がありません" Else Me.ID = rs!ID Me.案件名 = rs!案件名 Me.タイトル = rs!タイトル Me.本文 = rs!本文 End If rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub よろしくお願いします。

  • VBAのコード

    参考書に従って次のようなコードを書きました。 Private Sub previewButton_Click() Dim db as DAO.Database Dim rs as DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("Q_ラベル印刷", dbOpenDynaset)* if me!......................以下略 *印のところで「パラメーターが少なすぎます。1を指定してください。」というメッセージが出ます。 どう直せばいいのでしょうか。 よろしくお願いします。

  • 初歩的なSQLですが・・・

    私の環境はOS:Xp      ACCESS2000です。 宜しくお願いします 今AccessVBAで作業をしているのですが、 Dim ws As DAO.Workspace Dim DB As DAO.Database Dim rs As DAO.Recordset Dim sql As String Set ws = DBEngine.Workspaces(0) Set DB = ws.Databases(0) sql = "select MAX(銀行コード) from 銀行テーブル ;" Set rs = DB.OpenRecordset(sql) Me.合計 = rs このSQL文で銀行テーブルに入っている銀行コードの最大値を取得したいのですが、取得した後どのように記述したら「rs」から値を引っ張り出せるのでしょうか? 宜しくお願いします。

  • accessからsqlserverにアップサイジングしましたが,テーブ

    accessからsqlserverにアップサイジングしましたが,テーブルにデータを入力出来なくなってしまいました。 Dim rs As DAO.Recordset Dim db As DAO.Database Set db = CurrentDb() Set rs = db.OpenRecordset("確認用", dbOpenDynaset) rs.AddNew rs!品番 = Me.品番 rs.Update 上記のようにDAOを介してテーブルにデータを入れていました。 アップサイジングする前は、問題なかったのですが、どういったことが原因になりますでしょうか?

  • ACCESSでSQL文を実行した結果を参照したいのですが。

    どなたか助けてください。 環境はWin98 ACCESS2000です。 画面で入力されたコードをもとに、そのコードがテーブルに存在した場合とない場合で次画面のフォームで処理を分けたいと考えています。そのため、SQLを実行した結果の別のコードを参照したいのですが、参照の仕方がわかりません。 コードの検索画面のクリック時のイベントプロシジャ内で Private Sub Cmd_Find_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Dim mySql As String Set db = CurrentDb() mySql = "SELECT T_Name FROM T_テーブル " _ & "WHERE T_Code = " & Frm_Code Set rs = db.OpenRecordset(mySql) If rs.EOF Then     ・・・ない場合の処理 Else Set Me.Recordset = rs →   ココでSELECT文で実行したT_Nameを参照したい End If Set rs = Nothing Set db = Nothing End Sub T_テーブル内にT_NameとT_Codeがあり フォームのテキストボックスの値のFrm_Codeを条件に検索した結果のT_Nameを参照したいのです。 フォームは非連結で処理を行いたいのですが、どのように参照すればいいのでしょうか。本で調べたところ、普通にT_Nameを使っているのですがうまくいきません。 どなたか下手な説明で申し訳ありませんがお願いします。

  • DAOでレコード数を取得したい(ACESSVBA)

    レコードの行数は複数あるのに --------------------------------------------------------- Sub あ() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("T_test", dbOpenDynaset) MsgBox rs.RecordCount Set rs = Nothing Set db = Nothing End Sub --------------------------------------------------------- これでレコード数を取得しようとすると1がかえるのですが なぜレコードの行数を取得できないのでしょうか?

  • DAOでのコードをADOへ書き直し

    Access2003、WinXPです。 レコードセットの取得関係をDAOで書いていたのですが ADOに途中から変更しました。 変数宣言を Public db As DAO.Database ⇒Public cn As ADODB.Connection Public rs As DAO.Recordset ⇒Public rs As ADODB.Recordset Public Fld As DAO.field  ⇒Public Fld As ADODB.field レコードセット取得を Set db = CurrentDb      Set rs = db.OpenRecordset(strSQL) ↓ Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open strSQL, cn レコードセット クローズを Set rs = Nothing Set db = Nothing ↓ rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing としました。今のところ動いているようですが、 何か勘違い、気をつけないといけない事等ありますでしょうか・・・?

  • ExcelからAccessデータを検索するマクロ

    Excel、Accessとも初心者です。 下記を参考にさせて頂いております。 http://okwave.jp/qa/q441987.html これを、(1)~(3)に対応させたいのですが どのように書き換えればよろしいのでしょうか? (1)A1→ A列の最後まで (2)対応するレコードフィールド2   → 規定した複数のレコードフィールド     (例えば、フィールド3とフィールド5とフィールド8) (3)Excel, Accessともに2007です。 (4)検索の経過は表示させない  (少しでも早く処理したい。ひとつひとつ検索結果を表示すると遅くなると聞ききました) ・・・・・・・・・・・・・・・・・・・・・・・・・ Sub Macro1() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = OpenDatabase("c:\abc.mdb") Set rs = db.OpenRecordset("tbl_a", dbOpenDynaset) rs.FindFirst "[フィールド1]='" & Range("A1").Value & "'" If rs.NoMatch Then   Range("B1").Value = "" Else   Range("B1").Value = rs![フィールド2] End If rs.Close Set rs = Nothing Set db = Nothing End Sub ・・・・・・・・・・・・・・・・・・・・・・・・・ よろしくご教授お願いします。

  • Accessで、DAOでAddnew

    参照はDAOで、Addnewでデータの追加をしたいのですが、記述が悪いのか、上手くできません。 どなたか、教えて下さい! テーブル:スケジュールソース フィールド:日付 Private Cur_Db As DAO.Connection Private rs As DAO.Recordset Private sql As String Dim str_date As String str_date = Me!日付 Set Cur_Db = CurrentDb rs.Open "スケジュールソース", Cur_Db, dOpenKeyset, adLockOptimistic rs.AddNew rs("日付").Value = str_date rs.Update

  • 空欄を含む項目のレコードセット

    Access 2003 DAO.Recordsetにてデータを取得しようと思うのですが テーブル項目に空欄がある場合はどのように書けばよろしいのでしょうか? Dim DB As DAO.Database Dim RS As DAO.Recordset Set DB = CurrentDb Set RS = daoDB.OpenRecordset("Aテーブル", dbOpenDynaset) RS.AddNew daoRS!ああ ああ = xx RS!Update ・・・ とするとエラーになります。 項目名"ああ ああ"はどのように書けばいいのでしょうか? よろしくおねがいします。