ExcelVBA(マクロ)で表中の空白のセルに上のセルと同じ内容を自動で入力する方法/Copy、For Nextの使い方

traditional-chinese IT

CopyメソッドとFor Next(ついでにIf Then)の組み合わせとして、「列の中で、もし空白のセルがあったら上のセルをコピペ」というマクロを組んでみました。

スポンサーリンク

空白セルに自動で上のセルをコピペ

blankcopy1
こんな表があるとします。学年欄は最初のひとり以外空白で、次の学年になるとまた最初のひとりだけ入力されています。
blankcopy2
この空白に全て学年を入れる必要があることがわかりました。というわけで、これをマクロで埋めてみます。
blankcopy3
セルの内容をコピーする時は、たとえばRange(“A2”).copy Range(“A3”)のように記述します。これでA2の内容がA3にコピーされます。
blankcopy8
それを踏まえて、開始行~終了行のひとつ前の数値を指定して、For i = 2 To 7と記述します。For Next文では同じ処理を何度も繰り返すことができ、一度処理を繰り返すたびにこの「i」の数値が1増えていきます。
blankcopy4
この「i」を、そのままCopyのセル指定に使います。Range(“A” & i).Copy Range(“A” & i + 1)ということは、最初の一回目はRange(“A2”).copy Range(“A3”)と同じ意味になります。iは2で、i+1は3だからです。
次の周回ではiが1増えるので、Range(“A3”).copy Range(“A4”)と同じ意味になります。
処理はiが2から7の間繰り返されます。
blankcopy5
ただしこのままだと最初の「1年」を下までコピーしてしまうので、「下のセルが空白の場合のみ処理を行う」ためにIf Range(“A” & i + 1).Value = “”という条件を加えます。
blankcopy6
条件に合致したらThen以降の処理を実行し、下に何か文字があればスルーします。If文はEnd Ifで閉じ、For Next文はNextで閉じます。
blankcopy7
実行結果はこのようになります。

For Nextの変数iを自動取得

blankcopy9
ついでですが、For Nextの最大数を手打ちというのは複数表があれば複数書き変える必要があり、面倒ではあります。
blankcopy10
これも自動で取得するようにします。たとえば「生徒数」というセルを作って、これにCountA関数で数えた生徒の人数を表示するようにし、
blankcopy11
Dimで変数n(名前はなんでもいいです)を作成し、Set n = Range(“F2”)のようにして生徒の数を出力したセルを代入します。
blankcopy12
あとはFor i = 2 to nのように、回数上限を作った変数にしてやれば、
blankcopy13
データの数が増減しても、
blankcopy14
自動で適切な範囲に対して処理が行われます。

もし見出しがなく、コピペするデータが1行目から始まっている場合は最大数をn – 1にしてください。3行目ならFor i = 3 to n + 1、10行目からならFor i = 10 to n + 9になります。

' vba
Dim n
Set n = Range("F2")' 生徒の数
For i = 2 To n
' 下のセルが空欄なら処理を行う
If Range("A" & i + 1).Value = "" Then
' 下のセルにコピー
Range("A" & i).Copy Range("A" & i + 1)
End If
Next
やりたいことから方法を探すエクセル(Excel)操作・関数・VBA(マクロ)逆引きまとめ
逆引き(やりたいことから探す)Excel記事まとめ
関数・演算子・メソッド・プロパティ名から探すExcel/VBA(マクロ)使い方・組み合わせ方まとめ
こちらはExcelやメソッドの諸機能を、機能の名称から探せるまとめ記事です。

コメント