0

Access 2007 VBA データベースのメンテナンスを依頼されました。

同じフォルダー内の別の Access データベースにリンクされたテーブルがあります。そのデータベースへのリンクがハードコーディングされていたため、ユーザーがフォルダーを新しいフォルダーにコピーすると、元のフォルダーでリンクされたデータベースを使用しようとしました。彼らは、そのシナリオで間違ったリンクされたデータベースを使用する危険を排除するように私に依頼しました.

データベースを開いたときに実行されるコードを追加して、独自のフォルダー内のデータベースへのリンクをリセットします。リンクされたデータベースが存在しないか、名前が変更されている場合、ユーザーは正しいデータベースを参照するように求められます。ここまでは順調ですね。

しかし、ユーザーがそのダイアログをキャンセルした場合、間違ったデータベースに接続したままにしたくありません。テーブルが存在しない場合でも、リンクされたテーブル定義の Connect プロパティを「正しい」パスに設定したいと考えています。その後、誤って間違ったデータベースを使用するのではなく、リンクされたデータベースにコピーするまで、リンクされたテーブルがそこにないというエラーがユーザーに表示されます。

Connect プロパティを存在しないデータベースに設定したときに発生するエラーを回避するために Resume Next を使用すると、変更が反映されず、間違ったデータベースに接続されたままになります。そのため、現時点では、それが発生したときにデータベースを閉じています (リンクされたデータベースが見つからないことをユーザーに警告した後)。間違ったデータベースを使用しないという点では安全ですが、理想的なユーザー エクスペリエンスではないと思います。

では、Tabledef の Connect プロパティを存在しないデータベースに設定することは可能ですか?

ありがとう、

グレッグ

4

2 に答える 2

1

Tabledef の Connect プロパティを存在しないデータベースに設定することは可能ですか?

私はそうは思わない。最初にすべてのリンクされたテーブルを削除してから、接続するデータベースがない場合は、そのことを示すエラーを表示することをお勧めします。

テーブルを再リンクするには、リンクするすべてのテーブルのリストを保持するフロントエンド ファイルにローカル テーブルが必要です。次に、リンクがすべて削除されていると仮定して、テーブルを再リンクする必要があるたびに、そのリストをループする必要があります。

于 2013-11-15T02:33:32.537 に答える
0

テーブル リンクを更新して無効にするには、次の操作が必要です。

  • バックエンド データベースの一時コピー (または、空のテーブルを含む「スケルトン」バックエンド データベースの一時コピー) を作成します。
  • 一時データベースを指すようにテーブル リンクを更新してから、
  • 一時データベースを削除します。

たとえば、次のコードを実行すると

Option Compare Database
Option Explicit

Sub MakeBadLink()
    Const linkedTableName = "myLinkedTable"  ' test value
    Dim cdb As DAO.Database, tbd As DAO.TableDef
    Dim tempFolder As String, linkedDb As String, tempDb As String
    Dim fso As FileSystemObject
    Set cdb = CurrentDb
    linkedDb = Mid(cdb.TableDefs(linkedTableName).Connect, 11)  ' remove ";DATABASE=" prefix
    Set fso = New FileSystemObject
    tempFolder = fso.GetSpecialFolder(TemporaryFolder) & "\"
    tempDb = tempFolder & fso.GetFileName(linkedDb)
    fso.CopyFile linkedDb, tempDb, True
    Set tbd = cdb.TableDefs(linkedTableName)
    tbd.Connect = ";DATABASE=" & tempDb
    tbd.RefreshLink
    Set tbd = Nothing
    Set cdb = Nothing
    fso.DeleteFile tempDb
    Set fso = Nothing
End Sub

その後 [myLinkedTable] を使用しようとすると、エラーが発生します

ファイル「C:\Users\Gord\AppData\Local\Temp\myDb.accdb」が見つかりませんでした。

于 2013-11-15T11:52:34.763 に答える