VBAでSQLクエリを実行します。 VBA の Excel クエリを介して Access からクエリを実行します。 ソースデータの例

05.07.2022

Access では、myQuery クエリ ビルダーを使用して開発されたクエリが保存されました。 データベースは ODBC 接続を介してシステムに接続されます。 すべてのマクロが含まれています。

Excel は、次の方法でデータベースに接続するための ADODB 接続を確立しました。

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Open "MyDatabase.accdb" End With

通常は SQL を記述するだけで、これはうまく機能し、次のようなことを実行するだけです。

Dim sqlQuery As String sqlQuery = "SELECT * FROM myTable" Set rs = New ADODB.Recordset rs.Open sqlQuery, con, ...

しかし、アクセスデータベースに保存したクエリにアクセスしたいと考えています。 では、接続したばかりのデータベース上で保存されたクエリを呼び出すにはどうすればよいでしょうか。

もう試してみました

  1. con.Execute("EXEC myQuery") を実行しましたが、myQuery が見つからないことがわかりました。
  2. rs.「myQuery」を開きますが、これは無効であり、そこからの SELECT/etc ステートメントが必要です

5 つの答え

これはストアド プロシージャと考えることができると思います。

Dim sqlQuery As String の直前から開始すると

Dim cmd as new ADODB.Command cmd.CommandType = adCmdStoredProc cmd.CommandText = "myQuery" cmd.ActiveConnection = con Set rs = cmd.Execute()

その後、レコードセットを使用して作業を開始します。

あなたはもうすぐそこにいた

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con = New ADODB.Connection With con .Provider = "Microsoft.ACE.OLEDB.12.0" .Open "z:\docs\MyDatabase.accdb" End With con.Execute 「マイクエリ」

執行部を離れるだけです。

パラメーターを追加することもできます。これは少し古いですが、役立つはずです。 Access データベースの 2 つのフィールドを Excel データと場合によってはマクロで更新します。

以下を使用して、Access に既に保存されている更新クエリを実行できました。

Connection.Execute "My_Update_Query_Already_Saved_In_Access"、adExecuteNoRecords、adCmdStoredProc

これにより、クエリ名のスペースをベースのようにアンダースコアに置き換えるまで、エラーが発生していました データにアクセスする、および実行ステートメント内。

ハッキングのような仕事ですが、依頼することも可能です。 つまり、SQL 行を次のように置き換えます。

SqlQuery = "SELECT * FROM クエリ名;"

開始する前に、Access データベースが保存されていることを確認する必要があります。 Ctrl + S を押します (Access でクエリを実行するにはこれだけでは不十分です)。

このトピックが作成されてから長い時間が経過しました。 正しく理解できれば、何か役立つことを追加できるかもしれません。 OP で説明している内容に名前を付けました。これは、ACCDB に格納されているクエリから SQL を使用し、DAO または ADOBD を介して VBA で実行するプロセスです。 私のメモでは、オブジェクト名のプレフィックス/サフィックスの頭字語 OPP を使用して、これを「オブジェクト プロパティ プロバイダー」と呼びました。

この考え方は、ACCDB 内の既存のオブジェクト (通常はクエリ) が、VBA で使用する必要があるプロパティ (通常は SQL) を公開するというものです。 このためのクエリから SQL を吸い出すためだけに関数を作成しました。 以下を参照してください。 警告: 申し訳ありませんが、これはすべて DAO で行われます。私は ADODB をあまり使用しません。 このアイデアが今後も役立つことを願っています。

これらの OPP クエリから得られる SQL で置換可能なパラメータを使用/挿入するためのメソッドの開発まで行いました。 次に、VBA.Replace()を使用して前に置き換えます SQLを使用する VBAで。

ACCDB 内の SQL クエリへの DAO オブジェクト パスは次のとおりです。

MySqlStatement = Access.Application.CurrentDb.QueryDefs("myQueryName").SQL

私は、置き換える必要があるものを評価し、実際のデータベースには存在しない可能性があるパラメータに珍しい名前を選択することで、置き換え可能なパラメータを使用します。 ほとんどの場合、私が行った置換は、フィールド名、テーブル名、または WHERE 句と HAVING 句の式だけです。 したがって、「(ReplaceMe00000001)」のようにそれらを呼び出して使用します 置換機能() 仕事をするために...

SqlText = VBA.Replace(sqlText, "(ReplaceMe00000001)", "SomeActualParameter")

次に、VBA で sqlText を使用します。 以下に実際の例を示します。

Public Function MySqlThing() Dim sqlText as String Dim myParamater as String Dim myExpression as String "すべてを設定します。 sqlText = getSqlTextFromQuery("myQuery") myParameter = "(ReplaceMe00000001)" myExpression = "SomeDateOrSomething12/31/2017" "置換を実行します。

sqlText = VBA.Replace(sqlText, myParameter, myExpression) "次に SQL を使用します。 db.Execute sqlText, dbFailOnError End Function Function getSqlTextFromQuery(ByVal oppName As String) As String Dim app As Access.Application Dim db As DAO.Database Dim qdefs As DAO.QueryDefs Dim qdef As DAO.QueryDef Dim sqlText As String Set app = Access.Application Set db = app.CurrentDb Set qdefs = db.QueryDefs Set qdef = qdefs(oppName) oppGetSqlText = qdef.SQL End Function マクロの使用 Access データベースでは、データシート ビュー、デザイン ビュー、またはプレビュー ビューで選択クエリとクロス クエリを開くことができます。 このアクションにより、変更リクエストがトリガーされます。 リクエストのデータ入力モードを選択することもできます。

注記:このマクロは、Access データベース環境 (MDB または ACCDB) でのみ使用できます。 Access Project Environment (ADP) を使用している場合は、「マクロ」を参照してください。 オープンビュー, 保存済みプロシージャを開くそして オープンファンクション。 マクロコマンド マクロの使用 Access Web アプリでは使用できません。

設定

マクロコマンド マクロの使用には次の引数があります。

マクロ引数

説明

リクエスト名

開くリクエストの名前。 ドロップダウン リストから名前を選択します。 これは必須の引数です。

マクロを含むデータベースでマクロ ライブラリを実行する場合 マクロの使用 Access は、まずライブラリ データベースでその名前のクエリを検索し、次に現在のデータベースで検索します。

リクエストが開かれるビュー。 フィールドで選択します ビュー意味 テーブル, コンストラクタ, プレビュー , ピボットテーブルまたは ピボットチャート。 デフォルトは テーブル.

注記:ピボットテーブル ビューとピボットグラフ ビューは、Access 2013 以降の Access バージョンでは使用できません。

データモード

リクエストのデータ入力モード。 このオプションは、データシート ビューで開かれたクエリにのみ適用されます。 選択 追加(ユーザーは新しいエントリを追加できますが、既存のエントリを変更することはできません)、 変化(ユーザーは新しいエントリを追加するだけでなく、既存のエントリを変更することもできます) または 読み取り専用(ユーザーはエントリの表示のみが可能です)。 デフォルト値は次のとおりです 変化.

注意事項

引数の場合 ビュー与えられた値 テーブル, Access では、選択クエリ、相互クエリ、結合クエリ、サーバー クエリ、プロパティを使用すると、結果セットが表示されます。 戻り値レコードどれが重要か はい。 プロパティの変更リクエスト、データ定義リクエスト、またはサーバーリクエストの場合 戻り値レコード値が与えられるのは いいえ、リクエストは実行中です。

マクロコマンド マクロの使用これは、ナビゲーション ウィンドウでクエリをダブルクリックするか、ナビゲーション ウィンドウでクエリを右クリックしてビューを選択することと同じです。 マクロを使用する場合、追加のオプションを選択できます。

アドバイス

    クエリをナビゲーション ペインからマクロ デザイナー ウィンドウにドラッグできます。 これにより、マクロコマンドが自動的に作成されます マクロの使用をクリックすると、クエリがデータシート ビューで開きます。

    クエリを開いているときにデザイナーに切り替えると、引数値 データモードが削除されます。 この設定は、ユーザーがデータシート ビューに戻っても効果がありません。

    変更リクエストの実行時に通常表示されるシステム メッセージ (変更リクエストであることと、変更リクエストが影響するレコードの数を通知するメッセージ) を表示したくない場合は、マクロを使用してメッセージをオフにすることができます。 警告を設定する.

マクロを実行するには マクロの使用モジュール内で ビジュアルベーシックアプリケーション (VBA) の場合は、メソッドを使用します マクロの使用物体 DoCmd.

このレッスンの対象となるのは、 SQLクエリのデータベースに VBAアクセス。 VBA でデータベースに対して INSERT、UPDATE、DELETE クエリがどのように実行されるかを見ていき、SELECT クエリから特定の値を取得する方法も学びます。

プログラミングをする人は、 VBAアクセスデータベースを操作しながら SQLサーバー多くの場合、INSERT、UPDATE、単純な SQL SELECT クエリなど、SQL クエリをデータベースに送信するなどの単純で必要なタスクに直面します。 そして、私たちは初心者プログラマーなので、これもできるはずなので、今日はそれをやります。

SQL サーバーからデータを取得するというトピックについては、たとえば「MSSql 2008 からのテキスト ファイルへのデータのアップロード」に関する記事などで、VBA でコードを作成して、このデータを取得するというトピックについてすでに触れました。 Access から Word および Excel テンプレートへのデータのアップロードについてはほとんど触れていませんが、これについては表面的に説明したので、今日はこれについてもう少し詳しく説明したいと思います。

注記! 以下のすべての例は、Access 2003 ADP プロジェクトと MSSql 2008 データベースの使用を考慮しています。ADP プロジェクトが何なのかわからない場合は、「Access ADP プロジェクトの作成および構成方法」の資料で説明しています。

ソースデータの例

テーブル test_table があるとします。これには、年の月の番号と名前が含まれます (クエリは次を使用して実行されます) マネジメントスタジオ)

CREATE TABLE .(NOT NULL, (50) NULL) ON GO

すでに述べたように、MS SQL 2008 で動作するように構成された ADP プロジェクトを使用します。このプロジェクトでは、テスト フォームを作成し、署名付きの開始ボタンを追加しました。 "走る"コードをテストするために必要になります。 すべてのコードをイベント ハンドラーに記述します。 ボタンを押す».

VBA でのデータベースへのクエリ INSERT、UPDATE、DELETE

あまり遅れないようにするために、すぐに始めましょう。テスト テーブルに行を追加する必要があるとします ( コメントされたコード)/

Private Sub start_Click() "クエリ文字列を格納する変数を宣言します Dim sql_query As String "その中に必要なクエリを書き込みます sql_query = "INSERT INTO test_table (id, name_mon) VALUES ("6", " June") " "実行それは、RunSQL sql_query End Sub です。

この場合リクエストは現在のデータベース接続パラメータを使用して実行されます。 データが追加されたかどうかを確認できます。

ご覧のとおり、データが挿入されました。

1行削除するには次のコードを書きます。

Private Sub start_Click() "クエリ文字列を格納する変数を宣言します Dim sql_query As String "その中に削除クエリを書き込みます sql_query = "DELETE test_table WHERE id = 6" "実行します DoCmd.RunSQL sql_query End Sub

確認すると、目的の行が削除されていることがわかります。

データを更新するには、更新リクエストを sql_query 変数に書き込みます。意味が明確であれば幸いです。

VBA でのデータベースへの SELECT クエリ

ここでは、他の SQL 構造よりも少し興味深い点があります。

まず、テーブルからすべてのデータを取得する必要があるとします。たとえば、それを処理してメッセージに表示します。もちろん、他の目的に使用することもできます。このために次のように記述します。コード

Private Sub start_Click() "変数を宣言します"データベースからのレコードのセットに対して Dim RS As ADODB.Recordset "クエリ文字列 Dim sql_query As String "メッセージ内の最終データを表示するための文字列 Dim str As String "新しいオブジェクトを作成しますrecords set RS = New ADODB .Recordset "クエリ行 sql_query = "SELECT id, name_mon FROM test_table" "現在のプロジェクト接続設定を使用してクエリを実行します。 RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "レコードをループしますが、 (RS.EOF) "変数を入力してメッセージを表示します。 str = str & RS.Fields("id") & "-" & RS.Fields("name_mon") & vbnewline "次のレコードに移動 RS.MoveNext Wend "メッセージを出力します msgbox str End Sub

ここでは、すでに VBA Access ループを使用して、レコードセット内のすべての値を反復処理しています。

しかし、多くの場合、一連のレコードからすべての値を取得する必要はなく、コードによって月の名前など、1 つの値だけを取得する必要があります。 これを行うには、ループを使用すると何らかのコストがかかるため、値を 1 つだけ返してアクセスするクエリを作成するだけで済みます。たとえば、コード 5 を使用して月の名前を取得します。

Private Sub start_Click() "変数の宣言" データベースからのレコードのセットの場合 Dim RS As ADODB.Recordset "クエリ文字列 Dim sql_query As String "最終値を表示する文字列 Dim str As String "レコード セット RS の新しいオブジェクトを作成= New ADODB.Recordset "クエリ行 sql_query = "SELECT name_mon FROM test_table WHERE id = 5" "現在のプロジェクト接続設定を使用してクエリを実行します RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "値 str = RS を取得します。フィールド(0) msg​​box str End Sub

普遍性のために、ここではすでにセル名ではなく、そのインデックスによって対処しました。 0、これは最初の値です。 レコードセット、最終的に値を取得しました "5月".

ご覧のとおり、すべては非常にシンプルです。 頻繁にデータベースから特定の値を取得する必要がある場合 ( 最後の例のように) の場合は、すべてのコードを 1 つの入力パラメーター (月コード ( 私たちの例を考えてみると) そして、この値を表示する必要がある場合は、必要なパラメータを指定して必要な関数を呼び出すだけです。これにより、VBA コードが大幅に削減され、プログラムの認識が向上します。

今日はここまでです。 幸運を!

やあ、SQL ステートメントを VBA (または 少なくとも書き出してください)が、返されたデータを取得する方法がわかりません。

かなり定期的なパラメータを実行するクエリに基づいたいくつかのフォーム (グラフ フォーム) があり、時間枠 (月ごとの売上トップ 10 のようなもの) を変更するだけです。 次に、グラフオブジェクトを自動的に渡すプロシージャを用意します。 PowerPoint プレゼンテーション。 したがって、これらのクエリはすべて事前に構築されており (63 など)、それに一致するフォーム ダイアグラムがあり (ええ... 63... それは悪いことだとわかっています)、これらすべては「オープン/クローズ」で作成されます。次のイベントにつながるイベント (ハッキングまたはドミノ、お好みでどうぞ) になるための私の最善の試みのようなものです。

そのため、最終的には VBA ですべてを実行できるように、VBA で SQL ステートメントを使用する方法を学ぼうとしています (形状図をすべて保存する必要があるかもしれませんが、明らかに理解が欠けているためわかりません)。

それでは、冒頭で私が尋ねた質問以外に、誰がアドバイスできるでしょうか? ありがとう

6 件の回答

10

これは少し古いので、このトピックに関する本を入手するとよいでしょう。 ただし、ここにはリソースへの大量のアクセス、いくつかのチュートリアルや例もあります。 でも基本的には…

Dim dbs As Database Dim rs As Recordset Dim strSQL As String Set dbs = CurrentDb strSQL = "ここにクエリを設定します Set rs = dbs.OpenRecordset(strSQL) If Not (rs.EOF And rs.BOF) then rs.MoveFirst "を使用して結果を取得しますrs.Fields() Else "結果を使用

コメントの裏側: Post クラスを見てください。 これには、クエリから返される列であるフィールドと呼ばれるコレクションが含まれています。 回路がわからないと言うのは難しいですが、次のようなものです...

Rs.MoveFirst Do While Not rs.EOF "rs("SomeFieldName") のようなことを行います rs.MoveNext Loop

先ほども言いましたが、このトピックに関する本を手に入れるのが最善の策です。本にはたくさんの例が載っています。

パラメーター化された QueryDef を使用し、VBA から呼び出します。
クエリは設計が容易で、テストも容易で、VBA またはフォームを使用して簡単にアクセスできます。

dim qd as querydef set qd = currentdb.querydefs!myquerydef qd.parameters!parm1=val1

または qd.execute

Dim rs をレコードセットとして設定 rs = qd.openrecordset()

以下は、リファクタリングを検討してインラインで実行すると、コード内のどこでも再利用できる関数です。

したがって、SQLステートメントの文字列をconstまたは構築し、サニタイズしたNON SQL INJECT文字列を引数としてポップします:)

StrSQL = "SELECT * FROM Customer WHERE ID = " & EnsureParamIsNotSQLInjection(customerID)

次に、データ/レコードのセットを取得/命令を実行する必要がある場所から /sub 関数を呼び出します。 複数のデータ アクセス関数/サブルーチンを作成することで、単純に UPDATE ステートメントを実行したり、単一の値を取得したり、完全なレコードを取得したりできます。

ここで重要なのは、これらの関数をすべて 1 か所に配置し、どこでも使用できるようにすることです。 以下は VBScript の例です。

Sub DoStuff(strSQL) Set adoCon = Server.CreateObject("ADODB.Connection") strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("db\Database.mdb") "strConnString = "DRIVER=(Microsoft Access ドライバー (*.mdb)); DBQ=" & Server.MapPath("db\Database.mdb") adoCon.Open strConnString Set rsMain = Server.CreateObject("ADODB.Recordset") rsMain.Open strSQL, adoCon Do While NOT rsMain.EOF customerName = rsMain(" CustomerName") "愚かな例 RsMain.MoveNext Loop rsMain.Close Set adoCon = Nothing End Sub

これを行うもう 1 つの方法は、誰も言及していないようですが、グラフを 1 つの保存された QueryDef に関連付け、実行時に QueryDef を上書きすることです。 さて、ほとんどのコンテキストでは、保存された QueryDefs を変更することはお勧めしません。これは、前面の肥大化を引き起こすだけでなく、通常は必要ですらないからです (保存された QueryDefs を使用するほとんどのコンテキストでは、保存された QueryDefs は、使用されたコンテキストで何らかの方法でフィルタリングできます。たとえば、 RecordSource フォームの 1 つとして、引数を 1 つ DoCmd.OpenForm に渡すだけです)。

SQL 駆動グラフは実行時に変更できないため、グラフは異なります。

パラメータを提案するものもありましたが、パラメータを含む SQL 文字列を使用するグラフが含まれるフォームを開くと、デフォルトのパラメータ ダイアログがポップアップ表示されます。 これを回避する 1 つの方法は、ダイアログ フォームを使用して条件を収集し、ダイアログ ビュー内のコントロールへの参照をパラメータなどとして設定することです。

パラメータ!! 長さ;

フォーム リンクを使用する場合は、そうすることが重要です。Access 2002 以降、コントロールが Null の場合、Jet Expression サービスは常にフォーム リンクを正しく処理するとは限りません。 これらをパラメータとして定義すると、この問題は解決されます (Access XP より前には存在しませんでした)。

グラフの QueryDef を書き直す必要がある状況の 1 つは、ユーザーが TOP N SQL ステートメントで N を選択できるようにする場合です。 つまり、TOP 5、TOP 10、または TOP 20 を選択できるようにしたい場合は、N をパラメーター化できないため、保存されている QueryDef を変更する必要があります。

このアクセスにより、SQL クエリ文字列だけでなく、フォーム、レポートなどのプロパティ、関数パラメータなどの値として機能する文字列もプログラムで作成できます。これらの文字列も SQL 構文に準拠している必要があります。 同時に、そのような行に含まれる定数も SQL ルールに従ってフォーマットする必要があることを覚えておく必要があります。

  • 数値では小数点区切り文字は小数点である必要があります。
  • 文字列は引用符またはアポストロフィで囲む必要があります (引用符またはアポストロフィはそれぞれ文字列内で二重になります)。
  • 日付はハッシュ マークで囲み、区切り文字としてスラッシュを使用して米国形式 (mm/dd/yyyy) で記述する必要があります。

    これに違反すると、次のような影響が生じる可能性があります。

  • ドットの代わりにカンマが付いている 10.5 のような数値は、10 と 5 という 2 つの数値のリストとして認識され、フィールド数に何らかの矛盾が生じます。
  • 引用符とアポストロフィのない Vasya のような文字列は、フィールド名 (そのようなフィールドが存在する場合) として認識されるか、すぐに要求されるパラメーターの名前として認識されます。
  • ハッシュ マークのない 1/2/2010 または 1-2-2010 のような日付は、算術式 (それぞれ除算と減算) として扱われます。
  • 1.2.2010 のような日付は、小数点以下 2 桁の小数として解釈され、エラーが発生します。
  • ハッシュ マークが付いているが米国形式ではない日付は、日付として認識されますが、異なるものになります (日と月が並べ替えられます)。

    以下の各セクションには、プログラムで生成したときに生成される SQL 文字列の例と、それを作成する VBA コードが続きます。 以下は非常に役立つ推奨事項です。

    1. 数字の使用

    SELECT * FROM テーブル WHERE (((テーブル .数量)= 12 .197 ));
    VBA v1

    Dim q As Single q = 12 .197 strSQL = "SELECT * " _ & "FROM テーブル " _ & "WHERE (((Table.Quanty)=" & q & "));"
    VBA v2

    Dim q As String q = "12,197" strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)=" & Str (q) & "));"
    注記:

  • VBA v1- 整数の場合。 小数の場合は次のようになります 特別な場合、システム区切り文字がピリオドの場合のみ。
  • VBA v2- より正しいオプションです。 従来のプログラミングでは、文字列と文字列を連結できるのは文字列だけですが、VBA v1 では暗黙的な型変換が使用されますが、整数のこの方法については苦情はありませんでした。 (システム区切り文字がカンマの場合の例です。)
  • 場合によっては CStr() 関数も変換に使用されますが、常に適用できるわけではありません。 数値を文字列として返します。数値はシステム区切り文字を使用して書き込まれますが、SQL は区切り文字としてピリオドのみを受け入れます。
  • 注意!非典型的なシステム区切り文字を使用する場合、上記の例は機能しない可能性があります。その場合は、プログラムでシステム区切り文字をドットに置き換える必要があります。 以下はシステム区切り文字を返す関数です。
    Function GetDecimalSeparator() As String GetDecimalSeparator = Format ( 0 #、「。」 ) 関数の終了 この場合、一部の標準的な Access アクションが機能しない可能性があることにも注意してください。

    2. 文字列の使用

    SELECT * FROM テーブル WHERE (((テーブル .Name)="すべて" ));
    VBA v1

    Dim q As String q = "All" strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)=" "" & DoubleQuote(q) & "" "));"
    VBA v2

    Dim q As String q = "All" strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.Quanty)="" & DoubleApostrophe(q) & "" ));"
    注記:

  • VBA v1: DoubleQuote() - 倍増する関数 引用.

    例:
    サンプリング条件:
    a"a" の SQL:
    WHEREフィールド= 「あ」「VBA:
    strWhere = " WHEREフィールド=""" & "「」「」" & """ "

  • VBA v2:: DoubleApostrophe() - 2 倍にする関数 アポストロフィ.

    例:
    サンプリング条件:
    a"a" の SQL:
    WHEREフィールド= 「あ」「VBA:
    strWhere = " WHEREフィールド=" & "「」「」" & "" "

  • 上記の DoubleQuote 関数と DoubleApostrophe 関数は、Access の組み込み関数ではなく、ユーザー定義関数であり、その実装はプログラマの裁量に任されています。 特に、Access バージョン 2000 以降では、この目的のために組み込みの Replace 関数を使用でき、97 以前ではこの関数を使用できます。

    Public Function Replace97(StrMain As String , StrFind As String , StrZam As String ) As String On Error GoTo err Dim pos As Long If StrFind = "" then GoTo err If StrMain = "" then Replace97 = StrZam: Exit Function Do until InStr( 1 、StrMain、StrFind) = 0 pos = InStr( 1 、StrMain、StrFind) StrMain = ミッド (StrMain、 1 、位置 - 1 ) & StrZam & mid (StrMain, pos + Len(StrFind), Len(StrMain)) ループ Replace97 = StrMain 終了関数 err: Replace97 = StrMain 終了関数
    3. 日付の使用

    SELECT * FROM テーブル WHERE (((テーブル .TimeOpen)=# 3 /31 /2003 11 :17 :19 #));
    VBA

    Dim q As Date q = Now strSQL = "SELECT * " _ & "FROM Table " _ & "WHERE (((Table.TimeOpen)=#" & Format (q, "mm\/dd\/yy hh\:mm \:ss" ) & "#));"
    注記:

  • Microsoft JET SQL は、米国形式の日付を処理します。 上記の月/日/年の形式で正確に入力します。
  • # 文字 (日付時刻定数全体を囲みます) と \ (これにより、/ と : がロケール設定によって置き換えられるのを防ぐことができます。これは、Format 関数が行う傾向があり、これによって置き換えられないようにするためです) 適切な操作 SQL コマンド)。
  • 日付/時刻を保存する方法については、こちらを読むことをお勧めします。
  • 注意! Integer (または Long) への日付変換は使用しないでください。 Access と SQL Server では、異なる数値が同じ日付に対応するため、比較すると予期しない結果が得られることがあります。

    次のような文字列を作成すると、 SQLコマンド実行のために送信するとエラーが発生する可能性があります。 この場合、この文字列をデバッグ ウィンドウに出力し、目で確認してください。 おそらく、エラーがすぐに目に留まるでしょう。 機能しない場合は、クエリ デザイナーで新しいクエリを作成し、SQL モードに切り替え、そこにクエリ テキストを挿入して実行します。 エラーがある場合は、より明確に表示されます。