1

フォームのボタンから実行しようとしている vba スクリプトに少し問題があります。

リンクされた MDB ファイルを介して、特定の他のクエリが機能するのに役立つ一連のテーブル作成クエリを作成しました。ユーザーに個々の Make Table クエリを 1 つずつ再実行させるのではなく、( DoCmd.RunSQLを使用して) クエリを VBA スクリプトに入れ、そのスクリプトをフォームのボタンに割り当てました。

私が使用しているデータ ソースには、データのファイル名とファイル日付を含むファイル情報テーブルもあります。

ユーザーがボタンをクリックしたときに、テーブルの作成クエリの文字列が実行されたときにどのデータ ソースが使用されたかをユーザーに知らせたいと思います。そうすれば、スクリプトが実行されたデータがわかります。

これに対する私のアプローチは、ファイル情報テーブルを使用して最終的なテーブル作成クエリを作成し、ファイル名とファイル日付を独自のテーブルに入れることでした。

次に、これらのフィールドをフォームに追加し、この最後の Make Table クエリのDoCmd.RunSQLをボタンの VBA スクリプトの最後に追加します。すべてのテーブルの作成が実行されると、ファイル情報フィールドとファイル日付フィールドがフォームに表示/更新され、スクリプトが最後に実行されたときに使用されたデータ ファイルがユーザーに通知されます。

このコードは次のとおりです (簡潔にするために、FileInfo の前に実行されるすべてのテーブル作成スクリプトを偽の「AllOtherMakeTables」文字列として要約しました)。

Private Sub Command0_Click()

On Error GoTo Err_Command0_Click

DoCmd.SetWarnings False

Dim AllOtherMakeTables As String
Dim FileInfoStamp As String

AllOtherMakeTables = " SELECT SomeField INTO AnotherTable" _
& " FROM SomeTable" _

FileInfoStamp = " SELECT FileInfo.FileName, FileInfo.FileDate INTO FileInfoStamp" _
& " FROM FileInfo;" _

DoCmd.RunSQL AllOtherMakeTables
DoCmd.RunSQL FileInfoStamp

DoCmd.SetWarnings True

Exit_Command0_Click:
Exit Sub

Err_Command0_Click:
    MsgBox Err.Description
    Resume Exit_Command0_Click

End Sub

上記のスクリプトを使用してボタンをクリックすると、次のエラー メッセージが表示されます。

データベース エンジンは、テーブル 'FileInfoStamp' をロックできませんでした。別のユーザーまたはプロセスによって既に使用されているためです。

フォームに追加したフィールド (FileName と FileDate) は、フォームが開いているときに FileInfoStamp テーブルをロックしているため、スクリプトが FileInfoStamp を再作成しようとすると、テーブルがロックされているため、これを行うことができません。

上記のスクリプトの先頭にDoCmd.Closeを追加し、スクリプトの最後にDoCmd.OpenFormを追加するだけで、これを修正できると思いました (基本的に、[テーブルの作成] コマンドの実行中にフォームを閉じてから再度開きます)。最後にフォーム)。

ただし、フォームを閉じて同じエラー メッセージを表示するだけです。したがって、フォームが「閉じられている」にもかかわらず、フォーム上のフィールドとの接続は何らかの形でアクティブのままであると思います(...?)

これを回避する方法についての支援をいただければ幸いです。ありがとうございました。

4

1 に答える 1

0

FileInfoStamp毎回再作成しないでください。代わりに、次の 2 つの手順を使用してください。

  1. 既存の行を破棄
  2. 新しいデータを追加する
Dim db As DAO.database
Dim FileInfoStamp As String

FileInfoStamp = "INSERT INTO FileInfoStamp(FileName, FileDate)" & vbCrLf & _
    "SELECT fi.FileName, fi.FileDate FROM FileInfo AS fi;"
Debug.Print FileInfoStamp

Set db = CurrentDb
' empty out FileInfoStamp
db.Execute "DELETE FROM FileInfoStamp;", dbFailOnError
' add new data to FileInfoStamp
db.Execute FileInfoStamp, dbFailOnError
Set db = Nothing

から発生した問題に対処するエラー ハンドラを追加しますdbFailOnError

の代わりにDoCmd.RunSQL、DAO データベース.Executeメソッドを他のクエリに使用します。そのアプローチでは、 を使用する動機がなくなりますDoCmd.SetWarnings FalseSetWarnings問題の診断に必要な情報が抑制されるため、オフにすることは賢明ではありません 。

于 2013-03-06T15:53:52.970 に答える