ExcelのSlope関数をVBAで繰返し処理させたいのですが、自分が作製したプログラムですと、処理に時間がかかってしまう事がわかりました(正常動作はするのですが、Excelの動きが鈍い)。
動きが遅くなってしまう部分はおそらくここだろうと部分をピックアップしたので、処理が軽くなる方法がわかる方いらっしゃいましたら、教えて下さい。宜しくお願い致します。
i = 1
n = 55
Do While i < 3
i = Sheets("Sheet2").Cells(n, 2)
n = n + 1
Loop
n = n - 2
Worksheets("Sheet3").Range("Q16").Formula = "=Slope(Sheet2! C55:C" & n & ",Sheet2!B55:B" & n & ")"
Worksheets("Sheet3").Range("Q17").Formula = "=Slope(Sheet2! E55:E" & n & ",Sheet2!D55:D" & n & ")"
Worksheets("Sheet3").Range("Q18").Formula = "=Slope(Sheet2! G55:G" & n & ",Sheet2!F55:F" & n & ")"
・
・
・
・
・
Worksheets("Sheet3").Range("Q28").Formula = "=Slope(Sheet2! AA55:AA" & n & ",Sheet2!Z55:Z" & n & ")"
No.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
ご回答ありがとうございました。
サンプル構文の提示もありがとうございました。
' ' 「数式を出力するもの
で記載して頂いたマクロを自分のExcelファイルに貼り付けて、一部変更して使用したところ今までのマクロの3倍くらい速い速度で処理できました。
しかし、まだマクロ入門したばかりなので、この構文ですともし使用現場で何か不具合があった際に対応ができない懸念点が残ってしまいます。
ですので、せっかく教えて頂いたのですが、今までのマクロで職場の先輩に教えて頂いた内容を少し取り入れたもので運用したいと思います。
お忙しいところご回答いただきましてありがとうございました。
No.1
- 回答日時:
「どれくらい」遅くなるかがかかれてないけど、とりあえずブックの自動再計算がオンなら、関数を挿入するたびに再計算されるので多少は遅くなるでしょうね。
一時的に自動再計算をオフにするか、もしくは「そもそもそのセルにSLOPE関数が必要なのか」を考え直すかです。
念のため説明。
「そもそもそのセルにSLOPE関数が必要なのか」というのは「そのセルに“関数が入っている必要”はあるのか」ということです。
もし結果がそのセルに入ればいいならわざわざSLOPE関数を入れるのではなくVBA内で計算してしまえばいいのですから。
関数をどうVBAで使うか知らないなら↓
https://www.google.co.jp/search?q=vba+worksheetf …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
- Visual Basic(VBA) VBA For Each 〜 複数条件について 3 2022/10/20 20:05
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Visual Basic(VBA) このプログラムなんですがsheetにデータを置いて表示できるようにしてありますがsheetに101を 2 2023/02/23 20:13
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- スーパー・コンビニ 「コンビニで エクセルをプリントアウト」することができますか? 8 2022/06/16 15:54
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- Visual Basic(VBA) VBAでvlookup関数から、別シート参照するやり方・・・ 2 2022/11/14 18:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
MMDでavi出力が出来ない
-
AIに回答させるって
-
コンセントの電力は入力と出力...
-
OBS配信すると、マイクが途切れ...
-
プログラムについての質問です...
-
makeで文字化けする。migwのmak...
-
CPUの温度を出力するプログラム...
-
ACCESS フォームで選択したレコ...
-
cout と cerrの違い
-
printfとputcharの違いは
-
C言語プログラミング
-
フォートランで出力をタブ区切...
-
改行の仕方
-
エクセルマクロで出力行の増や...
-
発電機の出力について
-
c言語でグラフをつくる
-
C言語で矩形波生成方法
-
Zガンダムのハイザックて、ジェ...
-
ACアダプターの入力と出力のVAの差
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
コンセントの電力は入力と出力...
-
MMDでavi出力が出来ない
-
OBS配信すると、マイクが途切れ...
-
VBAでテキスト出力時のスペース...
-
cout と cerrの違い
-
COBOLのMOVEで桁数が異なる場合
-
ACCESS クエリ→フォーム...
-
アクセスでエクセルに出力する...
-
VBAのExecメソッドで画面を非表...
-
テキストファイルから特定の文...
-
Windows11対応の3入力1出力 USB...
-
VBAで有効数字の設定
-
スマホのバッテリー消費につい...
-
Excel VBAで値を変えながら、pd...
-
NTTのホームゲートウェイとOCN...
-
定格冷房能力(出力)とは 定格...
-
プログラムについての質問です...
-
PS5をMacBookProに出力したいの...
おすすめ情報