はじめに
今回は、VBAを使って列の一番下に値を追加する方法について勉強しました。
使用環境は以下のとおりです。
- 使用OS: Windows 10 Pro
- バージョン: 20H2
背景
VBAプログラムで、読み込んだExcelファイルのE列のデータの平均値を計算し、
その平均値を別のExcelファイルの指定列(ここではC列)の一番下に追加したいと考えました。
実際に行った処理
以下のコードで実現できました。
Workbooks(strFileName).Activate
Range("E25").Formula = "=AVERAGE(E27:E1000)" '※.End(xlDown)を使いたかったが未実装
Range("E25").Copy
ThisWorkbook.Activate
n = Cells(Rows.Count, "C").End(xlUp).Row + 1
Range("C" & n).Select
ActiveCell.PasteSpecial Paste:=xlPasteValues
コードの解説
1行目:
計算対象となるExcelファイルをアクティブにしています。strFileName
には、事前に読み込んだExcelファイル名が格納されています。
2行目:
E列の一部(E27からE1000)を対象に、AVERAGE関数を設定しています。
※本来は、E27
からデータの最終行まで動的に指定したかったのですが、End(xlDown)
を活用する方法は今回未実装です。
3行目:
平均値を設定したセル(E25)をコピーしています。
4行目:
展開先のExcelファイル(このマクロが書かれているファイル)に切り替えています。
5行目:
C列の最終データ行を取得し、**その1行下(次の空白セル)**をn
に代入しています。
この書き方は、列の末尾を自動検出してデータを追加するときの定番の文法です。
6〜7行目:
C列のn
行目を選択し、コピーしておいた平均値を値貼り付け(PasteSpecial)で貼り付けています。
これにより、数式ではなく計算結果(値)だけを正しく貼り付けることができます。
本来やりたかったことについて
- 本当は、E27からE列の最終データ行までを対象に平均値を出したかったのですが、
.End(xlDown)
を組み合わせる方法は今回は実現できませんでした。 - この点についても今後さらに勉強し、より柔軟なコードが書けるようにしていきたいと思います。
まとめ
- 取得したいファイルを
.Activate
して、必要な計算(今回はAVERAGE
)を行う。 .Copy
で結果を保持し、展開したいファイルに.Activate
して移動。Cells(Rows.Count, "列").End(xlUp).Row + 1
で列の末尾の次の行を探して貼り付ける。- 貼り付ける際は、PasteSpecial Paste:=xlPasteValuesを使って値のみ貼り付ける。
今回の作業を通じて、データを動的に取得して展開する基本的な流れを学ぶことができました。
引き続き、列の最終行を柔軟に扱えるテクニックも習得していきたいと考えています。