[[20180907112827]] 『マクロ実行中、マクロの動作が止まった様になる』(mcx32503) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロ実行中、マクロの動作が止まった様になる』(mcx32503)

Excel 2016のマクロ実行についての質問です。

Excel2016に変えてからマクロの実行中にマクロの動作が止まった様に遅くなることがあります。

マクロの動作が遅くなった時、マクロを実行した状態で画面上のExcelシートをクリックすると再び動作し始める様な気配もあります。最終的には異常終了せずに最後まで正常することができるのですが、時間が掛るのと状態を見ている必要があり面倒です。

どなたか改善方法をご存じの方、その方法をお教え願えませんか?

 宜しくお願いします。 

< 使用 Excel:Excel2016、使用 OS:Windows7 >


マクロだけでしょうか。セルへコピペ時はどうもありませんか。
数式バー等、黒くなることはありませんか。
2016は32ビットですか。

全て該当しなければ他の方の回答をお待ちください
エクセルが遅くなる原因は様々なようですよ。
でわ

(隠居じーさん) 2018/09/07(金) 12:30


マクロの実行だけです。セルのコピペや数式バーで問題はありません。Officeは32ビットです。
(mcx32503) 2018/09/07(金) 12:37

長時間画面を更新しないと、バーに「応答なし」とか表示されたりしますし、実行中は操作もできませんよね。 これを防ぐには、ループして処理している中に、たまに DoEvents を入れてみてください。 マクロがCPUを独占してしまってExcelの表示更新が止まるのを防ぐことができますよ。
(???) 2018/09/07(金) 12:57

こんな感じで良かったですか?実行したところ、つっかからずに正常終了しました。

ご助言ありがとうございます。やり方がまずければ追加でご指摘ください。

Sub A_抽出()

    Dim wb1 As Workbook, ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet, ws4 As Worksheet
    Dim r2 As Long, r3 As Long, r4 As Long, c4 As Long
    Dim file_name As String, sheet_name As String, obj_name As String
    Screen_Update False
    Change_Dir ThisWorkbook.Path
    Set ws2 = ThisWorkbook.Worksheets("対象ファイル")
    Set ws3 = ThisWorkbook.Worksheets("抽出")
    Set ws4 = ThisWorkbook.Worksheets("集計")
    Delete_Rows ws4, 4, Last_Row(ws4)
    r2 = 4
    r4 = 4
    Do While ws2.Cells(r2, "B").Value <> ""
        Debug.Print r2, ws2.Cells(r2, "B").Value
        file_name = ws2.Cells(r2, "B").Value
        Set wb1 = Workbooks.Open(file_name)
        For r3 = 4 To Last_Row(ws3)
            c4 = Column_Number(ws3.Cells(r3, "A").Value)
            ws4.Cells(r4, c4).WrapText = True 
            ws4.Cells(r4, c4).VerticalAlignment = xlTop
            If ws3.Cells(r3, "B").Value <> "" Then
                sheet_name = ws3.Cells(r3, "B").Value
                Set ws1 = wb1.Worksheets(sheet_name)
            End If
            If ws3.Cells(r3, "D").Value <> "" Then
                If ws3.Cells(r3, "D").Value = "OBJECT" Then
                    obj_name = ws3.Cells(r3, "E").Value
                    ws4.Cells(r4, c4).Value = ws1.OLEObjects(obj_name).Object.Value
                    If ws1.OLEObjects(obj_name).Object.Value Then
                        Fill_Color ws4, r4, r4, c4, c4, 6
                    End If
                Else
                    ws4.Cells(r4, c4).NumberFormatLocal = ws3.Cells(r3, "E").Value
                    ws4.Cells(r4, c4).Value = ws1.Range(ws3.Cells(r3, "D").Value).Value
                End If
            End If
        Next r3
        wb1.Close savechanges:=False
        Set wb1 = Nothing
        DoEvents                 ' <=== ここに入れました
        r2 = r2 + 1
        r4 = r4 + 1
    Loop
    Draw_Rules ws4, 4, Last_Row(ws4), Column_Number("A"), Last_Column(ws4)
    Set ws2 = Nothing
    Set ws3 = Nothing
    Set ws4 = Nothing
    Screen_Update True
End Sub
(mcx32503) 2018/09/07(金) 13:23

DO -LOOP 内で、シートに式による再計算が必要になった時、システムに権限を戻す事をしておかないと、再計算で元に戻らないことがあるようです。
パソコンに負荷のかかる処理、マルチスレッドが必要な状態の時に、エクセルが自分を見失う様な現象になっているように思えます。
プログラムの作り方にもよると思いますが、
・シートを切り替えながら印刷を順に繰り返す
・多数のセルに式が入っていて再計算中

ある意味、処理が正常に完了するための「おまじない」ですね。

その前に、マクロ起動時に
「自動計算」を停止にしておいて、影響が無いのなら、

マクロの最初に「手動計算」
マクロの最終に「自動計算」
をしておくのも効果的です。

(a_h******) 2018/09/10(月) 20:31


Application.ScreenUpdatingの方は余り気にせず使っていますが、Application.Calculation = xlCalculationManualは実行時エラーでぶっ飛んだ時、エラー処理を書いていてもマクロを抜け出た時、xlCalculationAutomaticに戻せるのか不安です。

対話形式に戻った時に手動計算のままになっていることに気づかず、手を加えたものを再計算せずに開示してしまうことって考えられますよね?大丈夫でしょうか?
(mcx32503) 2018/09/11(火) 08:50


計算方法の手動自動切換えはVBAじゃなくても出来ますし、確認に1秒もかかりません。
それでも面倒ならエラーが起きたときに自動計算に戻すように書いておけばOKです。(On Error ステートメント)

(TAKA) 2018/09/11(火) 09:35


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.