すき家にするか吉野家にするか震える、どうもoReです。
今回は、引数を使用してメーカー名登録・削除のプログラムをまとめていきます。
※修正しました(*ノωノ)
きんた様、ありがとうございます。
引数(ひきすう)値渡し 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 牛丼屋(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
これで、設定シートにメーカー名の登録・削除ができると思います。
動作確認してみてください。
ちゃんと登録・削除できていますか?
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引数渡す, ・・・)
なんでプログラムをまとめる必要があるかって?
それは、次回わかると思います。
全米が泣くよ!! 多分…
次回 ComboTSプロシージャをもう少し改良していくよ
コメント
はじめまして。
初めてのVBAなのですが、本サイトで勉強させて頂いております。
所々、ミスなどでコンパイルエラーを繰り返し試行錯誤しています。
素人の私の指摘なので私の理解が悪いだけかもしれないのですが、後に本サイトで勉強される方の為にコメントさせて頂きます。
本稿の『登録処理と削除処理を分岐させる引数を作り、処理を分岐させましょう。』の中の
『Else If TS = “S” Then ’引数TSがSだった場合』の部分において構文エラーが発生しました。
Elseで改行する事により構文エラーを回避。
『Ifブロックに対応するEnd Ifがありません。』がでますが、下の方にEnd Ifを作成し回避しました。
まだ途中なので間違いかもしれませんので管理人様にてご確認頂ければと思います。
きんた様
はじめまして。
コメントありがとうございます。
>『Else If TS = “S” Then ’引数TSがSだった場合』の部分において構文エラーが発生しました。
確認しました。
ElseとIfの間にスペースが入っておりましたw
× Else If TS = “S” Then
○ ElseIf TS = “S” Then
大変助かります!!