【VBA】煩雑なコピペ作業を自動化-#2 ブック内の処理-

VBAによるコピペ作業の自動化、二つ目の記事です。
VBAを触ったことがあるよって人はここからかもっと先の記事から読んでもいいかもしれません。
VBAってそもそも何ぞやって人は一つ前の記事から確認してみてください。

2-1. セル・範囲の選択

エクセルを使うときにセルをクリックしたり、ドラッグして複数のセルを選択したりしますよね。
それをプログラム上でどう書くのかってのが以下になります。

◆セルを選択
◇単一

Range("A1").Select
Cells(1, 1).Select

◇複数

Range("A1:B3").Select 
Range(Cells(1, 1), Cells(3, 2)).Select


◆行を選択
◇単一

Range("1:1").Select
Rows(1).Select

◇複数

Range("1:2").Select
Range(Rows(1), Rows(2)).Select


◆列を選択
◇単一

Range("A:A").Select
Columns(1).Select

◇複数

Range("A:B").Select
Range(Columns(1), Columns(2)).Select

Rangeで書いた方が書く量が減って簡単ですが、ループ処理をするときに列方向へのループが(A→B→Cとなって)難しくなります。また、Cellsで書くときは Cells(行, 列) とRangeの時とは逆なので、注意です。

2-2. コピー&ペースト

いよいよコピー&ペーストです。といってもそんなに難しくありません。
2-1 で Select と書いたところを Copy にすればコピーができ、PasteSpecial とすると貼り付けができます。A1セルをB1セルにコピー&ペーストしたいときは以下の通りです。

Cells(1, 1).Copy
Cells(1, 2).PasteSpecial

値の貼り付けであれば、こんな書き方をしてもいいです。

Cells(1, 2) = ws.Cells(1, 1)

右側のB1の値を左のA1に入れているという見方になります。 
ペースト側ですが、何がスペシャルかというと、ペーストするときは値だけとか書式だけとか全部とかいろいろ選べると思いますが、この点がスペシャルになります。
PasteSpecial で調べるといろいろ出てくるので、必要に応じて調べてください。
おそらく値貼り付けだけわかれば事足りることがほとんどだと思います。

Cells(1, 2).PasteSpecial Paste:=xlPasteValues

2-3. 行・列の挿入・削除

さらりといきます。挿入は Insert、削除は Delete です。
一覧の行の間に入れたいときや、下にフォーマットを伸ばしたい時に使います。

Rows(2).Insert
Rows(2).Delete
Columns(2).Insert
Columns(2).Delete

2-4. 最大行数の取得

ループをしたいときの終点を見つけるときに使います。一番下の行番号が変わる場合はこれを使ってループの終点を見つけます。
ちなみに薄々気が付いてきているかもしれませんが、VBAのコードは一行一行がほぼエクセル上で行う操作に対応しています。
今回の場合は Ctrl + ↑ や Ctrl + ↓ に対応しています。
まず、最大行数を入れる変数を宣言します。

Dim r As Integer

変数の宣言には Dim とまず書きます。rはrowのrです(変数名は何でもいいです)。行数は整数なので、 As Integer と書きます。

r = Cells(10000, 1).End(xlUp).Row

A10000セルをクリックした後(Cells(10000, 1))に Ctrl + ↑ (.End(xlUp))をし、その時の行数(.Row)を r に入れる(=)、という意味になります。
これだけだと実行しても、スンッとしかならないので、

MsgBox r

を追加して実行してみましょう。r の中身が見えると思います。

2-5. 基本構文(if, for)

最後に基本構文の内、よく使う二つを紹介しておきます。
◆for
iを1から一つずつ増やして r まで増やし、r の時の処理までやったら終わる。

For i = 1 To r
 [処理内容(iを行番号を指定する場所に使うなどする)]
Next

◆if
条件式が合っている時だけ処理内容を実行する。
Elseで条件に合っていないときの処理やElseIfで条件に合っていないときに別の条件に合うときの処理を書くことができる。

if [条件式(Cells(1, 1)=1 など)] Then
 [処理内容]
(Else)
(ElseIf [条件式] ThenEnd If

2-exm. ループ処理でコピペをするプログラムを書いてみよう

A列にある数字をB列にコピーするプログラムを書いてみましょう。
この記事のコードを使って書いてみてください。
f:id:TKchnmn77:20201010192746p:plain



◆別解
実はこの例題だとこれでできちゃいます。 



今回はここまでです。次回はブックやシートの操作に入っていきます。