2021年10月26日火曜日

VBAの自動実行で、互換性を保持するために残されている方法とはいうけれど、非常に便利なイベントプロシージャではある ー Auto_Open(VBA)

      
受注情報の前日当日の差分を抽出するVBAプログラムが、一通り完成しました。
一段落した際中ですが、今回のプログラミングで使用した小技を紹介致します。

大した話ではないのですが、ノウハウとしてはかなり役に立つのではないかな。
それで、今回のプログラムは、ブックに何も情報を残さない、単なる箱物です。

要は、ブックを開くとVBAコードを自動実行して、外部のブックを操作します。
この自動実行では、Workbook_OpenとAuto_Openの二種類を使用しました。

というより、別々に作ったVBAコードを一つのブックに合体して実行させます。
このため、プログラムの構造が各々で完結しており、これ以上は変えたくない。

となれば、自動実行を二段階で行う作戦で、この二うのコマンドを使いました。
Workbook_Openのコマンドは、ThisWorkbookのオブジェクトに記述します。

ここでは、メインフレームの出力したCSVファイルを、書式を整えて保存です。
この自動実行プロシージャでは、Callによるプロシージャの呼び出しをします。

一連の作業が終われば自動実行は終了しますが、新たに別の自動実行が必要だ。
このため、標準モジュールの中に、Auto_Openのコマンドを書き入れました。

ここでも、Callによるプロシージャ呼び出しをしますが、データ比較が中心だ。
前日の受注情報が、当日の情報とどのように変化しているかの差分取りなんだ。

取り消されたり、新規に追加されたり、数量や価格が書き換えられたりもする。
これまで、こういった内容のチェックを手作業だったというのが驚愕でしたな。

  Private Sub Workbook_Open() ’ThisWorkbookに記述 
    Call Message
  End Sub
  Private Sub Message()
    MsgBox "WorkBook_Openで開く"
  End Sub

  Private Sub Auto_Open() ’標準モジュールに記述 
    Call Message
  End Sub
  Private Sub Message()
    MsgBox "Auto_Openで開く"
  End Sub

それで、上に挙げたコードは実行する手順の概念だけを示したサンプルなんだ。
他のノウハウとしては、プロシージャの記述を、”Private”としているところか。

同じプロシージャ名でも、オブジェクト内からだけの呼び出ししかできません。
同じ名称で使い回しができたりしますので、シンプルにコードが書けるのです。

というわけで、Callによるプロシージャの呼び出しでは、孫Callまで実行です。
これは、変数渡しのプロシージャ呼び出しなのですが、例えば、Call ~(tmp)で変数を渡しても、渡されたプロシージャ内から、新たに別のプロシージャへ同じ変数を渡してCallで呼び出すのに、同じ変数名は使えませんので、tmp=tmp2のように変数を一度置き換えてから、Call ~(tmp2)で渡し直すなど、それなりのアイデアで乗り切ったプログラミングなのでした。

※サンプルコード(孫Callまでの変数渡しによるプロシージヤ呼び出し)
 Private Sub Workbook_Open()
   Dim tmp As String
     tmp = "Workbook_Openで開く"
       Call Message(tmp)
 End Sub
 Private Sub Message(ByVal tmp As String)
   Dim tmp2 As String
     tmp2 = tmp
       Call Message2(tmp2)
 End Sub
 Private Sub Message2(ByVal tmp2 As String)
    MsgBox tmp2
 End Sub



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿