2009-08-13 111 views
1

Accessデータベースのモジュール内で作成されたExcelのインスタンスを使用して一連のExcelスプレッドシートを開こうとしています。ファイルを適切に開くことができます。ただし、実際にExcelを起動するための呼び出しにはかなりの時間がかかり、ファイルを開くにはさらに時間がかかります。ファイルの場所は問題ではありません(ローカルHDDをネットワークドライブとして開くときと同じです)。VBAファイルのオープンが遅い

何がそんなに長くかかっているかを調べるために、私はタイマーをロギングモジュールに追加しました。ファイルを開くには約2m30秒かかりますが、その間にホストアプリケーション(アクセス)はユーザーの入力に完全に反応しません。残りのスクリプトは10秒以内に実行されます。

Set OpenSpreadsheet = Excel.Workbooks.Open(Name, 2, False) 

を次のように私はこの線を中心にDebug.Print方法を使用して、標準Excel.Workbooks.Openコールを使用していますが、それは実行するために、この1ライン分の2分半かかりますと言います。

Excelファイルをすばやく開くためにできることはありますか?

EDIT:UpdateLinksFalseReadOnlyTrueです。他のすべてのオプションはデフォルト値のままです。

+1

ドキュメントを開く方法を示すコードを追加して、+あなたが設定した参照を返信すると、より簡単に返信することができます。 しかし、確かに、10秒を超えるもの。長いです。 –

+0

同意、+ 1 ...メソッドを確認する必要があります。 – Smandoli

+0

私は、私が作っている呼び出しを追加し、1行の実行にかかる時間を記録しました。 –

答えて

3

第1のアイデア:Excelオブジェクトで開く代わりに、ExcelへのODBC接続を備えたジェットドライバを使用できますか?はるかに高速かもしれません。

2番目の考え方:Excelアプリケーションオブジェクトを作成し、ルーチンの初めに一度だけインスタンス化してから、各スプレッドシートに対してExcel.Workbooks.Open()とExcel.ActiveWorkbook.Close()を使用してください。そうすれば、MS Excelアプリケーションを毎回 "再起動"することはありません。

+0

これはうまくいきました - タスクマネージャーに目を留めながらモジュールを実行し、コード内に作成したにもかかわらず3つのExcelインスタンスが作成されました。 –

0

@ BradCの推奨事項の2番目を引き出すには、複数の手順でExcelを使用する必要がある場合は、自己初期化グローバル関数を作成します。私は常にOfficeアプリケーションを自動化するためにレイトバインディングを使用します。

Public Function Excel(Optional bolCleanup As Boolean = False) As Object 
    Static objExcel As Object 

    If bolCleanup Then 
     If Not objExcel Is Nothing Then 
      Set objExcel = Nothing 
      Exit Function 
     End If 
    End If 
    If objExcel Is Nothing Then 
     Set objExcel = CreateObject("Excel.Application") 
    End If 
    Set Excel = objExcel 
    End Function 

その後、あなたはそれを初期化することなく、コードでそれを使用することができ、かつ単一のインスタンスは、Excelを使用する必要がある任意のコードが利用可能なままになります。

アプリをシャットダウンすると、Excel(True)を呼び出してクリーンアップします。

私はこれをOutlookとWordで常に行います。しかし、この種の処理に親切なことではないPDF Creatorなど、COM Creatorがうまく動作しないCOMアプリケーションがいくつかあります(無限ループで終了してしまいます。この方法でインスタンスを破壊する)。

関連する問題