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 オブジェクト] チェックボックスをオンにします。


関連情報

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

プロパティ

文書番号:2962521 - 最終更新日: 2016/09/29 - リビジョン: 1

フィードバック