VBA 仕入管理5(登録ボタン)

これまでワークシートイベントを記述してきました。
次にワークシートに配置されたボタンについてmoduleにプログラムを書いていきます。
初めに「登録」ボタンの動作について記述していきます。
上部に配置された青色のボタン群は「メニュー」「挿入」から「図形」「テキスト」を使用して作成しました。
作成したボタンを右クリックして「マクロの登録」を選択、作成したマクロ名を選択して「OK」して連結します。連結するためのマクロ(プロジャー)を先に作成します。

「登録」ボタン全体像

登録時の動作

 1. 未入力項目の処理(発注日、仕入先名称、商品名、数量、納期欄の空白を確認します。)
 2. 希望納期の適正確認(曜日の確認、当日納期)
 3. 発注予定リストに登録する行の取得(R5セルの空白を確認で新規、編集を判断)
 4. 発注予定リストにデータ登録
 5. 入力欄の消去

「登録」ボタンのmodule全体

Sub Reg_07() ‘発注登録

Application.EnableEvents = False
On Error GoTo jump3

‘登録日空の処理
If Cells(5, 5).Value = “” Then
  Cells(5, 5).Value = Mid(Date, 1, 4) & Mid(Date, 6, 2) & Mid(Date, 9, 2)
End If

‘仕入先名称、商品名、数量欄空白時の処理
If Cells(5, 7).Value = “” Or Cells(5, 9).Value = “” Or Cells(5, 10).Value = “” Then
  MsgBox (“未入力の項目があります。”)
  GoTo jump3
End If

‘単価空白、金額0の確認
If Cells(5, 13).Value = “” Or Cells(5, 14).Value = 0 Then
  res = MsgBox(“金額が0です処理を続けますか?”, vbYesNo)
  If res = vbNo Then
    GoTo jump3
  End If
End If

‘希望納期の適正確認
Dim Dd As String
Dim Dt As Date
Dd = Cells(5, 15).Value
Dt = Mid(Dd, 1, 4) & “/” & Mid(Dd, 5, 2) & “/” & Mid(Dd, 7, 2)
If Weekday(Dt) = 1 Or Weekday(Dt) = 7 Then
  res = MsgBox(“納期が土日です処理を続けますか?”, vbYesNo)
  If res = vbNo Then
    GoTo jump3
  End If
End If

If Dt <= Date Then
  res = MsgBox(“納期が今日以前です処理を続けますか?”, vbYesNo)
  If res = vbNo Then
    GoTo jump3
  End If
End If

‘登録行の確認
If Cells(5, 18).Value = “” Then
‘新規
‘発注予定リスト行の挿入
  Range(“E7:R7”).Select
  Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

‘データ登録
  Cells(5, 17).Value = “発注予約”
  For k = 5 To 17
    Cells(7, k).Value = Cells(5, k).Value
  Next
Else
  ‘修正行の上書き
  h = Cells(5, 18).Value
  For k = 5 To 17
    Cells(h, k).Value = Cells(5, k).Value
  Next
End If

MsgBox (“登録されました。”)

ActiveSheet.Range(“E5:R5”).Select
Selection.ClearContents
Range(“E5”).Select

jump3:
Application.EnableEvents = True

End Sub

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

module1の準備

ワークシートの中で「Alt」+「F11」(端末によって「Fn」キーも同時に押してください)でVBE画面が開きます。

 1. メニュー「挿入」から標準モジュールをクリックしてmodule1を作成します。
 2. 右上の欄に「Sub Reg_07」と入力してEnterを押します。
    Reg_07はmoduleの名称です、名称は変更可能です。
 3. ()とEnd Subが自動的に入力されます。
 4. 後ほどボタンと名称を連結します。

「登録」ボタン詳細

入力されていない項目の確認

Application.EnableEvents の説明は仕入管理2“Application.EnableEvents”を参照してください。
On Error GoTo jump3は、それ以下の処理にERRORが発生した場合にjump3まで処理を飛ばします。
手入力した内容の確認をしていくとき、想定外の入力などでERRORが発生する可能性があるためです。

‘登録日空白時の処理
If Cells(5, 5).Value = “” Then
   Cells(5, 5).Value = Mid(Date, 1, 4) & Mid(Date, 6, 2) & Mid(Date, 9, 2)
End If

L5セルが空欄であれば、今日の日付を文字列にして代入します。
Mid(Date・・)の説明は仕入管理4“日付の取得”を参照してください。

‘仕入先名称、商品名、数量の空白の確認
If Cells(5, 7).Value = “” Or Cells(5, 9).Value = “” Or Cells(5, 10).Value = “” Then
  MsgBox (“未入力の項目があります。”)
    GoTo jump3
End If

G5セル仕入先名、I5セル商品名、J5セル数量が空白であることを確認して ”未入力の項目があります。” のメッセージを出してjump3まで処理を飛ばします。

‘単価空白、金額0の確認
If Cells(5, 13).Value = “” Or Cells(5, 14).Value = 0 Then
   res = MsgBox(“金額が0です処理を続けますか?”, vbYesNo)
    If res = vbNo Then
      GoTo jump3
    End If
End If

M5セル単価が空白、N5セル金額が0の場合
MsgBox(“金額が0です処理を続けますか?”, vbYesNo)でメッセージボックスが表示され“はい”または“いいえ”の選択を促します。
選択の結果を変数resに代入し、”はい”の選択の場合res = vbyesとなりプログラムは下に流れます。
“いいえ”の選択の場合res = vbNoとなりjump3まで処理を飛ばします。

希望納期の適正確認

‘希望納期の適正確認
Dim Dd As String
Dim Dt As Date
Dd = Cells(5, 15).Value
Dt = Mid(Dd, 1, 4) & “/” & Mid(Dd, 5, 2) & “/” & Mid(Dd, 7, 2)

変数Ddを文字列、Dtを日付形式に宣言します。
曜日を判定するためO5セル納期に入っている文字を日付形式に戻しています。
本システムでは日付をすべて文字列としています。必要に応じて日付形式に戻しています。

If Weekday(Dt) = 1 Or Weekday(Dt) = 7 Then
   res = MsgBox(“納期が土日です処理を続けますか?”, vbYesNo)
   If res = vbNo Then
     GoTo jump3
   End If
End If

Weekday(Dt) = 1は日曜日Weekday(Dt) = 7は土曜日をIF文で判断しています。
MsgBox(“納期が土日です処理を続けますか?”, vbYesNo)でメッセージボックスが表示され”はい”または”いいえ”の選択を促します。
選択の結果を変数resに代入し結果”はい”の選択の場合res = vbyesとなりプログラムは下に流れます。
“いいえ”の選択の場合res = vbNoとなりjump3まで処理を飛ばします。

If Dt <= Date Then
  res = MsgBox(“納期が今日以前です処理を続けますか?”, vbYesNo)
  If res = vbNo Then
    GoTo jump3
  End If
End If

納期が今日以前の場合に注意を促します。If Dt = Date Then
MsgBox(“納期が今日以前です処理を続けますか?”, vbYesNo)でメッセージボックスが表示され”はい”または”いいえ”の選択を促します。
選択の結果を変数resに代入し結果”はい”の選択の場合res = vbyesとなりプログラムは下に流れます。
“いいえ”の選択の場合res = vbNoとなりjump3まで処理を飛ばします。

発注リストに登録する行の取得

‘登録行の確認
If Cells(5, 18).Value = “” Then
‘新規
  (省略)
Else
‘修正行の上書き
  (省略)
End if

If Cells(5, 18).Value = “” Thenで空白であれば新規登録、そうでなければ修正へ処理が分岐します。

データ登録 ’新規

‘発注予定リスト行の挿入
  Range(“E7:R7”).Select
  Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

  ‘データ登録
  Cells(5, 17).Value = “発注予約”
  For k = 5 To 17
    Cells(7, k).Value = Cells(5, k).Value
  Next

新規登録は必ず7行目に行を追加して記録します。最新のオーダーを最上部に記録します。
  
Range(“E7:R7”).Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
進捗状況には“発注予約”を代入します。 For文を使って5行目のデータを7行目に代入します。

データ登録 ’修正行の上書き

h = Cells(5, 18).Value
For k = 5 To 17
  Cells(h, k).Value = Cells(5, k).Value
Next

後ほど説明する「呼出」でCells(5, 18).Valueには発注リストの中から呼び出しした行の値が入ります。 行の値をhに代入して For文を使って5行目のデータをh行目に上書きします。

入力欄消去

MsgBox (“登録されました。”)

ActiveSheet.Range(“E5:R5”).Select
Selection.ClearContents
Range(“E5”).Select

jump3:
Application.EnableEvents = True

End Sub

登録処理が終了したらメッセージ (“登録されました。”)を表示します。

ActiveSheet.Range(“E5:R5”).Select
Selection.ClearContents で入力欄を消去します。
カーソルをE5セルにセットします。
jump3:は途中に何度か出てくるGoTo jump3のジャンプ先です。

セル内容の変更を伴うため冒頭にApplication.EnableEvents = Falseで他のプログラムに作動を制御します。
そして終了時には必ずApplication.EnableEvents = Trueを記述してもとに戻します。
Application.EnableEvents = True以前にエラーで処理が止まると、Application.EnableEvents = FalseのままとなりVBAによる反応がしなくなります。
その場合は保存終了後、再度起動してください。

VBAシステム(仕入管理5)moduleでは登録用のmoduleを作成しました。
作成したmoduleワークシート上のボタン連結方法を紹介した後、VBAシステム(仕入管理6)moduleでは呼出、クリア、削除、注文書ボタンを作成していきます。

moduleとワークシート上のボタンを連結

上部に配置された青色のボタン群は「メニュー」「挿入」から「図形」「テキスト」を使用して作成しました。 上の図は、作成したボタンを右クリックして「マクロの登録」を選択、作成したプログラム名(Reg_07)を選択して「OK」して連結した様子です。

次回は呼出、クリア、削除ボタンについて解説していきます。

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