みなさん、こんにちはケンケンです。
前回は、ForNext構文を使った例をお見せしました。
請求書作成自動化への道が一歩一歩切り開かれていますよ。もう少しで完結しますからがんばっていきましょう。
みなさん、こんにちはケンケンです。 エクセルVBA入門編も3回目になりました。 前回までの復習はできていますか。 [sitecard subtitle=関連記事 url=https://expenblog.com/43[…]
資料は、初級編でひな形を作った請求書を使っていきます。
初級編の復習をされたい方はこちら
みなさんの中にはエクセルを使いこなしたいな、と考えている方も少なくないと思います。しかし、何から手を付けてよいかわからない。もしくは、知識を手に入れても応用が利かない。というような経験はないでしょうか。 そんな方に向けて、[…]
こんにちはケンケンです。 今回は、前回に引き続きエクセルを使いこなす一歩目として、請求書作成方法をご紹介していきます。 前回の記事をご覧になっていない方は下記をどうぞ。 請求書作成初級編① […]
こんにちは、ケンケンです。 今回は請求書を完成するまでをご紹介します。 まだ初級編①②を見ていない方は以下をご覧ください。 [請求書作成初級編①]エクセルを使いこなすための第一歩 [請求書作成初級編②]エクセルを使い[…]
今回は、実務でよく使う資料を具体的な手順をご紹介しながら解説していきます。
今回からは、本格的に実務に即した形でVBAを紹介していきます。
といっても、前回までの知識がちゃんと整理されていれば、けっして難しいものではないので恐れることはありません。
どんどん知識を増やして、どんどん自動化していきましょう。
前回の復習
前回は、ForNext構文の威力をお見せしました。

上記が、前回書いたコードです。
まず、一つ目の処理が出来るかどうかが重要!でしたね。
手順としては、
- シートを追加して一番後ろに置く
- 作ったシートの名前を変える
- 作ったシートのA1セルの値を国名にする
- カウントするための変数「kuni」を用意する
- ForNext構文を使って繰り返し処理する
でしたね。
1~3までがきちんと出来ていれば、4と5は繰り返しの定番のコードになるので実は簡単に自動化できます。
VBA学習でハマってしまって途中であきらめてしまう方に多いのが、いきなり繰り返しのコードを書こうとして、何も思い浮かばない、という現象です。
コアとなる処理ができないのに繰り返し処理はできません。
是非、今後コードを書くときはまず、一つ目の処理ができるか、ということに重点を置いて考えてください。
以下に詳しくまとめていますのでご参考までに。
では、次項からは具体的に請求書作成初級編で作った請求書を自動化してみましょう。
自動記録を使ってシートをコピーしてみよう

みなさん、自動記録をご存知ですか。
けっこうな方は知っていると思います。
というのも、エクセルVBAの勉強の始めに自動記録を覚える方が多いからです。
自動記録を覚えること自体は問題ないのですが、自動記録を覚えた=VBAを覚えた
と勘違いしてしまう方が多く、結局、
- 応用が効かない
- 自動化できない
となって、VBAを学ぶのをあきらめてしまう方が多いように見受けられます。
ですので、自動記録は補助的な機能としてコードを調べるくらいに活用をとどめることが望ましいかと思います。
今回もコードを調べるために自動記録を使っていきます。
■自動記録の使い方
ここからは、請求書作成初級編で作ったデータを使っていき 「請求書(元)」シートをコピーしてみます。

上記をご覧ください。
「開発」タブの「マクロの記録」を押すとボックスがあらわれますので「OK」ボタンを押して下さい。
「OK」ボタンを押すと記録が開始されます。
それでは、シートをコピーしてみましょう。

上記のように、シートをコピーしてください。

「請求書(元)(2)」が作成出来たら「記録終了」してください。
記録終了したらVBEを開いて以下のように、新しいモジュールとコードが出来ていれば成功です。

この状態まで出来たら、請求書作成するためのプロシージャを作って、生成されたコードをコピーしてみましょう。

プロシージャ名は「Cleate_seikyusyo()」としました。
その中に、自動記録で生成したコードをそのままコピーします。コピーしたコードがちゃんと動くか確認しておいてください。
それでは、コードの解説をしていきます。
まず1行目:Sheets(“請求書(元)”).Select
自動記録をすると、まず対象となるオブジェクトを選択(Select)するコードが生成されます。
今回は特定のシート「請求書(元)」を選択したため1行目のようなコードが生成されました。
そして、2行目:Sheets(“請求書(元)”).Copy after:=Sheets(3)
これは、「請求書(元)」シートをコピーして3枚目の後ろに置くという意味です。
Copyのうしろにどこにコピーしたシートを置くか指定できます。今回は、afterを使って場所を指定します。afterは引数と呼ばれるもので、afterの反対にbeforeを指定することもできます。
ここからは、自動記録で生成されたコードをきれいにしていきます。
実は自動記録されたコードは無駄なものが多く入っています。
今回は、1行目が全部必要ありません。
1行目でシートを選択していますが、選択しなくても2行目のコードを書けば自動的にシートを選択したことになります。
このまま1行目を残しておいても良いのですが、効率的に良くないので消してしまいましょう。

次に、Sheets(3)の括弧のなかを変更していきます。
このままでも問題ないのですが、常に3枚目の後にコピーするよりも、シートの最後にコピーしていきたいので少し変えます。
具体的には、

Sheets(3)の部分をSheets(Sheets.Count)に変更します。
Sheets.Countは、ファイルの中にいくつシートがあるか数えるコードです。
こうすると、常にシートの最後尾にコピーできます。ひとつのテクニックとして覚えておいてください。
これについては前回ご紹介していますので復習しておいてください。
さて、自動記録を使ってシートをコピーする所までできました。
次項からは、コピーしたシートにいろいろ加工していきましょう。
日付を入力してみよう

今日の日付を取得して、請求書の作成日を書き出してみましょう。
日付を取得するには主にDATE関数もしくはNOW関数を使います。
DATE関数は、現在の日付を取得します。
NOW関数は、現在の日付と時刻を取得します。
両者をメッセージボックスを使って比較してみましょう。

上記のようなコードを書いて実行してみましょう。
すると、以下のように表示されるはずです。

Dateは日付のみでNowは日付と時刻が取得できます。
今回は、Dateを使ってみましょう。

コピーしたシート(ActiveSheet)のG2セルに現在の日付を入力してみます。
すると、上記のようになります。
赤枠のコードは、右辺のDate関数で現在の日付を取得して、その値をG2セルに代入する、というものですね。
このコードを実行するとコピーしたシートのG2セルに現在の日付が入力されます。

上記のように日付が入力されていればOKです。
シート名とあて先を入力しよう

次は、シート名を変更して、あて先の入力をしていきましょう。
■シート名の変更
シート名の変更はVBA入門③で取り上げていますので、今回は復習程度にとどめます。
さっそくコードを見てみましょう。


今回は、請求データシートのB2セルから会社名をコピーしたシートの名前にします。

シートの名前が変更されていれば成功です。
■あて先入力
次は、あて先を入力していきます。
これも請求データから拝借します。
コードから見ていきましょう。

特に難しいところはないかと思いますが、ひとつだけ解説していきます。
赤枠最後の「& ” 御中”」という箇所がありますね。
これは、文字列を結合するときに使える方法で、「&」もしくは「+」で結合できます。
どちらを使ってもよいですが、今回は「&」を使って「御中」という文字列を結合しています。
この場合は、請求データシートのB2セルの文字列と御中が結合されますね。
ちなみに、御中は文字列なのでダブルクォーテーションで囲ってください。御中の前に空白があるのは、あて先名と御中の間に空間を設けるためです。
どうですか?コードを書いたら実行してください。
以下のようにできていたら成功です。

フィルターをかけて並べ替えをしてみよう

どんどん進んでいきましょう。
つぎは、「請求データ」シートにフィルターをかけてB列を並べ替えていきます。
パッとコードが思い浮かばないので自動記録で調べてみます。こんなときに自動記録は便利ですね。
「開発」タブの「マクロの記録」を選択します。そして、以下のようにすると


B列で並べ替えられました。
それでは、ここで記録終了し、コードを見てみましょう。

何やらごちゃごちゃしていますが、今回はこれを使っていきましょう。
フィルターやソートに関しては、またの機会に詳しく説明しますので、こんな感じなのかくらいに思っていただいてOKです。
ただひとつ、Selectの部分は単純に効率が悪くなるので削除します。

上記のように変更しても同じ動作をすることを確認してください。
また、注意事項がひとつあります。
コードを追加しなくてはエラーが起きてしまいます。
なぜエラーが起こるかというと、Rows(“1:1”).AutoFilterでフィルターをオンにしたのですが、
最後までフィルターを解除していないので、次に実行するときに再度オンにすることが出来ないためエラーになってしまいます。
そこで、コードの最後にもう一度 Rows(“1:1”).AutoFilterを付け加えるとフィルターがオフになり、次からもエラーなく使えるようになります。

どうでしょう。
上記のコードを再度実行してもエラーにならなければOKです。

これで、並べ替えることまでできました。
自動記録を使った方法をご紹介しました。
もちろん、ひとつずつコードを調べて手書きするほうが、圧倒的に上達が速いのであまり自動記録に頼らないほうが良いと思いますが、今のうちはできる幅を広げて、いろいろVBAで出来るんだなという感覚をもってください。
まとめ
今回は、ここまでとします。
今回は、主に
- 自動記録の使い方
- 日付を取得する方法
- データの転記(シート名変更・あて名変更)
を勉強しました。
次回は、IFを使った条件分岐に触れていこうと思っています。
みなさん、こんにちはケンケンです。 さあ、VBA入門編も5回目を迎えることとなりました。 [sitecard subtitle=前回復習記事 url=https:/[…]
ForNextを使った繰り返しと同じくらい重要でプログラミングらしい分野でもあるのでお楽しみに。
それでは、また次回お会いしましょう。
エクセルVBA入門編~請求書作成自動化への道~記事一覧
【エクセルVBA入門編①】VBAで何ができるのだろうか?【請求書自動作成の第一歩】
【エクセルVBA入門編②】めんどうな仕事はForNext構文で解決【請求書自動化の最重要構文】
【エクセルVBA入門編③】繰り返し作業はFor Next構文で完全自動化!【請求書作成自動化は目前!】
【エクセルVBA入門編④】自動記録を使い方とコード編集法を解説【請求書作成自動化への道】
【エクセルVBA入門編⑤】If Then構文で条件分岐をマスター【請求書自動化の最終ステップ】
【エクセルVBA入門編⑥】手順に沿って請求書を作成してみよう【請求書作成自動化最終章】