- ベストアンサー
Excel Slope関数の繰返し処理を簡略化する方法は?
- ExcelのSlope関数をVBAで繰返し処理させたいが、処理が遅くなる問題がある。特に、指定範囲のセルに対する処理が時間がかかるため、処理を軽くする方法を知りたい。
- 質問者は自分のプログラムでSlope関数の繰返し処理を行っているが、Excelの動きが鈍いことに気付いた。問題の原因として、指定範囲のセルに対する処理が重い可能性がある。
- 質問者はSlope関数をVBAで繰返し処理させるためのプログラムを作成したが、処理に時間がかかり、Excelの動きが鈍くなってしまう。処理が遅くなる部分を特定し、軽くする方法を教えて欲しい。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 数式を出力するもの、 値を出力するもの、 2例、挙げておきます。 1)遅くなる原因を十分に(未然に)(場合によっては必要以上に)排除しておく。 2)オブジェクトへの参照は必要最小限にして、繰り返さない。 3)計算を実行するタイミングを一度に纏める。 3)については、本来は配列変数を使って数式を一気に出力するのが有力ですが、 ここでは、数式の先頭に全角空白を付加した文字列を一旦出力して、 置換機能で全角空白を削除するタイミングで計算させます。 「数式を出力するもの」 現状問題の遅さ、についての手当てとしては、主に3)の効果が大きいと思いますが、 1)2)については、ExcelyaExcel VBAを扱う上では、一応基本的な手法ですので、 書き加えています。 「値を出力するもの」 出力する数式の参照先のデータが変動値ではなく、固定であるならば、 VBAで計算したものを値で出力することで、実行を軽くできますし、 ファイルそのものを軽くできます。 1)の記述は、元に戻す処理と対になっています。 他の処理を書き加える時は、エラーに備えて、確実に元に戻すように エラーを制御するよう検討してください。 この手のテーマは、方法を伝えるよりサンプルを示した方が 解り易いんじゃないかな、と思ったので、例示として以下を提示します。 ' ' 「数式を出力するもの Sub Re8344147f() Dim rRef As Range Dim n As Long Dim i As Long With Sheets("Sheet2") ' 2) For i = 55 To .Cells(Rows.Count, 2).End(xlUp).Row If .Cells(i, 2) >= 3 Then Exit For Next i End With n = i - 2 With Application ' 1) .Calculation = xlCalculationManual .EnableEvents = False .ScreenUpdating = False End With Set rRef = Range("A55:A" & n) ' 2) With Worksheets("Sheet3").Range("Q16:Q28") ' 2) For i = 1 To 13 ' 3)↓ .Cells(i).Value = " =Slope(Sheet2!" & rRef.Offset(, i * 2).Address(0, 0) & ",Sheet2!" & rRef.Offset(, i * 2 - 1).Address(0, 0) & ")" Next i .Replace " ", "" ' 3) End With Set rRef = Nothing With Application ' 1) .Calculation = xlCalculationAutomatic .EnableEvents = True .ScreenUpdating = True End With End Sub ' ' 「値を出力するもの」 Sub Re8344147v() Dim rRef As Range Dim n As Long Dim i As Long With Sheets("Sheet2") ' 2) For i = 55 To .Cells(Rows.Count, 2).End(xlUp).Row If .Cells(i, 2) >= 3 Then Exit For Next i End With n = i - 2 With Application ' 1) .Calculation = xlCalculationManual .EnableEvents = False .ScreenUpdating = False End With Set rRef = Sheets("Sheet2").Range("A55:A" & n) ' 2) With Worksheets("Sheet3").Range("Q16:Q28") ' 2) For i = 1 To 13 .Cells(i).Value = Application.Slope(rRef.Offset(, i * 2), rRef.Offset(, i * 2 - 1)) Next i End With Set rRef = Nothing With Application ' 1) .Calculation = xlCalculationAutomatic .EnableEvents = True .ScreenUpdating = True End With End Sub
その他の回答 (1)
- play_with_you
- ベストアンサー率37% (112/301)
「どれくらい」遅くなるかがかかれてないけど、とりあえずブックの自動再計算がオンなら、関数を挿入するたびに再計算されるので多少は遅くなるでしょうね。 一時的に自動再計算をオフにするか、もしくは「そもそもそのセルにSLOPE関数が必要なのか」を考え直すかです。 念のため説明。 「そもそもそのセルにSLOPE関数が必要なのか」というのは「そのセルに“関数が入っている必要”はあるのか」ということです。 もし結果がそのセルに入ればいいならわざわざSLOPE関数を入れるのではなくVBA内で計算してしまえばいいのですから。 関数をどうVBAで使うか知らないなら↓ https://www.google.co.jp/search?q=vba+worksheetfunction
お礼
ご回答ありがとうございました。 サンプル構文の提示もありがとうございました。 ' ' 「数式を出力するもの で記載して頂いたマクロを自分のExcelファイルに貼り付けて、一部変更して使用したところ今までのマクロの3倍くらい速い速度で処理できました。 しかし、まだマクロ入門したばかりなので、この構文ですともし使用現場で何か不具合があった際に対応ができない懸念点が残ってしまいます。 ですので、せっかく教えて頂いたのですが、今までのマクロで職場の先輩に教えて頂いた内容を少し取り入れたもので運用したいと思います。 お忙しいところご回答いただきましてありがとうございました。