Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Excel 2016)
実行速度 激遅
投稿日時: 19/08/03 12:10:59
投稿者: toko3

Excel2010を、Excel2016にバージョンアップしたところ実行速度が劇的に遅くなりました。
エラーにはならないのですが、あまりに遅すぎて実用的ではありません。
どなたか、情報をお持ちの方は教えてください。

回答
投稿日時: 19/08/03 17:25:02
投稿者: simple

「Excel2016 遅い」でネット検索してください。
色々記事があります。

投稿日時: 19/08/03 18:01:58
投稿者: toko3

simple さんへ
 
早速。情報をいただきましてありがとうございます。

回答
投稿日時: 19/08/04 19:01:11
投稿者: ライスマン

こんな記事もあります。
 
EXCEL2013と比べてExcel 2016は"みんな大好き"VLOOKUP関数とMATCH関数の計算速度が、約400倍速くなりました
http://officetanaka.net/excel/excel2016/07.htm

投稿日時: 19/08/05 09:22:28
投稿者: toko3

ライスマン さんへ
ご親切に情報を、ありがとうございます。
 
 Workseetに配したコマンドボタンからVBAを実行すると、激遅になるようなので
ユーザーホームのコマンドボタンから実行するように修正しました。
 
上記の結果、問題は解決しましたが、どうも釈然としません。
それとも、私が知らないだけで他の方法があるのかも?

回答
投稿日時: 19/08/05 12:49:13
投稿者: mattuwan44

toko3 さんの引用:
Excel2010を、Excel2016にバージョンアップしたところ実行速度が劇的に遅くなりました。
エラーにはならないのですが、あまりに遅すぎて実用的ではありません。
どなたか、情報をお持ちの方は教えてください。

 
↑この程度の情報しか出せないのなら、ご自分でネットで検索した方が速いかも?
回答側もネットの情報をだすくらいしか出来ないでしょう。
経験がある人が居るかも知れませんが、
掲示板を見ているとも限りませんし、
色々な原因があって、当案件に該当しないかも知れません。
 
コードを含めて回答側で同じような現象が再現できるよう、
情報をだせれば、原因を回答側で探ることも可能かもしれませんね。
そういうことにだれかが興味をもってくれればですけど・・・

投稿日時: 19/08/05 17:18:24
投稿者: toko3

mattuwan44さんへ
ご意見ありがとうございました。

回答
投稿日時: 19/08/06 20:42:27
投稿者: simple

引用:
 Workseetに配したコマンドボタンからVBAを実行すると、激遅になるようなので
ユーザーホームのコマンドボタンから実行するように修正しました。
 
上記の結果、問題は解決しましたが、どうも釈然としません。

コマンドボタンから実行させると激遅で、
ユーザーフォームのコマンドボタンから実行すると改善されたということですか?
まったく信じられません。実行形態ではなく、何か別の原因があると思います。
 
そのマクロで実行しているのは何か特徴がある作業ですか?

回答
投稿日時: 19/08/06 21:07:13
投稿者: iwpon

エクセル2013 → 2016 で同じ現象起きました。
 
結果的には、新規ブックを作成して元のシート・マクロコードをコピーしたら、元の速度になりました。
 
原因は不明なので、回答になっていませんが・・・参考までに。

回答
投稿日時: 19/08/06 22:43:53
投稿者: mattuwan44

>Workseetに配したコマンドボタンからVBAを実行すると、激遅になるようなので
ネットを少し漁ってみましたが、2016は図のリンク貼り付けを使うと、
offsetやValueプロパティなどのセルにアクセスする動作が重くなるような記述を見つけました。
シート上の図形が影響あるかも知れませんね。
(真偽は確かではないので、自分で試して確認するしかないのですが)
 
>結果的には、新規ブックを作成して元のシート・マクロコードをコピーしたら、元の速度になりました。
という情報ももらえたのですが、これは2016だけの話ではなさそうです。
バージョンアップした人が同じような現象の質問があちこちの掲示板に上がってます。
必要な部分だけをコピペして、
2016で新しく保存し直してファイルをリフレッシュするのは有効な手段かも知れません。
不要な情報が溜っているのかも知れませんね。
 
それから、コードで改善できる場合もあるかも知れません。
今のコードを提示し、アドバイスを求めてみるのもよいと思います。
 

投稿日時: 19/08/21 18:58:50
投稿者: toko3

simpleさん、iwponさん、 mattuwan44さん
ご回答ありがとうございました。(お盆でお礼が遅くなり申し訳ありません。)
皆様のご意見を踏まえて、自分なりに試行錯誤してみました。
【 PC性能 】
・プロセッサ Intel(R) Core(TM)i7-3640QM 2.3GHz 64ビット
・メモリ 8GB
・HDD 1TB(Cドライブ空 690GB)
・OS Windows7からWindows10
 
【 エクセルの特徴 】
・コンテンツ作成日: 2015年2月(エクセル2003で作成、拡張子:Xls)
・以降、2010でファイル種類の変更(拡張子:Xlsm)
・シート数: 6シート
・図形、図のリンク貼り付け、条件付き書式、入力規制、関数を多用しています。
・ファイルサイズ 549KB
・同様の方法で作成したマクロを実行してみましたが、やはり、明らかに遅いように感じます。
 
【 テスト方法 】
・「iwponさん」のご意見を踏まえてコードをコピーしてみましたが、顕著な効果はありませんでした。
・「mattuwan44」のご意見を踏まえて、図のリンク貼り付けを減らして実行しましたが
 多少速くなった感触がある程度でした。
・do 〜 Loopの前後で、関数を手動、自動に切り替えてみましたが効果はあまりありません。
・速度低下は、ループ処理している部分でした。
・画面の更新は、OFFにしています。
 
【 コードの例 】
・「シート保護」、「シート保護解除」を、対で使用しています。
・変数は、省略しています。
 
Sub シート保護()
    Application.ScreenUpdating = False '画面更新 しない
    Application.DisplayFullScreen = True '全画面表示 ON
    RQCODE1 = 3 '枠線・枠番号 非表示
    RQCODE2 = 13 'MB基本部分以外 非表示
    Call 保護(RQCODE1, RQCODE2)
End Sub
 
Sub シート保護解除()
    Application.ScreenUpdating = False '画面更新 しない
    Application.DisplayFullScreen = False '全画面表示 OFF
    RQCODE1 = 3 '枠線・枠番号 表示
    RQCODE2 = 13 '全て表示
    Call 保護解除(RQCODE1, RQCODE2)
End Sub
 
Sub 保護(ByVal RQCODE1 As Integer, RQCODE2 As Integer)
'***   RQCODE 明細   ***
'RQCODE1(シート単位のリクエスト)
' 1 = 枠線 非表示
' 2 = 枠番号 非表示
' 3 = 1 + 2 非表示
'RQCODE2(エクセルの基本リクエスト)
' 11 = 数式バー 非表示
' 12 = メニューバー項目 非表示
' 13 = 11 + 12(メニューバー項目 非表示)
' 20 = シート見出し 非表示
' 21 = 20 + スクロールバー 非表示
' 30 = 20 + 21(メニューバー基本部分以外非表示)
 
    For i = 1 To Sheets.Count
        Sheets(i).Activate
        If RQCODE1 = 1 Then ActiveWindow.DisplayGridlines = False '枠線 非表示
        If RQCODE1 = 2 Then ActiveWindow.DisplayHeadings = False '枠番号 非表示
        If RQCODE1 = 3 Then Call 非表示3
        With ActiveSheet
            .EnableSelection = xlUnlockedCells 'Unlockセルのみ編集可能
            .Protect Userinterfaceonly:=True 'マクロのみ編集可能
        End With
        Application.GoTo reference:=Range("A1"), Scroll:=True '左上に固定
    Next i
     
    Sheets(1).Activate
    If RQCODE2 = 11 Then Application.DisplayFormulaBar = False '数式バー 非表示
    If RQCODE2 = 12 Then Call 非表示12 'メニューバー項目 非表示
    If RQCODE2 = 13 Then Call 非表示13 '11 + 12(メMB項目 非表示)
    If RQCODE2 = 20 Then ActiveWindow.DisplayWorkbookTabs = False 'シート見出し 非表示
    If RQCODE2 = 21 Then Call 非表示21 '20 + スクロールバー 非表示
    If RQCODE2 = 30 Then '20 + 21(MB基本部分のみ表示)
        Call 非表示13
        Call 非表示21
    End If
End Sub
 
Private Sub 非表示3()
    With ActiveWindow
        .DisplayGridlines = False '枠線 非表示
        .DisplayHeadings = False '枠番号 非表示
    End With
End Sub
 
Private Sub 非表示12()
    With Application
        .CommandBars("standard").Visible = False 'メニューバー 非表示
        .CommandBars("formatting").Visible = False 'メニューバー 非表示
    End With
End Sub
 
Private Sub 非表示13()
    Application.DisplayFormulaBar = False '数式バー 非表示
    Call 非表示12
End Sub
 
Private Sub 非表示21()
    With ActiveWindow
        .DisplayWorkbookTabs = False 'シート見出し 非表示
        .DisplayHorizontalScrollBar = False '水平スクロールバー 非表示
        .DisplayVerticalScrollBar = False '垂直スクロールバー 非表示
    End With
End Sub
 
Sub 保護解除(ByVal RQCODE1 As Integer, RQCODE2 As Integer)
'RQCODE1(シート単位のリクエスト)
' 3 = 枠線 + 枠番号 表示
'RQCODE2(エクセルの基本リクエスト)
' 13 = メニューバー全て表示
' 21 = シート見出し、スクロールバー 表示
' 30 = 13 + 21(全て表示)
 
    For i = 1 To Sheets.Count
        Sheets(i).Activate
        If RQCODE1 = 3 Then Call 表示3 '枠線 + 枠番号 表示
        ActiveSheet.Unprotect 'SHEET 保護解除
        Application.GoTo reference:=Range("A1"), Scroll:=True '左上に固定
    Next i
     
    Sheets(1).Activate
    If RQCODE2 = 13 Then Call 表示13
    If RQCODE2 = 21 Then Call 表示21
    If RQCODE2 = 30 Then
        Call 表示13 'メニューバー全て表示
        Call 表示21 'シート見出し、SB表示
    End If
End Sub
 
Private Sub 表示3()
    With ActiveWindow
        .DisplayGridlines = True '枠線 表示
        .DisplayHeadings = True '枠番号 表示
    End With
End Sub
 
Private Sub 表示13()
    With Application
        .DisplayFormulaBar = True '数式バー 表示
        .CommandBars("standard").Visible = True 'メニューバー 表示
        .CommandBars("formatting").Visible = True 'メニューバー 表示
    End With
End Sub
 
Private Sub 表示21()
    With ActiveWindow
        .DisplayWorkbookTabs = True 'シート見出し 表示
        .DisplayHorizontalScrollBar = True '水平スクロールバー 表示
        .DisplayVerticalScrollBar = True '垂直スクロールバー 表示
    End With
End Sub

回答
投稿日時: 19/08/22 16:39:07
投稿者: チオチモリン

>図のリンク貼り付け
で遅くなるのは昔からなので、
 
>Excel2010を、Excel2016にバージョンアップしたところ
>ユーザーホームのコマンドボタンから実行するように修正
 で
>問題は解決
に当てはまりませんが、問題の切り分けには
>図のリンク貼り付けを減らして実行
程度では無意味です。
完全に無くして(削除、またはリンクの解除)から実行速度を比較してください。
 
尚、「図のリンク貼り付け」は自ブックのみならず、その時点で開いているすべてのブックに一つでもあれば影響があります。
(昔よりはましになっているようですが)

トピックに返信