• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:数値のMAXの値を取得したい ADO VBA)

数値のMAXの値を取得する方法

このQ&Aのポイント
  • ADOを使用して、テーブルの特定のフィールドの最大値を取得する方法を教えてください。テーブルの番号フィールドには数値が入っており、その中で最大の値を取得したいです。
  • Recordsetを使用してテーブルを参照し、番号フィールドのデータを降順でソートすることで、最大値を取得できます。しかし、よりシンプルで効率的な方法はありませんか?
  • 質問者はADOとVBAを使用して、テーブルの番号フィールドの最大値を取得したいと考えています。現在の実装では、Recordsetを使用してソートし、最大値を取得していますが、もっと簡潔な方法があれば教えてください。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

ADOで、エクセルのデータを使っていますが、ご参考にしてください。 ポイントは、下記モジュールのSQL分の、strSql⁼の部分です。 データベースの指定部分は、.mdbなりに変えてください。 例データ  SheetIのA1:D8に 社員no 氏名 所属 年齢 12 山田 総務 23 34 木村 総務 34 56 笠原 工事 36 78 吉田 人事 41 63 池田 サービス 26 33 鈴木 工事 41 38 今井 工事 41 があり、この中の最高齢のレコードを探します。 結果は41歳の3人(吉田、鈴木、今井)です。 ーー 標準モジュールに Private Sub test16() Dim adoCON As New ADODB.Connection Dim adoRS As New ADODB.Recordset Dim strSQL As String Dim odbdDB As Variant 'データベースのパスを取得(ExcelブックをDBとする) odbdDB = ActiveWorkbook.Path & "\SQL例1.xlsm" 'データベースに接続する Set adoCON = New ADODB.Connection adoCON.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _ & "DBQ=" & odbdDB 'カーソルをクライアント側に設定 adoRS.CursorLocation = adUseClient '--- strSQL = "SELECT A.氏名,A.所属,A.年齢 FROM [Sheet1$] AS A WHERE A.年齢 = (SELECT MAX(B.年齢) FROM [Sheet1$] AS B);" '---- 'レコードセットを開く adoRS.Open strSQL, adoCON, adOpenDynamic 'テーブルを読み込む Do Until adoRS.EOF MsgBox "氏名=" & adoRS.Fields(0).Value & ",所属=" & adoRS.Fields(1).Value & ",年齢=" & adoRS.Fields(2).Value adoRS.MoveNext Loop 'クローズ処理 adoRS.Close Set adoRS = Nothing adoCON.Close Set adoCON = Nothing End Sub 結果はMsgboxの行に出ますので、変数にでも入れて(x=adoRS.Fields(0).Value ,など)、何かに使ってください。 ーーー 上記例の、41歳の3人のレコードを捉えました。ACCESSにもご存じのように、集合関数のMAX関数はあります。しかし MAX(年齢)では、最高齢は41歳ということは、簡単にSQLで組めて求まりますが、 質問者のニーズでは、レコード的に、誰(氏名)で、その他情報(所属など)はどうなっているか、必要でしょう。 SQLは集合論的に処理するが、結局レコード処理に行き着かざるを得ないニーズが多いだろうとおもう。 SQLの処理系により、欠課が画面に出ても、それをその後の処理で何かに使いたいときは、はたと困ってしまうのでは。 ーー またSQLでむつかしい点は、 SQLでは、 SELECT A.氏名,A.所属,A.年齢 ,MAX(A.年齢)FROM ・・というような書き方はできませんので上記のようになります(「相関クエリ」(第1法)) そのほかのやり方(書き方)もあるようです。InnerJoinを使う(第2法) ーー 質問ではSQLを使いたいようだと解して上記をやってみましたが、 (第3法)いっそのこと各レコードを1つづつ(MoveNext)捉えて(シーケンシャルに)、今までの年齢の最大値と今回の年齢値を比較して、今回のものが大きければ、今までの年齢の最大値を今回のものに置き換えて,最後のレコード(rs.EOF)までそのロジックを繰り返す(最大値を求めるアルゴリズムを使う)方法もあると思います。 ーー エクセルの関数なら簡単なのに、と思ったものです。 ーー Googleなどで「sql 最大値」で照会して、出てくる記事を読んでください。

FLAHHVCNQFES
質問者

お礼

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

その他の回答 (1)

noname#212058
noname#212058
回答No.1

> MAX関数のようなもので5を返したいのですが > ADOにそのようなプロパティはありますか? プロパティはありません。 "SELECT MAX(cn) FROM T_test" を実行すると、cn 列の最大値が入った1行の RecordSet が取れますので、そこから取得します。

FLAHHVCNQFES
質問者

お礼

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

関連するQ&A