引数値渡しを使ってメーカー名登録・削除プログラムをまとめる 【VBA在庫管理#20】

Excel VBA 部品在庫管理アイキャッチ画像部品在庫管理

すき家にするか吉野家にするか震える、どうもoReです。

今回は、引数を使用してメーカー名登録・削除のプログラムをまとめていきます。

すき家か吉野家で震えてる場合じゃないですなw
※修正しました(*ノωノ)
きんた様、ありがとうございます。

引数(ひきすう)値渡し Byval

・Byval バァィヴァル

valは、Valueの略です。

 

引数とは、値のやり取りを行うものです。

 

Range(“A1”)

(“A1”)←これが引数です。

Rangeの引数にA1という値を渡すことで、セルA1だよ!!となります。

 

MsgBox “こまけぇこたぁいいんだよ”

“こまけぇこたぁいいんだよ”←これも引数

MsgBoxの引数に、こまけぇこたぁいいんだよを渡してます。

 

試しに使ってみましょう。

・標準モジュールを挿入します。

標準モジュール挿入

 

Module1という標準モジュールが挿入されるので、
Module1に下記のように書いてみてください。

Sub 牛丼屋(ByVal 丼サイズ As String)
  MsgBox 丼サイズ
End Sub
Sub oRe()
  Call 牛丼屋("並盛")
End Sub

※プロシージャ名や変数名・引数名は日本語でもOKです。

 

そうしたら、oReプロシージャ内のどこかを選択して
Sub/ユーザーフォームの実行ボタンをクリックしましょう。

Subユーザーフォームの実行

メッセージボックスに並盛と表示されましたか?

 

値を受け取る側(牛丼屋)

値を受け取る箱(引数)を用意します。

Sub 牛丼屋(ByVal 丼サイズ As String)
Sub プロシージャ名(ByVal 引数名 As データ型)

 

値を渡す側(oRe)

プロシージャを呼び出して値を渡します。

Call 牛丼屋("並盛")
Call プロシージャ名(渡す値)

 

流れとして

①牛丼屋プロシージャを呼び出して、引数である丼サイズ並盛を渡す
(店員に並盛を注文する)
②牛丼屋プロシージャの引数である丼サイズに並盛が入る
(厨房に並盛がオーダーされる)
③メッセージボックスに引数である丼サイズに入っている並盛を表示する
(並盛が出てくる)

 

では、もう少し手を加えてみましょう。

  ↓このように書いてみてください。

Sub 牛丼屋(ByVal 丼サイズ As String, ByVal 数量 As Integer)
  If 丼サイズ = "並盛" Then '引数の丼サイズが並盛の場合
    MsgBox 500 * 数量 & "円" '500×引数の数量&円
  ElseIf 丼サイズ = "大盛" Then '引数丼のサイズが大盛の場合
    MsgBox 600 * 数量 & "円" '600×引数の数量&円
  End If
End Sub
Sub oRe()
  Call 牛丼屋("並盛", 1) '引数に並盛と1を渡す
End Sub

 

牛丼屋プロシージャの引数(丼サイズ数量)へ渡す値を変更すると、
メッセージボックスの内容が変化します。

Call 牛丼屋(“並盛”, 1)の場合、メッセージは500円となり、
Call 牛丼屋(“大盛”, 2)の場合、メッセージは1200円となります。

 

複数の引数を書く場合

値を受け取る側(牛丼屋)

Sub プロシージャ名(第1引数, 第2引数, ・・・)

 

値を渡す側(oRe)

Call プロシージャ名(第1引数に渡す, 第2引数に渡す, ・・・)

 

このように、値を渡すことを値渡し(ByVal)といい、
もうひとつ参照渡し(ByRef)というものがあります。

詳しくは、ググってね。

 

メーカー名登録・削除プログラムまとめ

それでは、部品登録フォームのメーカー名を、設定シートに登録・削除する
プログラムを値渡しを使ってまとめていきます。

先ほど作った標準モジュールのModule1に書きましょう。

'設定シートにメーカー名登録・削除処理
Public Sub ComboTS() 'ComboBoxTourokuSakuzyoみたいな(笑)
End Sub

 

とりあえず、使用する変数の宣言と共通するコードを書きます。

'設定シートにメーカー名登録・削除処理
Public Sub ComboTS()
  Dim Knskcell As Range
  Dim YN As VbMsgBoxResult
  Dim LastRow As Long

    '↓標準モジュールにコードを書く場合 どこのコンボボックスか指定しないとエラーが出るよ
  If Touroku.ComboBox1 = "" Then
    Exit Sub
  Else
    Set Knskcell = Sheet3.Columns("A").Find(what:=Touroku.ComboBox1.Text, lookat:=xlWhole)
    'ここに登録・削除処理を書くよ
  End If
 End Sub

 

登録処理と削除処理を分岐させる引数を作り処理を分岐させましょう。

'設定シートにメーカー名登録・削除処理
Public Sub ComboTS(ByVal TS As String) '引数TSを作るよ
  Dim Knskcell As Range
  Dim YN As VbMsgBoxResult
  Dim LastRow As Long

  If Touroku.ComboBox1 = "" Then
    Exit Sub
  Else
    Set Knskcell = Sheet3.Columns("A").Find(what:=Touroku.ComboBox1, lookat:=xlWhole)
    If TS = "T" Then '引数TSがTだった場合
      If Knskcell Is Nothing Then
        YN = MsgBox("メーカー : " & Touroku.ComboBox1 & vbCrLf & vbCrLf & _
              "このメーカー名を登録しますか?", vbYesNo + vbQuestion, "登録確認")
        If YN = vbYes Then
          LastRow = Sheet3.Cells(Rows.Count, 1).End(xlUp).Row
          Sheet3.Cells(LastRow + 1, 1) = Touroku.ComboBox1
          MsgBox Touroku.ComboBox1 & "を登録しました。"
        End If
      End If
    ElseIf TS = "S" Then '引数TSがSだった場合 修正 (*ノωノ)
      If Not Knskcell Is Nothing Then
        YN = MsgBox("メーカー : " & Touroku.ComboBox1 & vbCrLf & vbCrLf & _
              "このメーカー名の登録を削除しますか?", vbYesNo + vbQuestion, "登録削除確認")
        If YN = vbYes Then
          Knskcell.Delete
          MsgBox Touroku.ComboBox1 & "を削除しました。"
          Touroku.ComboBox1 = ""
        End If
      End If
    End If
  End If
End Sub

 

これでメーカー名登録・削除のプログラムがまとまったので、
次はComboTSを呼び出して値渡しをします。

 

Tourokuフォームモジュールの、ComboBox1_KeyDownプロシージャを変更します。

'設定シートにメーカー名登録処理
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 13 Then
    Call ComboTS("T") 'ComboTSの引数TSにTを渡すよ
    Call UserForm_Initialize
  End If
End Sub

 

Tourokuフォームモジュールの、ComboBox1_DblClickプロシージャを変更します。

'設定シートのメーカー名削除処理
Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  Call ComboTS("S") 'ComboTSの引数TSにSを渡すよ
  Call UserForm_Initialize
End Sub

 

これで、設定シートにメーカー名の登録・削除ができると思います。

動作確認してみてください。

ちゃんと登録・削除できていますか?

oReのぞき見

KeyDownとDblClickプロシージャの引数

ComboBox1_KeyDownプロシージャの引数

ByVal KeyCode As MSForms.ReturnIntegerは、
マイクロソフトが決めたキーコード(数値)が引数KeyCodeに入ります。

ByVal Shift As Integerは、
Shiftキーを押した時は引数Shiftに1が入り、Shiftキーを押してない時は0が入ります。

 

ComboBox1_DblClickプロシージャの引数

ByVal Cancel As MSForms.ReturnBooleanは、
引数CancelにTrueかFalseが入るらしいけど、使いどころがいまいちわからんとです。

 

まとめ

引数 値のやり取りを行うもの
値を受け取る側
Sub プロシージャ名(ByVal 引数名 As データ型)
Sub プロシージャ名(第1引数, 第2引数, ・・・)
値を渡す側
Call プロシージャ名(渡す値)
Call プロシージャ名(第1引数に渡す, 第2引数渡す, ・・・)

なんでプログラムをまとめる必要があるかって?
それは、次回わかると思います。

全米が泣くよ!! 多分…

oRe牛丼特盛

次回 ComboTSプロシージャをもう少し改良していくよ

ExcelVBA部品在庫管理【目次】へ戻る

コメント

  1. きんた より:

    はじめまして。
    初めてのVBAなのですが、本サイトで勉強させて頂いております。
    所々、ミスなどでコンパイルエラーを繰り返し試行錯誤しています。
    素人の私の指摘なので私の理解が悪いだけかもしれないのですが、後に本サイトで勉強される方の為にコメントさせて頂きます。
    本稿の『登録処理と削除処理を分岐させる引数を作り、処理を分岐させましょう。』の中の
    『Else If TS = “S” Then ’引数TSがSだった場合』の部分において構文エラーが発生しました。
    Elseで改行する事により構文エラーを回避。
    『Ifブロックに対応するEnd Ifがありません。』がでますが、下の方にEnd Ifを作成し回避しました。
    まだ途中なので間違いかもしれませんので管理人様にてご確認頂ければと思います。

    • oReoRe より:

      きんた様
      はじめまして。
      コメントありがとうございます。

      >『Else If TS = “S” Then ’引数TSがSだった場合』の部分において構文エラーが発生しました。

      確認しました。
      ElseとIfの間にスペースが入っておりましたw

      × Else If TS = “S” Then

      ○ ElseIf TS = “S” Then

      大変助かります!!

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