VBA 仕入管理2(Worksheet_Change1)

Worksheet_Changeはワークシートのセルの内容に変化(change)があった事で起動します。
まずはWorksheet_Changeイベントの下記のプログラムコードについて以下の順にご確認ください。

Private Sub Worksheet_Change(ByVal Target As Range)

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)は以下の構成で成り立っています。

  1. 処理準備
  2. 商品CODEで情報取得
  3. 仕入商品名でCODE呼出
  4. 単価、数量で金額計算
  5. 後処理

If文でセル位置を特定

セルが特定の位置で変更されたことを条件に処理が始まります。それ以外のセルだとEnd Ifまで処理がジャンプします。
If文の中にあるIf文の存在(If cr1 = 5 ThenEnd 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

Worksheet_Changeイベントはワークシートに変更があったときに起動するため、Worksheet_Changeイベント内にセル内容の変更(change)の記述があった場合にループ(繰り返し)してしまいます。
ループを防ぐためにApplication.EnableEvents = FalseApplication.EnableEvents = Trueでセルに値を代入する部分(change)を囲みループを回避します。
プログラム開発中、試行段階でApplication.EnableEvents = Falseの状態でエラーを発生することがよくあります。それ以降プログラムは起動しませんので、一旦EXCELファイルの保存、再起動が必要です。

Target

cr1 = Target.Row
cc1 = Target.Column

現在選択したセルのTarget.Rowは行、Target.Columnは列を取得します。

On Error

On Error Resume Next

On Errorはエラーが発生したときの処理を決めます。
On Error 以降にエラーが発生した場合、エラーを無視して次の行に処理が進みます。
エラー処理には他にも多くの方法がありますのでVBAエラー処理で検索してみてください。

If文とプロジャーの呼び出し

CODEで仕入商品呼出

If cr1 = 5 Then
  ’商品CODEで情報取得
  If cc1 = 8 Then
   cnt = UCase(Target.Value)
   PickC1 (cnt)
  End If
  ・・・中略・・・
End If

  1. If cr1 = 5 Then 入力された行が5行目のとき
  2. If cc1 = 8 Then かつ8列であった場合
  3. cnt = UCase(Target.Value) セルの内容を変数cntに代入します。
  4. 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 cr1 = 5 Then 入力された行が5行目のとき
  • If cc1 = 9 Then かつ9列目であった場合
  • cnt = UCase(Target.Value) セルの内容を変数cntに代入します。
  • PickC2 (cnt) セルの内容を代入した変数cntとともにプロジャー名PickC2 (cnt)へ処理が飛びます。
  • Cells(4, 1).Value = “商品CODE” セルA4に”商品CODE”の文字列を代入します。
  • Cells(4, 2).Value = “商品名” セルB4に”商品名”の文字列を代入します。
  • Cells(4, 3).Value = “備考” セルC4に”備考”の文字列を代入します。
  • 再計算

      ’単価、数量で金額計算
      If cc1 = 10 Or cc1 = 13 Then
       Cells(5, 14).Value = Cells(5, 10).Value * Cells(5, 13).Value
      End If

    1. If cr1 = 5 Then 入力された行が5行目のとき
    2. If cc1 = 10 Or cc1 = 13 Then かつ(10列目または13列)であった場合
    3. N5 = J5*M5 が計算され、答えをセルN5代入します。

    次回は赤字のSubプロジャーPickC1 (cnt)、PickC2 (cnt)について中身を見ていきます。
    VBA 仕入管理3

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