文書番号: 319998 - 最終更新日: 2007年2月12日 - リビジョン: 3.3

[BUG] ActiveX データ オブジェクト (ADO) を使用して、開いている Excel ワークシートを照会するときメモリ リークに発生します。

目次

すべて展開する | すべて折りたたむ

現象

Microsoft ActiveX データ オブジェクト (ADO) を取得するときに、メモリ リーク、Excel で開いている Excel ワークシートからのレコードセットが Excel プロセスで発生します。 反復クエリがエラーを生成や応答を停止する原因のメモリが不足する最終的にあります。

解決方法

ADO クエリで使用されるメモリを終了して、ADO オブジェクトを解放回復できません。 メモリを解放する限りは、Excel を終了します。

ファイルを Excel で開いているいないときにだけは、Excel ワークシートにクエリを可能であれば。

ワークシートを (たとえば、上、継続的にワークシートの値の動的再計算を許可する) 開いたままにする必要がある場合、次の方法のいずれかを問題を回避する使用します。

方法 1

  • Excel データを新しいワークシートにエクスポートするのにには、Jet OLE DB プロバイダーの SELECT INTO 構文を使用します。については、SELECT INTO 構文を使用してデータをエクスポートする方法についてをクリックして以下「サポート技術情報」(Microsoft Knowledge Base) 資料を参照。
    295646? (http://support.microsoft.com/kb/295646/ ) ADO を使用して ADO データ ソースから Excel にデータを転送する方法

方法 2

  • プログラムで開かれている Excel ファイルを新しい名前でを保存するのに Excel オブジェクト モデルで、 ブック のオブジェクトの SaveCopyAs メソッドを使用します。 ADO アプリケーションから新しい名前で以前に保存したファイルのコピーを照会することができます。

状況

マイクロソフトではこれが、この資料の冒頭に記載されているマイクロソフト製品のバグとして認識しています。

詳細

動作を再現する手順

  1. 作成するか、行と列のデータを ADO を使用して照会できる Excel のワークシートを探します。 たとえば、Excel を使用して、サンプルの Northwind データベースから、[得意先] テーブルをインポートすることができます。
  2. Visual Basic 6. 0 で標準 EXE プロジェクトを作成します。 既定では、Form1 が作成されます。 ADO への参照を設定します。
  3. モジュールをプロジェクトに追加してアプリケーション プログラミング インターフェイス (API) 呼び出しパフォーマンス モニター カウンターを使用してメモリ使用量を確認するための次の宣言を入力、:
    Option Explicit
    
    'Performance monitor functions for Visual Basic from PDH.DLL
    Declare Function PdhVbOpenQuery Lib "pdh.dll" _
        (ByRef QueryHandle As Long) As Long
    Declare Function PdhCloseQuery Lib "pdh.dll" _
        (ByVal QueryHandle As Long) As Long
    Declare Function PdhVbAddCounter Lib "pdh.dll" _
        (ByVal QueryHandle As Long, ByVal CounterPath As String, _
        ByRef CounterHandle As Long) As Long
    Declare Function PdhRemoveCounter Lib "pdh.dll" _
        (ByVal CounterHandle As Long) As Long
    Declare Function PdhCollectQueryData Lib "pdh.dll" _
        (ByVal QueryHandle As Long) As Long
    Declare Function PdhVbGetDoubleCounterValue Lib "pdh.dll" _
        (ByVal CounterHandle As Long, ByRef CounterStatus As Long) As Double
    Declare Function PdhVbIsGoodStatus Lib "pdh.dll" _
        (ByVal StatusValue As Long) As Long
    Declare Function PdhVbGetOneCounterPath Lib "pdh.dll" _
        (ByVal PathString As String, ByVal PathLength As Long, _
        ByVal DetailLevel As Long, ByVal CaptionString As String) As Long
    Declare Function PdhVbCreateCounterPathList Lib "pdh.dll" _
        (ByVal DetailLevel As Long, ByVal CaptionString As String) As Long
    Declare Function PdhVbGetCounterPathFromList Lib "pdh.dll" _
        (ByVal Index As Long, ByVal Buffer As String, _
        ByVal BufferLength As Long) As Long
    Declare Function PdhVbGetCounterPathElements Lib "pdh.dll" _
        (ByVal PathString As String, ByVal MachineName As String, _
        ByVal ObjectName As String, ByVal InstanceName As String, _
        ByVal ParentInstance As String, ByVal CounterName As String, _
        ByVal BufferSize As Long) As Long
    					
  4. コマンド ボタンを Form1 に追加し、次のコードを Click イベントに挿入するには。 このコードは繰り返し Excel ファイルを照会し、(イミディエイト) ウィンドウでメモリ使用量を表示します
        Dim cn As ADODB.Connection
        Dim rs As ADODB.Recordset
        Dim i As Integer
        Dim max As Integer
        Dim r As Long
        Dim hPDHQuery As Long            'Handle to performance monitor query
        Dim hPDHCounter As Long          'Handle to performance monitor counter
        Dim strCounterPath               'Path to performance monitor counter
        Dim lngCounterStatus As Long     'Status of counter when checked
        Dim dblPrivateBytes As Double    'Value of counter when checked
        Set cn = New ADODB.Connection
    'Jet connection string.
        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & App.Path & "\test.xls;" & _
            "Extended Properties=Excel 8.0"
        'Initialize PDH query object.
        r = PdhVbOpenQuery(hPDHQuery)
        'Initialize counter.
    'Edit the value of the "strCounterPath" variable.
        strCounterPath = "\\<computername>\Process(Excel)\Private Bytes"
        r = PdhVbAddCounter(hPDHQuery, strCounterPath, hPDHCounter)
        'Gather data.
        r = PdhCollectQueryData(hPDHQuery)
        'Get counter value and process data.
        dblPrivateBytes = PdhVbGetDoubleCounterValue(hPDHCounter, _
            lngCounterStatus)
        If PdhVbIsGoodStatus(lngCounterStatus) Then
            Debug.Print "Memory used by Excel: " & CLng(dblPrivateBytes)
        Else
            Debug.Print "Invalid data."
        End If
    'Edit the value of the "max" variable.
        max = 100
        ReDim alngPrivateBytes(max)
        For i = 1 To max
            Set rs = New ADODB.Recordset
            rs.CursorLocation = adUseClient
    'Edit the query to reflect the name of the worksheet.
            rs.Open "SELECT * FROM [Customers$]", cn
            Do Until rs.EOF
                rs.MoveNext
            Loop
            rs.Close
            Set rs = Nothing
            r = PdhCollectQueryData(hPDHQuery)
            'Get counter value and process data.
            dblPrivateBytes = PdhVbGetDoubleCounterValue(hPDHCounter, _
                lngCounterStatus)
            'Process data.
            If lngCounterStatus = 0 Then
                Debug.Print "Memory used by Excel: " & CLng(dblPrivateBytes)
                alngPrivateBytes(i) = CLng(dblPrivateBytes)
            Else
                Debug.Print "Invalid data."
                alngPrivateBytes(0) = 0
            End If
        Next
        cn.Close
        Set cn = Nothing
        Debug.Print "Total increase for " & max & " iterations: " & _
            (CStr(alngPrivateBytes(max) - alngPrivateBytes(0)))
        Debug.Print "Average increase per iteration: " & _
            (CStr((alngPrivateBytes(max) - alngPrivateBytes(0))) / max)
        'Clean up.
        r = PdhRemoveCounter(hPDHCounter)
        r = PdhCloseQuery(hPDHQuery)
    					
  5. コードでの次変更を行います。

    • Jet 接続文字列を Excel のテスト ファイルの場所を反映を編集します。
      メモ: 次のようにコメントは、: ' 接続文字列を Jet。
    • ローカルのワークステーション名を使用するには、"strCounterPath"変数の値を編集します。
      メモ: 次のようにコメントは、: '、"strCounterPath"の変数の値を編集します。
    • テスト データ ファイル内のワークシートの名前を反映するクエリを編集します。
      メモ: 次のようにコメントは、: '、ワークシートの名前を反映するクエリを編集します。
    • 繰り返しの必要な数の「最大」変数の値を編集します。
      メモ: 次のようにコメントは、: '「最大」、変数の値を編集します。
  6. Excel アプリケーションを実行して、テスト Excel 開きますファイル。
  7. Visual Basic アプリケーションの実行。 ADO オブジェクトを閉じてされリリースされた場合でも、Excel プロセスで使用されるメモリ内で一定が増加があることを確認します。

関連情報

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください:
257819? (http://support.microsoft.com/kb/257819/ ) Visual Basic または VBA からのデータを Excel で ADO を使用する方法
Visual Basic からパフォーマンス カウンターの使用の追加についてをクリックして次「サポート技術情報」(Microsoft Knowledge Base) 資料を参照。
296526? (http://support.microsoft.com/kb/296526/ ) 情報: PDH Visual Basic から API を使用してパフォーマンス データの収集
Excel にエクスポート オプションの追加についてはをクリック資料以下の記事の「サポート技術情報」(Microsoft Knowledge Base) を表示します。
247412? (http://support.microsoft.com/kb/247412/EN-US/ ) Visual Basic から Excel にデータを転送するための情報: 方法
246335? (http://support.microsoft.com/kb/246335/ ) ADO レコードセットからオートメーションで Excel にデータを転送する方法

この資料は以下の製品について記述したものです。
  • Microsoft Excel 2000 Standard Edition
  • Microsoft OLE DB Provider for Jet 4.0
  • Microsoft Excel 97 Standard Edition
  • Microsoft Excel 2002 Standard Edition
キーワード:?
kbmt kbado kbmemory kbperformance kbprogramming kbbug kbiisam kbjet kbnofix kbprovider KB319998 KbMtja
機械翻訳機械翻訳
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:319998? (http://support.microsoft.com/kb/319998/en-us/ )
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
 

サポート技術情報の翻訳

 

Related Support Centers