HOME

 

Excel VBAデータベースシステム入門

 

 

出荷処理

 

出荷処理の機能として2つあります。またその中に複数の機能があります。

 

1.未出荷受注残全検索

未出荷の受注を表示する。

1.1受注残テーブルより未出荷の検索

1.2在庫数の表示

 

2.出荷

出荷処理する。(在庫がある場合)

   2.1出荷帳票の作成

   2.2受注残テーブルへの出荷実績の登録

2.3在庫入出庫テーブルへの出庫実績の登録

2.4在庫数の再表示

 

順に製作していきます。

 

1.1受注残テーブルより未出荷の検索

受注残テーブルの検索プログラムはすでに作成済みです。

未出荷のみ表示するよう製作します。赤色部修正。

 

Sub 未出荷受注残全検索()

Application.Calculation = xlManual

Sheets("受注残").DrawingObjects("sql").Characters.Text = "出荷日 IS NULL"

 

'フィルタ解除

Set BK = ActiveWorkbook

Set INS = BK.Sheets("受注残")   '入力出力シート

 If INS.AutoFilterMode Then

   INS.Range("$A2").AutoFilter

 End If

受注残データベース検索高速貼付

受注残旧データ式コピー

 

EN = INS.Range("$A65536").End(xlUp).Row

 

Application.Calculation = xlAutomatic

End Sub

 

リストを品目コード、受注日順にします。赤色部修正。

 

Sub 受注残データベース検索高速貼付2()

'追加貼り付け

Dim rst As Object

Dim NewDB As Object

Dim BK, OUS, STRSQL, CNT, OU

Set rst = CreateObject("ADODB.Recordset")

Set NewDB = CreateObject("ADODB.Connection")

'Application.DisplayAlerts = False ''メッセージ非表示

Application.ScreenUpdating = False  ''画面表示無

Set BK = ActiveWorkbook ''THISWORKBOOK

Set OUS = BK.Sheets("受注残")

Call dbopen(NewDB) ''データベースとの接続

STRSQL = "SELECT 受注番号,受注日,顧客名,顧客住所,品目コード,数量,品名,単価,金額,出荷日,更新日時 FROM 受注残"

STRSQL = STRSQL & " WHERE " & OUS.DrawingObjects("sql").Characters.Text

STRSQL = STRSQL & " ORDER BY 品目コード,受注日;"

rst.Open STRSQL, NewDB, 3, 1  ''''adOpenStatic, adLockReadOnly

CNT = rst.RecordCount ''''件数

OU = OUS.Range("$A65536").End(xlUp).Row + 1 ''5 ''追加出力

Dim MM(1 To 11)

  If Not (rst.EOF) Then  ''データあり?

     Do Until rst.EOF

        For J = 1 To 11

          MM(J) = rst.Fields(J - 1).Value

        Next J

        OUS.Range("$A" & OU).Resize(, 11).Value = MM

       OU = OU + 1

       rst.MoveNext   ''次のデータ

       Application.StatusBar = OU - 1 & "<-" & CNT + 2

     Loop

  End If

  rst.Close

  Set rst = Nothing

End Sub

 

 

1.2在庫数の表示

 

在庫数は在庫テーブルから持ってくるのと同時に、在庫入出庫テーブルも参照します。

本システムでは在庫テーブルは都度更新せず、在庫入出庫テーブルの変化分を加え、在庫を計算する方式を取ります。

(この考え方により、高度なシステムとされる在庫システムを容易に製作できます。)

 

Sub 在庫テーブルキー検索()

'在庫数は 在庫データと 在庫入出庫より検索 (在庫データは更新しない)

'在庫シートの$A3以下を検索

Dim cmd As Object

Dim rst As Object

Dim NewDB As Object

 

Set cmd = CreateObject("ADODB.Command")

Set rst = CreateObject("ADODB.Recordset")

Set NewDB = CreateObject("ADODB.Connection")

 

'Application.DisplayAlerts = False 'メッセージ非表示

Application.ScreenUpdating = False  '画面表示無

 

Set BK = ActiveWorkbook 'THISWORKBOOK

Set INS = BK.Sheets("受注残")

EN = INS.Range("$A65536").End(xlUp).Row

 

Call dbopen(NewDB) 'データベースとの接続

 

STRSQL = "PARAMETERS dkey Value;"

STRSQL = STRSQL & "SELECT 在庫数,"

STRSQL = STRSQL & "(SELECT SUM(数量) FROM 在庫入出庫 WHERE 在庫.品目コード=在庫入出庫.品目コード AND 区分=1 AND 在庫更新日 IS NULL),"

STRSQL = STRSQL & "(SELECT SUM(数量) FROM 在庫入出庫 WHERE 在庫.品目コード=在庫入出庫.品目コード AND 区分=2 AND 在庫更新日 IS NULL)"

STRSQL = STRSQL & " FROM 在庫 "

STRSQL = STRSQL & " WHERE 品目コード=[dkey] ;"

 

cmd.ActiveConnection = NewDB

cmd.CommandText = STRSQL

cmd.CommandType = 1 ''adCmdText

''

For I = 3 To EN

    cmd.Parameters("dkey") = "" & INS.Range("$E" & I).Value ''キー

    Set rst = cmd.Execute '''検索実行

   If Not (rst.EOF) Then  'データあり?

         INS.Range("$L" & I).Value = rst.Fields(0).Value + Val("" & rst.Fields(1).Value) - Val("" & rst.Fields(2).Value)

   End If

    Application.StatusBar = I & "<-" & EN

  Next I

  On Error Resume Next

  rst.Close

  Set rst = Nothing

  Set cmd = Nothing

  Set NewDB = Nothing

End Sub

 

 

DBキー検索を使って作成し、赤色部を修正しました。

副問い合わせという方法でSELECT文の中にSELECT文を記入し、その品目の入庫数、出庫数を求めています。

在庫数+入庫数-出庫数を計算し、L列に出力しています。

在庫更新日がNULLでないものは在庫テーブルに反映済みのため集計しません。

 

2.1出荷帳票の作成

 

Sub 出荷帳票計算式記録出力() ' IN OUT 出荷帳票

I = Sheets("受注残").Range("処理行").Value

 

Set INS = Sheets("出荷帳票")   '入力出力シート

    INS.Range("$C$5").Value = Sheets("受注残").Range("D" & I).Value

    INS.Range("$C$6").Value = Sheets("受注残").Range("C" & I).Value

    INS.Range("$C$9").Value = Sheets("受注残").Range("E" & I).Value

    INS.Range("$D$9").Value = Sheets("受注残").Range("G" & I).Value

    INS.Range("$F$9").Value = Sheets("受注残").Range("F" & I).Value

    INS.Range("$G$9").Value = Sheets("受注残").Range("H" & I).Value

    INS.Range("$H$9").Value = Sheets("受注残").Range("I" & I).Value

End Sub

 

選択した行がSheets("受注残").Range("処理行").Valueに入っています。

その行のデータから単純な出荷帳票を作成するマクロを手作成しました。

 

 

2.2受注残テーブルへの出荷実績の登録

 

自動作成されたマクロをそのまま利用します。

実行する前に、出荷実績日欄に日付を記入しておきます。

 

Sub 受注残変更行更新()

'フィルタ解除

Set BK = ActiveWorkbook

Set INS = BK.Sheets("受注残")   '入力出力シート

 If INS.AutoFilterMode Then

   INS.Range("$A2").AutoFilter

 End If

'Application.ScreenUpdating = True

受注残更新判断式コピー

受注残データベース更新挿入

受注残旧データ式コピー

End Sub

 

 

2.3在庫入出庫テーブルへの出庫実績の登録

 

在庫入出庫シートに出庫データを記入します。

記入後、自動作成された 在庫入出庫テーブル挿入を実行します。

 

 

このマクロを手作成しました。品目, 数量をパラメータとして渡します。

 

Sub 出庫追加(品目, 数量)

Set OUS = Sheets("在庫入出庫")

OUS.Range("A3:IV65536").ClearContents

OUS.Range("B3").Value = 品目

OUS.Range("C3").Value = 2 '出庫

OUS.Range("D3").Value = Now '出庫日

OUS.Range("E3").Value = 数量 '出庫数

OUS.Range("G3").Value = Now '更新日

 

在庫入出庫テーブル挿入

End Sub

 

2.4在庫数の再表示

 

出荷すると在庫が減ります。

在庫数を再計算して表示します。

1.2在庫数の表示」をもう一度実行します。多少時間を短くするために出荷した品目コードだけを再計算するよう工夫します。

 

2出荷

 

出荷のマクロは以上のマクロを順に実行します。

在庫有無チェックなど多少工夫し、下記のように手作成しました。

この中で、在庫テーブルキー検索は検索する行範囲をパラメータで指定できるよう改定しました。

 

Sub 出荷()

= Selection.Row

Sheets("受注残").Range("処理行").Value =

出荷済 = Sheets("受注残").Range("J" & ).Value

If 出荷済 <> "" Then

  MsgBox ("その行は出荷済みです")

  End

End If

選択セル在庫チェックと出庫追加

 

出荷帳票計算式記録出力 ' IN 処理行 OUT 出荷帳票

Sheets("出荷帳票").Select

End Sub

 

Sub 選択セル在庫チェックと出庫追加()

= Sheets("受注残").Range("処理行").Value

品目 = Sheets("受注残").Range("E" & ).Value

数量 = Sheets("受注残").Range("F" & ).Value

Call 在庫テーブルキー検索A(, ) 'OUT 受注残

 

在庫 = Sheets("受注残").Range("L" & ).Value

If 在庫 < 数量 Then

  MsgBox ("在庫数" & 在庫 & " 数量不足のため出荷できません")

  End

End If

Call 出庫追加(品目, 数量)

Sheets("受注残").Range("J" & ).Value = Now '出荷日

受注残変更行更新

Call 在庫再表示(品目)

End Sub

 

Sub 在庫再表示(品目) 'この品目の在庫を再表示 品目は連続

EN = Sheets("受注残").Range("A65536").End(xlUp).Row

ST = 0

For I = 3 To EN

 If ST = 0 And 品目 = Sheets("受注残").Range("E" & I).Value Then ST = I '開始

 If ST <> 0 And 品目 <> Sheets("受注残").Range("E" & I).Value Then

   EN2 = I - 1  '終了

   Exit For

 End If

Next I

Call 在庫テーブルキー検索A(ST, EN2)

End Sub

 

 

HOME