2021年10月4日月曜日

メインフレームの吐き出す日付書式が、バイト数を減らすので簡略化したことからVBAプログラムが必要なんだ ー DateDiff関数(VBA)


上に掲げた画像は、勤務先のメインフレーム電算機から出力されたデータです。
海外取引先から発注されたデータで、ネットを通じて取引先が入力してきます。

不思議なのは、一度入力されたデータが取引先から変更できるというシステム。
だから、希望納期を繰り上げたり、発注数量を変えたりする、自由にしまくり。

シラっと変えてきますが、資本提携の関係で、グループ企業のわがままし放題。
なぜ、こんなことができるかのは、昔のユル~いシステムを使用して来たから。

このため、出荷担当は、この突然の変更をウォッチしていなければなりません。
毎日、この出力されデータをPCのモニター画面を見てチェックする分けですよ。

ところが、このチェックの作業が手作業で行うステップが多くて簡単でもない。
電算化されたから簡単という分けでもなく、覚えこんだりする必要があるんだ。

それで、上の画像は、データもわかりやすいようにサンプルとして出しただけ。
この内、数量の変更は単純な差分なので、エクセルにコピペして計算できます。

問題なのは、日付が繰り上がったりしている場合、計算をどうのように行うか。
まさか、指折り数えて日数カウントだなんて、何時の時代の方法か分からない。

メインフレームの出力データは日付が8桁数値ですが、単純な差し引きは無理。
だって、ひと月は30日で翌月になるから、考慮して計算しなくてはいけない。

例えば、2011102-201025を電卓で計算すると77ですが、実際は8日になる。
エクセルでも、単純で引算したら大けがの元になるので、要注意には違いない。

なので、VBAでDateDiff関数のプログラムを仕込んでを使ってサクッと計算だ。
例えば、DateDiff("d", #2021/11/02#, #2021/10/25#)のコード記述です。

その結果は、”-8”になって8日早まったという回答になり、チェックしやすい。
これで、勝手に納期を変更されても、自動的に計算すれば見落としは防げます。

それで、この関数には引数が3つありまして、最初の”d”では日数の計算です。
残り二つの引数には、変数のDate型を引用するとあるが、この#が分からない。

なんでも、# で囲んだ日付はリテラル値になり、VBAが日付と解釈するらしい。
良く分からんがそういうことにして、一方、”2021/11/02”の文字列の場合だ。

これは、引数を変数で代入する必要があって、Date型の変数宣言をしないとね。
このサンプルコードを紹介しますが、問題はメインフレームの掃き出しデータ。

関数に必要な年月日の間に””/”がないので、これを挟み込まないといけません。
これも、各種関数で年月日に分解して、”/”付きで合成する手の込んだ対策です。

Sub DteDif01()
Dim DateA As String, DateB As String
Dim Dx As Date, Dy As Date, Y1 As String, M2 As String, D3 As String
Dim tmp1 As String, tmp2 As String

DateA = "20211025" 
DateB = "20211102"

Y1 = Left(DateA, 4) ’年だけ取得
M2 = Mid(DateA, 5, 2) ’月だけ取得
D3 = Right(DateA, 2) ’日だけ取得

tmp1 = tmp1 & Y1
tmp1 = tmp1 & "/"
tmp1 = tmp1 & M2
tmp1 = tmp1 & "/"
tmp1 = tmp1 & D3
tmp1 = tmp1 & "" ’****/**/**形式で文字列再合成
Dx = DateValue(tmp1) '日付変換関数

Y1 = Left(DateB, 4)
M2 = Mid(DateB, 5, 2)
D3 = Right(DateB, 2)

tmp2 = ""
tmp2 = tmp2 & Y1
tmp2 = tmp2 & "/"
tmp2 = tmp2 & M2
tmp2 = tmp2 & "/"
tmp2 = tmp2 & D3
tmp2 = tmp2 & ""
Dy = DateValue(tmp2) '日付変換関数

MsgBox DateDiff("d", Dy, Dx) 

End Sub

というわけで、メインフレームのデータ出力は、SQLの書式で出されるらしい。
なんでも、2021-10-01、2021/10/01、20211001など各種形式があるようでバラバラなのですが、メインフレームに文句を言っても仕方ないので、ここはVBAのコードで工夫することに決めた自分なのでした。



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



0 件のコメント:

コメントを投稿