0

私は実際にこの小さな機能を想定どおりに動作させています:

Function createAttached(strTable As String, strPath As String, strBaseTable As String) As Boolean
    On Error GoTo CreateAttachedError

    Dim tdf As TableDef
    Dim strConnect As String
    Dim fRetval As Boolean
    Dim myDB As Database

    DoCmd.SetWarnings False

    Set myDB = CurrentDb
    Set tdf = myDB.CreateTableDef(strTable)

    With tdf
        .Connect = ";DATABASE=" & strPath
        .SourceTableName = strBaseTable
    End With

    myDB.TableDefs.Append tdf
    myDB.TableDefs.Refresh

    fRetval = True

    DoCmd.SetWarnings True

CreateAttachedExit:
    createAttached = fRetval
    Exit Function

CreateAttachedError:
    If Err = 3110 Then
        Resume CreateAttachedExit
    Else
        If Err = 3011 Then
            Resume Next
        Else
            If Err = 3012 Then
                Set tdf = myDB.TableDefs(strTable)
                tdf.Connect = ";DATABASE=" & strPath
                tdf.RefreshLink
                fRetval = True
                GoTo CreateAttachedExit
            End If
        End If
    End If
End Function

このコードは問題なく動作します。別のデータベースからテーブルへのリンクを追加したいだけ何度でも関数を呼び出すことができます。ただし、同じデータベースからインポートするテーブルが約 30 あり、このスクリプトは呼び出すたびに最初から再起動します。データベースは別のサーバーにあるため、30 個のテーブルをリンクするのに約 1 分かかります。

同じデータベースから複数のテーブルをリンクする必要がある場合に、その関数をより速く動作させるためにできることはありますか? 1 つではなく、複数の strTable と strBaseTable をパラメーター (おそらく配列?) で使用したいのですが、これを行う方法がわかりません。

ありがとうございました。

4

2 に答える 2

1

外部データベースの tabledefs コレクションをループするか、接続するすべてのテーブルと外部データベースを一覧表示するテーブルのテーブルを使用できます。

Dim db As Database
Dim ThisDb As Database

Set ThisDb = CurrentDB
sDb = "z:\docs\test.accdb"
Set db = OpenDatabase(sDb)

For Each tdf In db.TableDefs
    ''Connect
    If Left(tdf.Name, 4) <> "MSys" Then
        If IsNull(DlookUp("Name","MsysObjects","Type In (1,4,5,6) And Name='" _
           & tdf.Name & "'")) Then
           DoCmd.TransferDatabase acLink, "Microsoft Access", _
             sDb, acTable, tdf.Name, tdf.Name
        Else
          If ThisDb.TableDefs(tdf.Name).connect <> vbNullString Then
             ThisDb.TableDefs(tdf.Name).connect = ";DATABASE=" & sDb
             ThisDb.TableDefs(tdf.Name).RefreshLink
          End If
        End If
    End If
Next

テーブルのテーブルは、テーブルからデータベースを選択 (個別の選択) し、そのレコードセットをループして、さらに選択 (select table where database ...) でテーブルをアタッチできるという点で、同様の方法で機能します。

于 2012-11-07T13:39:51.527 に答える
0

また、別のサブでデータベース接続をセットアップし、データベースの切断をセットアップすることもできます (ここで欠落している可能性があります)。

したがって、このスクリプトを通常どおり呼び出すコード (ループがあると仮定します) は次のようになります。

call function/sub that opens the connection to DATABASE= strPath

your loop that calls Function createAttached

call function/sub that closes the connection to DATABASE= strPath

そうすれば、外部データベースへの繰り返しの (通常は時間のかかる) 接続を回避できます。

于 2012-11-07T13:40:24.367 に答える