初心者のためのExcel エクセルマクロVBA入門-実践:印刷処理(発注書マクロ)
エクセルで印刷できるのだからマクロでも印刷はできるよ
ということで、印刷です。前回書いたヤツもう一度書いておきますね。
全体を通してしたいこと
- 自動でCSV在庫表を取込たい
- 発注が必要な商品リストが見たい。
- 商品は取引先ごとに見たい
- 自分で数を入力して発注書を印刷したい
- できればFAXも自動でしたい
このうち、前回までで、発注が必要な商品リストが見たい。と商品は取引先ごとに見たい。が実現できました。後は、自分で数を入力して発注書を印刷したい。が実現できれば、ベータ版でもとりあえず担当者に使ってもらえそうですね。
数を入力したら、印刷ボタンを押すわけです。その場合・・・
- 数量が0とかだったらどうなるの?
- 発注する商品がスゲーたくさんあったらどうするの?
等の問題があります。とりあえず後者については置いといて、最低でも必要のない商品を発注しない方が良いですよね。ですので、
数量が空白または0なら印刷には出力しない。
ということにしましょう。
では、印刷ボタンを押したときの処理になります。開発タブのデザインモードをクリックして、その後で、印刷ボタンをダブルクリックしましょう。
Private Sub btnPrintOrder_Click() End Sub
上記のように、最初と最後が自動的に作成されます。後はこの中に、印刷の処理を書いて行けば・・・違いますね。正解は、
印刷の処理を呼び出す処理を書く
ですね。何度も言ってますがメインの処理は標準モジュールに書く。です。もうこの辺は慣れの問題なのですが、忘れないようにしましょう。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' 印刷ボタン押下時のイベント ' ここに具体的な処理は書かない ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub btnPrintOrder_Click() '印刷処理を呼び出す Call mdlMain.printOutOrder End Sub
はい、こんな感じ、後は標準モジュールにprintOutOrderを作ればいいだけです。さっそく標準モジュールにプロシージャを作成します。
標準モジュール
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' 検索結果から発注が必要な商品を出力する ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Sub printOutOrder() End Sub
はい、はじめと終わり書いて・・・次は日本語ですよね?
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' 検索結果から発注が必要な商品を出力する ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Sub printOutOrder() ' 発注内容をテンプレートシートに出力する ' 11行目から商品リスト出力分まで繰り返す ' 数量が空白または0ではないか? ' 空白または0でなければ、テンプレートに転記する ' 会社情報をテンプレートに転記する ' 会社を仕入れ先シートから検索する ' 会社情報をテンプレートへ転記 ' 印刷する End Sub
こんな感じでしょうか?さて、後は翻訳するだけです。
11行目から商品リスト出力分まで繰り返す⇒For文
当然繰り返すのでFor文やDo~Loop文を使います。Do~Loop文なら、空白になるまでずっと・・・とかでしょうか?For文なら11行目から、出力行数分繰り返す。という感じですよね。今回は、For文を使ってみます。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' 検索結果から発注が必要な商品を出力する ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Sub printOutOrder() Dim i As Long ' 発注内容をテンプレートシートに出力する ' 11行目から商品リスト出力分まで繰り返す For i = 11 To shtOrderTool.Cells(Rows.Count, "B").End(xlUp).Row ' 数量が空白または0ではないか? ' 空白または0でなければ、テンプレートに転記する Next ' 会社情報をテンプレートに転記する ' 会社を仕入れ先シートから検索する ' 会社情報をテンプレートへ転記 ' 印刷する End Sub
セルの入力されている最終行
shtOrderTool.Cells(Rows.Count, "B").End(xlUp).Row
これは、結構他のブログや私のブログでも取り上げてますが、いわゆる「最後に入力されている行」を取得するための定型文みたいなもんです。英語で言えばもはや「熟語」レベルですね。もう何度も言ってますがVBAはプログラミング言語です。言語ですから言葉ですよね?エクセルと人がコミュニケーションを取るための言葉です。ですから、文系諸君大丈夫です!言語ですから熟語がある。当然です。決まった言い方ができますよー。ということです。同じような意味で別の言い方(書き方)をするものも勿論あります。だって言葉だもの。したがって、熟語と同じで文法のように分解もできます。この場合は・・・
shtOrderTool . Cells(Rows.Count, "B") . End(xlUp) . Row 発注ツールシート の このシートの最後の行のB列 の 最後の入力行 の 行番号
となります。End(xlUp)は最後の入力行ということですが、要するにエクセル上でCtrl+↑キーを押した動作のことです。英語の熟語のように直訳するとこうなりますが、要するに「B列の最終入力行」ということです。ね?熟語ですよね。
次は数量が空白または0ではないか?ですから、これを翻訳してVBAを書きます。If文ですよね?さらに、転記なのでセルの値を移すだけです。ですので・・・
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' 検索結果から発注が必要な商品を出力する ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Public Sub printOutOrder() Dim i As Long Dim row As Long row = 15 ' 発注内容をテンプレートシートに出力する ' 11行目から商品リスト出力分まで繰り返す For i = 11 To shtOrderTool.Cells(Rows.Count, "B").End(xlUp).row ' 数量が空白または0ではないか? If shtOrderTool.Cells(i, "F").Value <> "" And shtOrderTool.Cells(i, "F").Value <> 0 Then ' 空白または0でなければ、テンプレートに転記する shtOrderTemplate.Cells(row, "C").Value = shtOrderTool.Cells(i, "C").Value shtOrderTemplate.Cells(row, "D").Value = shtOrderTool.Cells(i, "F").Value shtOrderTemplate.Cells(row, "E").Value = shtOrderTool.Cells(i, "E").Value row = row + 1 End If Next ' 会社情報をテンプレートに転記する ' 会社を仕入れ先シートから検索する ' 会社情報をテンプレートへ転記 ' 印刷する End Sub
ここでは特筆することは何もありません。ちゃんとシートオブジェクトから指定することぐらいでしょうか?さて、続いては「会社情報をテンプレートに転記する」ですね。これはどうしましょうか?間違ってもFor文で会社情報をぐりぐり回すことだけはしないようにしましょう。(笑)このブログを読んでいるならわかるはずです。
FindまたはVLookUpを使う
ですね。VlookUpについては実はブログでも超人気です。みんなVLOOKUP大好きね。ほんと。それくらい有名だけど、使い方がようわからん!という人が多いですので、この辺でまた改めてちゃんと基礎も含めて解説をしようかなぁ・・・って思うんですが、それ以前にエクセルの基礎が分からん人がマクロでどうこうというのがそもそも・・・的なこともありますが、やってんやんよ!という感じで
とりあえず、今日はここまで!
かしこ