1.はじめに
今回,仕事で複数の別ファイルから情報を集計して円グラフ化したり,計算したりすることがありました.
大きな金融様をお相手にしているため,ドキュメント類はすべてExcel.
というわけで,はじめてExcelマクロを触った超初心者が防備録として書いてみました.
(本記事ではマクロの記録は使用しません.エディターでの作業を念頭に置いてください.ちなみに環境はWindowsXPのExcel2003です.どうぞ笑ってください)
2.情報収集と基本方針
まずは情報収集ということで,そもそもどうやってマクロを使うのか調べる必要があります.(ツールを作るとか,ツールを使うとかみんな簡単に言うが,スタートラインに立ってすらいない初心者にはそれすら難しい.)
ということで,こちらの記事を参考にさせていただきました.
[Excel2013 で VBA] ボタンからのプログラムの起動
無事にボタンができました.ついでに,エディターも開けたのでこのまま書いていきましょう.
次に,「じゃあ,どうやって別ファイルからデータ引き出すの?」ということで,こちらのサイトを参考にしました.
こちらのサイトの
「なるべくワークシートで処理すること」「なるべくマクロを書かないこと」
という言葉は初めてVBAでExcelマクロ作ろうと思っていた私にとっては目から鱗.
だって,作業シート別に作って,別ファイルの情報をコピペするコードを書くだけでいいって言ってくれてるんですよ?素晴らしい!
てっきり,エクセル方眼紙に数式埋め込んだりせずにすべてマクロで処理するべきなんだと思っていたので,このことばのおかげで,私の中でかなりVBAに対するハードルが下がりました.ありがとうございます.
このサイトに則り,私の中の方針として
- マクロを書くのは別ファイルから作業シートへのコピペまで
- 作業シートにコピペしたあとはマクロ使わず,関数でいい感じにする!
という2つを軸に取り組むことにしました.
3.Withってなんだ?プロシージャとは
では,実際にマクロ作っていこうか.と思って再度,サイトを見ます.
すると見慣れない
With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
.Calculation = xlCalculationManual
End With
With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.Calculation = xlCalculationAutomatic
End With
というコードにぶち当たりました.
何をやっているのか,どうして必要なのか,そういったことはサイトに書かれているのですが,一番大事な情報が書かれていません.
Withってなんだ?
どこの最初と最後にWithを書けば良いのか?
というわけで,調べました.
なるほど.つまりはこのアプリケーションの状態とか情報みたいなものを定義しているってことか
すると別の疑問が湧いてきます.
今まで無視していた**Subってなんだ?**といった疑問です.
というわけで,こちらのサイトを頼りにさせていただきました.
ただの関数みたいですね.main()みたいなものでしょう.
このサイトによると他にもfunctionとかあるらしいのですが,それは今回はひとまず置いておきましょう.
では,次の疑問である**どこの最初と最後にWithを書けば良いのか?**です.
残念ながら,これについては良いサイトがなく,よくわかりませんでした.
ということで,実際にコードを書いてみてエラーが出ない場所を探してみました.
まずはC言語のinclude的扱いならコードのはじめと終わりに書くだろうと思い,実験1.
With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
.Calculation = xlCalculationManual
End With
Sub Sample()
メインの処理
End Sub
With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.Calculation = xlCalculationAutomatic
End With
残念ながら,こちらはエラー.
むむ...そうか,コードの始まりと終わりではないのか.
では,次に,ローカル変数のような扱いなのではないかと思い実験2.
Sub Sample()
With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
.Calculation = xlCalculationManual
End With
メインの処理
With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.Calculation = xlCalculationManual
End With
End Sub
おお!エラー出ずにコード動いた.VBAはSubの中にコードを書かないとだめらしい.
これで,ようやく別ファイルのExcelの中身をコピーできます.
4.コピペ
また先程のサイトを参考にページ全体を貼り付けます.
ここで,私は大量にデータが必要であり,いちいちコピー,ペーストしてるとコードも汚いし,直感的に何をしているのかわからず可読性も下がると考え,Value値を直接代入する方法でコピーを行った.
もちろん,数式とかはコピーされないので値がほしいときのみ有効な手法です.
また,注意も元サイトにあるので必ずしもうまく行くわけではありません.
ここまでで特定のファイルをまるごと別のブックの作業用シートに貼り付けることができた.
その後は,関数に頑張ってもらいます.
countif関数だったり,vlookup関数だったり,match関数だったりを使って作業用シートの情報を自分の望む形に整えれば完成.
ちなみに,特定の範囲のデータを作業用シートに順次追加したいといったとき,どうしても最終行に続きをコピペするといった作業が必要になることが多いと思います.
そういった手法は世の中数多くあり,色んなサイトで解説しているが,個人的に一番役に立ったサイトはこれ.
タイトル行を除き、2行目から最終行までをコピー、別シートの最終行の下に張り付ける
5.おわりに
今回始めてVBAを触った感じとして,おそらくマクロを組んでやることは関数で処理するための作業用シート作成までにしたほうがエラーも出にくくメンテナンスもしやすいのではないかと漠然と思いました.
今後も,VBAを触っていく中で別の考えになるかもしれないが,初心者として仕事で最低限VBAを触るのであればこれで問題ない気がする.
次はPythonでなにかするか,機械学習系の話題について書けたら書きたいな.