VBA 仕入管理8(計上)

前回までに注文書の発行まで進めてきました。このあと実業務として注文書がメールやFAXで注文先の送信され、材料が手配され、最終的には納品されます。納品された材料は注文内容と照合され計上処理されます。
システム上の処理の流れは、該当する行の「進捗状況」Q列をクリックして「注文書発行」から「入荷済」に変更します。数量や納入日に変更がある場合には直接セルの変更を行います。
続いて「計上」ボタンを押すと仕入実績にデータが転記されます。
「入荷済」処理のプログラムは「仕入管理4(Worksheet_SelectionChange)」後半部分で説明しています。

「計上」ボタンのmodule全体

Sub Reg_071() ‘仕入計上

Application.EnableEvents = False

‘仕入実績テーブル最下行の取得
Set DTH1 = Worksheets(“仕入実績”).Range(“A1”).CurrentRegion
 rc1 = DTH1.Rows.Count + 1

‘ID番号の作成
Dim maxVal As Long
 maxVal = Application.WorksheetFunction.Max(Range(DTH1.Cells(2,1), DTH1.Cells(rc1, 1)))
 maxVal = maxVal + 1

‘データ登録(計上予約テーブルから仕入実績へ)
h = 7
f = 0

Do While Cells(h, 5).Value <> “”
 If Cells(h, 17).Value = “入荷済” Then
  DTH1.Cells(rc1, 1).Value = maxVal

  For k = 5 To 16
   DTH1.Cells(rc1, k – 3).Value = Cells(h, k).Value
  Next

  DTH1.Cells(rc1, 14).Value = Left(Cells(h, 15).Value, 6) ‘入荷月
   maxVal = maxVal + 1
   rc1 = rc1 + 1

  Range(Cells(h, 2), Cells(h, 18)).Delete ‘予約リストから行削除

  h = h – 1
  f = f + 1

 End If

h = h + 1

Loop

If f = 0 Then
 MsgBox (“該当がありません。”)
Else
 MsgBox (“登録されました。”)
End If

Application.EnableEvents = True

End Sub

一説ずつ解説していきます。

データ登録準備

仕入実績テーブル、データ範囲の設定

‘仕入実績テーブルデータ範囲最下行の取得
 Set DTH1 = Worksheets(“仕入実績”).Range(“A1”).CurrentRegion
  rc1 = DTH1.Rows.Count + 1

仕入実績テーブル最下行の取得ではCurrentRegionを使用してデータ範囲設定
DTH1.Rows.Countで最下行を取得します。
最下行に1を足して、転記する行とします。

ID番号の作成

‘ID番号の作成
 Dim maxVal As Long
 maxVal = Application.WorksheetFunction.Max(Range(DTH1.Cells(2,1), DTH1.Cells(rc1, 1)))
  maxVal = maxVal + 1

ID番号の作成ではアプリケーション関数を利用して仕入実績テーブルA列ID番号の最大値を取得します。

Application.WorksheetFunction.Max(Range(DTH1.Cells(2,1), DTH1.Cells(rc1, 1)))
最大値に1を足して新規のID値とします。

データ登録

予約テーブルから仕入実績へデータを転記します。ここでいう計上予約テーブルとはワークシート「発注入力」E5セル以下のデータです。ここにはQ列進捗状況が「発注予約」「注文書発行」「入荷済」の3種類のパターンがあります。
その中から「入荷済」データを抽出してデータを転記しています。

Do While…Loop,IF…Then…End if

Do While Cells(h, 5).Value <> “”
 If Cells(h, 17).Value = “入荷済” Then

(中略1)

 End If
 h = h + 1
Loop

Do While…Loopを使って、登録データの有無をE列の空欄を確認しながら見ていきます。
仮に、手入力で空欄行があると、そこで処理が止まってしまいます。
入力修正を行うセルを除いて、ワークシートの保護を使うなど対策が必要です。
Q列の進捗状況「入荷済」を抽出してデータ登録します。

データ転記と消去

(中略1)の中身

 DTH1.Cells(rc1, 1).Value = maxVal

 For k = 5 To 16
  DTH1.Cells(rc1, k – 3).Value = Cells(h, k).Value
 Next

 DTH1.Cells(rc1, 14).Value = Left(Cells(h, 15).Value, 6) ‘入荷月
  maxVal = maxVal + 1
  rc1 = rc1 + 1
 Range(Cells(h, 2), Cells(h, 18)).Delete ‘予約リストから行削除
 h = h – 1

maxValには先ほど取得したID番号最大値が入っています。
DTH1には Set DTH1 = Worksheets(“仕入実績”).Range(“A1”).CurrentRegion
でワークシート「仕入実績」のデータ範囲が設定されています。
DTH1.Cells(rc1, 1).Value = maxVal
ではID番号
For k = 5 To 16
 DTH1.Cells(rc1, k – 3).Value = Cells(h, k).Value
Next
では入荷処理した内容
DTH1.Cells(rc1, 14).Value = Left(Cells(h, 15).Value, 6)
では入荷日を利用して入荷月を作成、登録しています。
Range(Cells(h, 2), Cells(h, 18)).Deleteでは仕入実績へ転記が終了した行の削除をしています。
また、h = h – 1でDELETEした分hのカウントを一つ引きます。

登録完了メッセージ

f = f + 1

If f = 0 Then
 MsgBox (“該当がありません。”)
Else
 MsgBox (“登録されました。”)
End If

データ登録をfの値でカウントしています。0であれば「該当がありません」0でなければ「登録されました」をメッセージで返します。

Application.EnableEvents = False
Application.EnableEvents = True

については「VBAプログラム(ワークシートイベント1)」Application.EnableEventsをご参照ください。

次回は集計とグラフについて作成していきます。

タイトルとURLをコピーしました