Excel 2013 で VBA を実行した際に GDI のリークが発生する場合がある

現象
Microsoft Excel 2013 で、sheets.Activate、DoEvents を含むループ処理を実行した際に GDI オブジェクトが適切に解放されず、GDI オブジェクト数が増加します。このため、かなりの数のループ処理を行った場合に、GDI オブジェクトの制限値 (既定で 10000) に達した際に、Excel 2013 が応答不可となります。
原因
解決方法
回避策
次のいずれかの方法で回避します。
  • 該当のループ処理実行前に Application.WindowState プロパティに xlMinimized を設定し、画面を最小化します。
  • 該当のループ処理実行前に Application.Visible プロパティに False を設定し、画面を非表示にします。



状況
マイクロソフトでは、この問題について現在調査中です。詳細については、わかりしだいこの資料に掲載する予定です。
詳細
問題の再現手順
  1. Excel 2013 を起動します。
  2. キーボード上で [Alt] + [F11] を押し、Visual Basic Editor を起動します。
  3. ThisWorkbook 内に、以下のコードを追加します。
    ++

    Sub test()

    Dim i As Integer

    For i = 1 To 10000

    Application.ActiveCell.Value = i

    Sheets(i Mod 2 + 1).Activate

    DoEvents

    Next i

    End Sub

    ++
  4. “test()” を選択後、キーボード上で [F5] キーを押します。
結果

GDI オブジェクトの値が大きく増加し、制限値に達すると 、Excel 2013 が応答不可状態になります。


GDI オブジェクト値の確認方法

Windows 8/8.1 の場合
  1. タスク バーを右クリックし、[タスク マネージャー] をクリックします。
  2. [タスク マネージャー] が起動するため、[詳細] タブを選択します。
  3. [名前] を右クリックし、[列の選択] をクリックします。
  4. [列の選択] 画面が表示されるため、[GDI オブジェクト] チェックボックスをオンにします。

Windows 7/Windows Vista の場合
  1. タスク バーを右クリックし、[タスク マネージャー] をクリックします。
  2. [Windows タスク マネージャー] が起動するため、[プロセス] タブを選択します。
  3. [表示]-[列の選択] をクリックします。
  4. [プロセス ページの列の選択] 画面が表示されるため、[GDI オブジェクト] チェックボックスをオンにします。


関連情報
関連情報を参照するには、以下のリンクをクリックしてください。

注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
Eigenschappen

Artikel-id: 2962521 - Laatst bijgewerkt: 09/29/2016 11:37:00 - Revisie: 3.0

Microsoft Excel 2013

  • kbdevelopment KB2962521
Feedback