CopyメソッドとFor Next(ついでにIf Then)の組み合わせとして、「列の中で、もし空白のセルがあったら上のセルをコピペ」というマクロを組んでみました。
空白セルに自動で上のセルをコピペ
こんな表があるとします。学年欄は最初のひとり以外空白で、次の学年になるとまた最初のひとりだけ入力されています。
この空白に全て学年を入れる必要があることがわかりました。というわけで、これをマクロで埋めてみます。
セルの内容をコピーする時は、たとえばRange(“A2”).copy Range(“A3”)のように記述します。これでA2の内容がA3にコピーされます。
それを踏まえて、開始行~終了行のひとつ前の数値を指定して、For i = 2 To 7と記述します。For Next文では同じ処理を何度も繰り返すことができ、一度処理を繰り返すたびにこの「i」の数値が1増えていきます。
この「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の間繰り返されます。
次の周回ではiが1増えるので、Range(“A3”).copy Range(“A4”)と同じ意味になります。
処理はiが2から7の間繰り返されます。
ただしこのままだと最初の「1年」を下までコピーしてしまうので、「下のセルが空白の場合のみ処理を行う」ためにIf Range(“A” & i + 1).Value = “”という条件を加えます。
条件に合致したらThen以降の処理を実行し、下に何か文字があればスルーします。If文はEnd Ifで閉じ、For Next文はNextで閉じます。
実行結果はこのようになります。
For Nextの変数iを自動取得
ついでですが、For Nextの最大数を手打ちというのは複数表があれば複数書き変える必要があり、面倒ではあります。
これも自動で取得するようにします。たとえば「生徒数」というセルを作って、これにCountA関数で数えた生徒の人数を表示するようにし、
Dimで変数n(名前はなんでもいいです)を作成し、Set n = Range(“F2”)のようにして生徒の数を出力したセルを代入します。
あとはFor i = 2 to nのように、回数上限を作った変数にしてやれば、
データの数が増減しても、
自動で適切な範囲に対して処理が行われます。
もし見出しがなく、コピペするデータが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やメソッドの諸機能を、機能の名称から探せるまとめ記事です。
コメント