VBA 仕入管理7(注文書)

注文書ボタン

注文書ボタンは発注リストから進捗状況“発注予約”ものをピックアップして注文書を作成します。
ワークシート「発注入力」「注文書」の間でデータが転送されます。

注文書ボタンの処理の流れ

 1. Activeワークシートに「発注書」を指定します。
 2. ワークシート「発注書」の入力欄をデータクリアします。
 3. ワークシート「発注入力」の発注リスト欄から”発注予約”のオーダーを転記していきます。
 4. 初めて転記されたオーダーの仕入先を記録して同一仕入先のオーダーのみ連続で転記します。
 5. 転記されたオーダーが0件の場合メッセージ”発注予約がありません。”を表示します。
 6. 転記されたオーダーがあった場合、印刷プレビューを表示します。

Sub Print_01() ‘発注書印刷プレヴュー
Worksheets(“発注書”).Activate
Worksheets(“発注書”).Range(“B8:I15,B5,I5”).Select
Selection.ClearContents
Dim DTH1 As Object
Set DTH1 = Worksheets(“発注入力”)
str1 = “”
f = 8
h = 7
Do While DTH1.Cells(h, 5).Value <> “”
  If DTH1.Cells(h, 17).Value = “発注予約” Then
    If f = 8 Then ‘仕入先確定
      str1 = DTH1.Cells(h, 7).Value
      Cells(5, 2).Value = DTH1.Cells(h, 7).Value‘仕入先名
     Cells(5, 9).Value = Mid(Date, 1, 4) & Mid(Date, 6, 2) & Mid(Date, 9, 2)‘発注日
    End If
    If str1 = DTH1.Cells(h, 7).Value Then
      Cells(f, 2).Value = DTH1.Cells(h, 9).Value ‘商品名
      Cells(f, 3).Value = DTH1.Cells(h, 10).Value ‘数量
      Cells(f, 4).Value = DTH1.Cells(h, 11).Value ‘単位
      Cells(f, 5).Value = DTH1.Cells(h, 12).Value ‘入目
      Cells(f, 6).Value = DTH1.Cells(h, 13).Value ‘単価
      Cells(f, 7).Value = DTH1.Cells(h, 14).Value ‘金額
      Cells(f, 8).Value = DTH1.Cells(h, 15).Value ‘納期
      Cells(f, 9).Value = DTH1.Cells(h, 16).Value ‘備考
      DTH1.Cells(h, 17).Value = “注文書発行”
      f = f + 1
    End If
  End If
  h = h + 1
Loop
If f = 8 Then
  MsgBox (“発注予約がありません。”)
Else
  Worksheets(“発注書”).PrintPreview EnableChanges:=False
End If
End Sub


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

Worksheets(“発注書”).Activate
Worksheets(“発注書”).Range(“B8:I15,B5,I5”).Select
Selection.ClearContents

アクティブなワークシートを“発注入力”から“発注書”に移します。
発注書詳細欄セル“B8:I15”、宛先欄セル“B5”、日付欄セル“I5”Selectしてから消去します。

Dim DTH1 As Object
Set DTH1 = Worksheets(“発注入力”)
str1 = “”
f = 8
h = 7

DTH1という変数Object、入れ物として使用します。と宣言しています。

DTH1Worksheets(“発注入力”)を代入します。
変数str1に””、空白を代入します。

fに8、hに7を行の起点として値の代入をしていきます。

Do While・・・Loop

Do While DTH1.Cells(h, 5).Value <> “”
      ・・・省略・・・   
      h = h + 1
Loop

Do While は DTH1.Cells(h, 5).Valueが””、空でない間は処理を続けます。と宣言しています。
h = h + 1で参照する行が下に移ります。
Loopまでの処理がDo Whileの条件空でない間、繰り返されます。

現在アクティブなワークシートは“発注書”です。 そのため、DTH1.Cells(h, 5).Value <> “”ではワークシート“発注入力”をDTH1として指定する必要があります。

DTH1.Cells(h, 5).Value <> “”ではワークシート“発注入力”にある発注リストの「登録日付」列の値を参照しています。

「登録日付」列のセルが空でない間Loop処理が繰り返されます。

Do While・・・Loopは慎重に 
Do While・・・Loopは処理を繰り返します。そのため条件を誤ると永遠にLoopします。例えば、上述ではh = h + 1を入力し忘れると永遠にLoopします。テストはじめはブレークポイントなどを設定して確認しながら進めてください。Loopしたら[Ctrl]+[Alt]+[Delete]でタスクマネージャを起動させEXCELを強制終了してください。

  If DTH1.Cells(h, 17).Value = “発注予約” Then
    If f = 8 Then ‘仕入先確定
      str1 = DTH1.Cells(h, 7).Value
      ・・・省略・・・   
    End If
    If str1 = DTH1.Cells(h, 7).Value Then
      ・・・省略・・・   
    End If
  End If

Do While・・・Loopの内側はIf文が入れ子になっています。

ワークシート“発注入力”でQ列「進捗状況」“発注予約”である場合、次のIf文に入ります。

fの値が8であればIf文の中に入ります。

Do While・・・Loop文に入る前にf = 8 に設定されています。つまりDo While・・・Loop処理の初回であることをIf文の条件しています。

str1仕入先名を代入します。

初回に取得した仕入先名と、次の“発注予約”行の仕入先名が同じであれば、If文の中に入り、発注内容を続けて代入します。

     Cells(5, 2).Value = DTH1.Cells(h, 7).Value‘仕入先名
     Cells(5, 9).Value = Mid(Date, 1, 4) & Mid(Date, 6, 2) & Mid(Date, 9, 2)‘発注日

注文書に仕入先名と発注日を注文書に代入しています。

      Cells(f, 2).Value = DTH1.Cells(h, 9).Value ‘商品名
      Cells(f, 3).Value = DTH1.Cells(h, 10).Value ‘数量
      Cells(f, 4).Value = DTH1.Cells(h, 11).Value ‘単位
      Cells(f, 5).Value = DTH1.Cells(h, 12).Value ‘入目
      Cells(f, 6).Value = DTH1.Cells(h, 13).Value ‘単価
      Cells(f, 7).Value = DTH1.Cells(h, 14).Value ‘金額
      Cells(f, 8).Value = DTH1.Cells(h, 15).Value ‘納期
      Cells(f, 9).Value = DTH1.Cells(h, 16).Value ‘備考
      DTH1.Cells(h, 17).Value = “注文書発行”
      f = f + 1

注文書に商品名、数量、単位、入目、単価、金額、納期、備考を代入します。
ワークシート“発注入力”でQ列「進捗状況」“注文書発行”を代入します。
注文書記入欄の行を一つ下に移します。

If f = 8 Then
  MsgBox (“発注予約がありません。”)
Else
  Worksheets(“発注書”).PrintPreview EnableChanges:=False
End If

f = 8 であれば初期値のままということで、進捗状況が“発注予約”のデータが無く、”発注予約がありません。”のメッセージを出して処理を終了します。

f = 8 以外であれば印刷データが転記され、印刷プレビューが表示されます。
ワークシート「注文書」には、事前に印刷範囲の設定をしておきます。

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