見出し画像

0から始めるエクセルマクロ②

では、自分の備忘の意味8割で色んなコードを置いていきたいと思います。

最初と最後にとりあえず置く記述

Application.ScreenUpdating = False '以降の計算過程を表示しない

マクロの最初に私が絶対置く記述。マクロを起動したときに画面にその過程を表示しなくします。表示する意味はないですし、表示させても早すぎて見えません。

Application.ScreenUpdating = True '以降の計算過程を表示する
Application.CutCopyMode = False 'クリップボードのデータを消す

マクロの最後に私が絶対置く記述。最初の記述を一応解放しておきます。そして、とにかくコピペをよく使うので、不要になったクリップボードのデータを消しておきます。

数式投入によく使う記述

よく遭遇するのが、「ここまでVLOOKとかの数式全部入れたいなー」というパターン。A列に値が入っている最後の行までもれなく数式入れていくというやつですね。

画像1

Range("B2").Select ’B2を選択する
ActiveCell.FormulaR1C1 = "=MID(RC[-26],5,1)" ’数式を投入する

私のやり方では、まず一番頭に数式を入れます。↑の記述がそれです。B2を選択し、記述ではMID関数を入れてます。この記述に関しては、マクロの記録を使えば簡単に記述できます。

Range("B2").Select 'B2を選択する
Selection.Copy '選択したセルをコピーする
Range("B2:B" & Range("A1").End(xlDown).Row()).Select 'B2から右にB列まで、A1から下に数えて値が入っている行まで選択
ActiveSheet.Paste ’ペーストする

3行目が使えると便利です。先ほど添付した画像で言うと、Fが入っているB7までずらりと選択してコピペできます。数式を2行に渡って一気にコピペしたい場合は、B2とC2に数式を投入しておいた上で、

Range("B2:C2").Select 'B2からC2を選択する
Selection.Copy '選択したセルをコピーする
Range("B2:C" & Range("A1").End(xlDown).Row()).Select ’B2から右にC列まで、A1から下に数えて値が入っている行まで選択
ActiveSheet.Paste 'ペーストする

このようにすれば一気にコピペ可能です。
さらに、数式をそのまま残すと重くなりがちなのが個人的に気に入らないので、数式から値に変換することもよくやります。一旦コピーして値貼り付けすることで実現します。

Range("B2").Select
   Range(Selection, Selection.End(xlToRight)).Select '選択したセルから右へ値が入っているセルまで
   Range(Selection, Selection.End(xlDown)).Select '同様に下まで
   Selection.Copy 'コピー
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
       :=False, Transpose:=False '値貼り付け

また、下から上げる方法もありますが、自分は見た目感重視であまり使いません。

Range("B2:B" & Range("A1000000").End(xlUp).Row()).Select

私がよく使用する、上から下への方法は、A1にしか値が入っていない、あるいはA列に何も値が入っていない状態で実行すると、エクセルの下限まで選択してコピペしようとするので、とんでもないことになります。
これを防ぐために、IF構文を使用しています。

IF構文

文字通り「~の時、~する」という構文です。数式のIFと感覚はさほど変わりません。このIFを使って、先ほどのエクセルの下限まで選択することを防止します。
とどのつまり、(A1にはヘッダー情報が必ず入力されているとして)A2の値が何もないとき、処理をスキップすればよいということになります。

If Range("A2").Value <> "" Then 'A2の値が空欄ではないとき

Range("B2").Select  'B2を選択する
ActiveCell.FormulaR1C1 = "=MID(RC[-26],5,1)" '数式を投入する
Range("B2").Select 'B2を選択する
Selection.Copy '選択したセルをコピーする
Range("B2:B" & Range("A1").End(xlDown).Row()).Select 'B2から右にB列まで、A1から下に数えて値が入っている行まで選択
ActiveSheet.Paste ’ペーストする

End If

このようにしておけば、A2の値が空欄のとき、処理はスキップされます。
VBAのIF構文は、IF ~ Then で始め、最後にend if を入れるのがルールです。
条件を分岐させるときは、elseif ~ Thenで条件を追加します。

Sheets("sheet1").Select
'フィルタがかかっていれば解除する
With ThisWorkbook.Worksheets("sheet1")
 If .FilterMode = True Then
   .ShowAllData
 End If
End With

IFを使用すれば、こんなことも可能です。

本日はここまで

この記事が気に入ったらサポートをしてみませんか?