Worksheet_Changeはワークシートのセルの内容に変化(change)があった事で起動します。
まずはWorksheet_Changeイベントの下記のプログラムコードについて以下の順にご確認ください。
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
On Error GoTo jump1
cr1 = Target.Row
cc1 = Target.Column
If cr1 = 5 Then
‘商品CODEで情報取得
If cc1 = 8 Then
cnt = UCase(Target.Value)
PickC1 (cnt)
End If
‘仕入商品名でCODE呼出
If cc1 = 9 Then
cnt = “*” & UCase(Target.Value) & “*”
PickC2 (cnt)
Cells(4, 1).Value = “商品CODE”
Cells(4, 2).Value = “商品名”
Cells(4, 3).Value = “備考”
End If
‘単価、数量で金額計算
If cc1 = 10 Or cc1 = 13 Then
Cells(5, 14).Value = Cells(5, 10).Value * Cells(5, 13).Value
End If
End If
Application.EnableEvents = True
Exit Sub
jump1:
MsgBox (“入力内容に問題があります。”)
Application.EnableEvents = True
End Sub
構成
Private Sub Worksheet_Change(ByVal Target As Range)は以下の構成で成り立っています。
- 処理準備
- 商品CODEで情報取得
- 仕入商品名でCODE呼出
- 単価、数量で金額計算
- 後処理
If文でセル位置を特定
セルが特定の位置で変更されたことを条件に処理が始まります。それ以外のセルだとEnd Ifまで処理がジャンプします。
If文の中にあるIf文の存在(If cr1 = 5 ThenとEnd Ifの間にIf文が2つあります)
プロジャーの呼び出し
プロジャーの定義は割愛させていただきます。詳しくはVBAプロジャーで検索してみてください。
上の例では枠でくくられた範囲、Private Sub Worksheet_Change(ByVal Target As Range)以下で一つのプロジャーです。
赤字で示したPickC2 (cnt),PickC2 (cnt)も一つのプロジャーです。
プロジャーの中で別のプロジャーを呼び出ししています。
一節ずつ解説していきます。
Application.EnableEvents
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
ループを防ぐためにApplication.EnableEvents = FalseとApplication.EnableEvents = Trueでセルに値を代入する部分(change)を囲みループを回避します。
Target
cr1 = Target.Row
cc1 = Target.Column
On Error
On Error Resume Next
On Error 以降にエラーが発生した場合、エラーを無視して次の行に処理が進みます。
エラー処理には他にも多くの方法がありますのでVBAエラー処理で検索してみてください。
If文とプロジャーの呼び出し
CODEで仕入商品呼出
If cr1 = 5 Then
’商品CODEで情報取得
If cc1 = 8 Then
cnt = UCase(Target.Value)
PickC1 (cnt)
End If
・・・中略・・・
End If
- If cr1 = 5 Then 入力された行が5行目のとき
- If cc1 = 8 Then かつ8列であった場合
- cnt = UCase(Target.Value) セルの内容を変数cntに代入します。
- PickC1 (cnt) セルの内容を代入した変数cntとともにプロジャー名PickC1 (cnt)へ処理が飛びます。
仕入商品名でCODE呼出
If cc1 = 9 Then
cnt = “*” & UCase(Target.Value) & “*”
PickC2 (cnt)
Cells(4, 1).Value = “商品CODE”
Cells(4, 2).Value = “商品名”
Cells(4, 3).Value = “備考”
End If
・・・中略・・・
End If
再計算
’単価、数量で金額計算
If cc1 = 10 Or cc1 = 13 Then
Cells(5, 14).Value = Cells(5, 10).Value * Cells(5, 13).Value
End If
- If cr1 = 5 Then 入力された行が5行目のとき
- If cc1 = 10 Or cc1 = 13 Then かつ(10列目または13列)であった場合
- N5 = J5*M5 が計算され、答えをセルN5代入します。
次回は赤字のSubプロジャーPickC1 (cnt)、PickC2 (cnt)について中身を見ていきます。
VBA 仕入管理3