注文書ボタン
注文書ボタンは発注リストから進捗状況が“発注予約”ものをピックアップして注文書を作成します。
ワークシート「発注入力」と「注文書」の間でデータが転送されます。
注文書ボタンの処理の流れ
1. Activeワークシートに「発注書」を指定します。
2. ワークシート「発注書」の入力欄をデータクリアします。
3. ワークシート「発注入力」の発注リスト欄から”発注予約”のオーダーを転記していきます。
4. 初めて転記されたオーダーの仕入先を記録して同一仕入先のオーダーのみ連続で転記します。
5. 転記されたオーダーが0件の場合メッセージ”発注予約がありません。”を表示します。
6. 転記されたオーダーがあった場合、印刷プレビューを表示します。
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にWorksheets(“発注入力”)を代入します。
変数str1に””、空白を代入します。
fに8、hに7を行の起点として値の代入をしていきます。
Do While・・・Loop
Do While DTH1.Cells(h, 5).Value <> “”
・・・省略・・・
h = h + 1
Loop
h = h + 1で参照する行が下に移ります。
Loopまでの処理がDo Whileの条件空でない間、繰り返されます。
現在アクティブなワークシートは“発注書”です。 そのため、DTH1.Cells(h, 5).Value <> “”ではワークシート“発注入力”をDTH1として指定する必要があります。
DTH1.Cells(h, 5).Value <> “”ではワークシート“発注入力”にある発注リストの「登録日付」列の値を参照しています。
「登録日付」列のセルが空でない間、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
ワークシート“発注入力”で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 以外であれば印刷データが転記され、印刷プレビューが表示されます。
ワークシート「注文書」には、事前に印刷範囲の設定をしておきます。