【VBA】スリムになった
ダイエットの話ではない、VBAの話だ。
1か月間いろいろ試行錯誤して、
妥協して妥協して妥協して
業務が回ればいい。
という認識のもといろいろ調べながら
業務をこなして1か月。
たまーーーーに課題のまま放っておいたものに
最適解が見つかったりする。
例えば
こういうデータ。
この黒枠を毎月求めるみたいな感じの。
まぁ、B×C=Dなわけなんだけども。
その分だけコピーすればいいわけだけども。
これをボタン一発で処理するのがマクロで
以前の私ならこんな感じのソース
マクロの記録機能を使いながら編集する感じで
Sub Macro1()
Range("D3").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=RC[-1]*RC[-2]"
Range("D3").Select
Selection.AutoFill Destination:=Range("D3:D200"), Type:=xlFillDefault
Range("C2000").Select
Selection.End(xlUp).Select
ActiveCell.Offset(1, 0).Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
これが限界だった。
これ結構エラーがあって、
仕様としてやっていこうと妥協していた。
これだとまず
Range("D3").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=RC[-1]*RC[-2]"
Range("D3").Select
Selection.AutoFill Destination:=Range("D3:D200"), Type:=xlFillDefault
ここでD3を選んで
そこに=B3×C3
をいれてから200行までコピーする。
画面だとまぁこんな感じになる
なんで200行かといえば、ありえない桁数にするためだ。
なんで?ってのはいったん置いといてほしい
でつぎがこれで
Range("C2000").Select
こうなる
でSelection.End(xlUp).Selectで
ActiveCell.Offset(1, 0).Selectで
アクティブなセルから一つ下にずらして
Range(Selection, Selection.End(xlToRight)).Selectで
コントロールシフト押しながら右キー押したのと同じで
Range(Selection, Selection.End(xlDown)).Selectで
コントロールシフト押しながら下キー押したのと同じで
Selection.ClearContentsで
クリアされる
まぁ枠はちょっと残っちゃうけどこれはまぁ簡便ということで
これの欠点は無駄な処理が多いということ。
ろく商事の毎月の明細数が平均400だったとしたら
式を500くらいまで用意して余分なものを消す。
という感じ。
C列の最終行のデータがあるまで
D列に式を代入し続ける。
みたいなのができなかったので力業でやっていました。
それが今日。
Sub Macro2()
'Dim LastRow As Long
LastRow = Cells(Rows.Count, 2).End(xlUp).Row
Range(Range("D3"), "D" & LastRow).FormulaR1C1 = "=RC[-1]*RC[-2]"
End Sub
こんな感じになりました。
こっちは意味はあんまりよくわかってないんですが、
LastRow = Cells(Rows.Count, 2).End(xlUp).Row
これがC列の最終行数を取得する
だからこのExcelでいうと6
Range(Range("D3"), "D" & LastRow)
がD3からD6までの範囲を、ということで
FormulaR1C1
これがあんまよくわかっていないけど
= "=RC[-1]*RC[-2]"
これで式を代入する。
あたりをつけて余分に計算式を入れたりしてないので
だいぶスリムになりました。
これが1か月前の私
これが今日の私
いやぁ~、毎日触ってるといろいろひらめきがあって楽しい。
1か月でここまで行けるからこのまま1年続けたら
結構システムチックなことができるんじゃないだろうか。
今後も頑張っていこう。
この記事が気に入ったらサポートをしてみませんか?