初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

初心者のためのExcel エクセルマクロVBA入門-実践:プログラミングをする前に、日本語でやることを書くと捗る(発注書マクロ)

処理は基本的に標準モジュールに書く!


さぁでは実際の処理書いて行きましょう。標準モジュールを追加します。プロジェクトエクスプローラのプロジェクトを右クリックして[挿入]→[標準モジュール]を選択すると自動で「Module1」という名前の標準モジュールが作成されます。


f:id:drumer2sh:20140409130359p:plain


この中に処理を書いて行くのです。当然標準モジュールの名前も変えられるので、名前も変えましょう!作成した標準モジュールを選んでプロパティの名前を変えます。今回名前は「mdlMain」としてます。いろんな処理の中央管理モジュールのようなイメージですね。どんなイベントも必ずこのMainを通すようにすることで、プログラムの処理を追いやすくなるわけです。


f:id:drumer2sh:20140409130407p:plain


この中に前回呼ぶ予定のものを作成するのですが、この際だから、きちんと呼ぶ側もモジュール名から指定するようにしましょう。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    ' 変更されたのは会社名のセルなのか?
    If Not Application.Intersect(Target, shtOrderTool.Range("CorprateName")) Is Nothing Then
    
        ' 変更されたのが会社名だったら・・・
        
        ' 在庫表からその会社の商品をすべて検索して
        ' 発注が必要な商品をリストに出力する
        
        ' ような処理をここから呼ぶ。
        Call mdlMain.outputOrderProduct(Target.Value)
    
    ' それ以外のセルの時は何もしないよ
    End If
    
End Sub

ポイントは、

Call mdlMain.outputOrderProduct(Target.Value)

です。ちゃんとmdlMainとモジュール名から指定しています。これもちゃんと「オブジェクトの指定がちゃんとできればVBAは楽勝!」理論から来ています。もしmdlMainがなければ、outputOrderProductが「どこにあるのか?」がコードを見てもわからないのです。もちろん、シート内のプロシージャをCallする場合はいらないですが、今回は「標準モジュールにあるプロシージャをCallする」わけですから、このように書くわけです。

さて、ではoutputOrderProductを作成します。mdlMainをダブルクリックして、以下のように書きます。

Option Explicit


'''''''''''''''''''''''''''''''''''''''''
' メイン処理
'''''''''''''''''''''''''''''''''''''''''


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 引数:corpName(会社名)
' 会社名に該当して、発注が必要な商品をリストアップする
' メインの処理
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Sub outputOrderProduct(ByVal corpName As String)




End Sub

いつでもどこでもやることは同じなのです。

  • 最初と最後をちゃんとコメント付きで書いて・・・
  • 「やること」を日本語で書いて
  • VBAで翻訳する。

本当にこれだけです。皆さんもこの手順で是非やってみてください。そしてもし、書いた日本語をVBAに翻訳できないなら、後はググればできます。実はステップ2まで出来てしまえば、後は本当にただの「翻訳」なので、その翻訳の方法は検索すれば、見つかるのです。だって、もうやることわかってんだもん。

さて、次ですね。やることを日本語にしましょう・・・


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 引数:corpName(会社名)
' 会社名に該当して、発注が必要な商品をリストアップする
' メインの処理
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Sub outputOrderProduct(ByVal corpName As String)

    'あれ?なにすんだっけ?( ゚д゚)?


End Sub


ここで手が止まった方、正解です(笑)。このあたりで躓くのは、初心者なら普通です。大丈夫です。どうすれば日本語で出来るのでしょうか?

VBAでやりたいことを実際にエクセルでやればいい!


実際にやりたいことをエクセルでやってみるのです。簡単ですよね?エクセルを使うだけですから。その動作を覚えておいて、日本語で書けばいいんです。なんてシンプル!目からうろこ!

じゃあ、やってみましょう!


えぇっと・・・会社名はわかってるので、この会社名の商品のリストをまず在庫表から「検索」しましょう。在庫表のシートを選択して、Ctrl+Fで検索ボックス出して、会社名を入れて、検索ボタンを押すと・・・お?見つかりましたね。じゃあ見つかった行の商品の在庫を確認してと・・・うんこれは「在庫が必要在庫数よりも多い」ので、この商品はリストにはしないと・・・次を検索しましょう。また見つかりましたね。お!これは「在庫が必要在庫数と同じか少ない」のでこれは商品リストに乗せましょう!この商品名と在庫数とNoと仕入れ値を入れて・・・あれ?仕入れ値って・・・?


仕入れ値がないことに気が付きますね。


仕入れ値について担当者に聞いてみたところ、、、


「価格の7掛けが仕入れ値です。全部切り捨てで。」


だそうです。

えぇっということは、さっきの続きをやると、商品名と在庫数とNoと仕入れ値は価格の0.7切り上げで計算した値を入れて・・・さぁもう一度在庫表に戻って検索ですね。


・・・
・・・
・・・
( ゚д゚)何回やんの?


というわけで全部この会社の商品を検索し終えました!というところまで今の動作を「繰り返す!」わけですね。


さぁ、これで日本語にできました。後はゆっくりこの動作を分割して、日本語にすればいいのです。

  • 会社名わかっている→会社名を変数に入れよう
  • 検索→在庫表シートの会社名の列から会社名を検索
  • 見つかりました→検索結果があれば・・・
  • 見つかった行の商品の在庫を確認→検索結果の行の商品在庫と必要在庫数を比較
  • 在庫が必要在庫数と同じか少ない→在庫 <= 必要在庫数
  • 商品名と在庫数とNoと仕入れ値→その行で必要な情報を発注リスト表へ出力する
  • 仕入れ値は価格の7掛け→仕入れ値=価格*0.7の切り捨て
  • 何回やんの?→最後まで検索しきるまで繰り返す。

できました!これをプログラムに組み込みます!


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 引数:corpName(会社名)
' 会社名に該当して、発注が必要な商品をリストアップする
' メインの処理
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Sub outputOrderProduct(ByVal corpName As String)


    ' 会社名を変数に入れよう
    ' 在庫表シートの会社名の列から会社名を検索
    ' 検索結果があれば・・・
    ' 検索結果の行の商品在庫と必要在庫数を比較
    ' 在庫 <= 必要在庫数
    ' その行で必要な情報を発注リスト表へ出力する
    ' 仕入れ値=価格*0.7の切り捨て
    ' 最後まで検索しきるまで繰り返す。

End Sub

できました・・・。さてどうでしょうか?これでなんとなぁくマクロでやらないといけない処理が見えてきてませんか?変数に格納にするなら変数の宣言が必要だとか、繰り返すってことはFor文が必要だな。とか、検索をするのだからFind関数を使うとか。そのようなイメージを持ってこの日本語を今度はVBAに変換すれば良いのです。


この方法は実は普通のプログラマなら一般的な手順に近いです。ここまできっちりやりはしませんが、頭の中でこんな感じで考えています。複雑な処理はこのように実際に書き出したりして、それを利用してコードに起こすのです。もし、プログラムで何をどう書けばいいのか?手が止まってしまったら是非

まずはやりたいことを日本語で書く


ということをやってみてほしいと思います。


今日はここまで!


かしこ。