引数値渡しでまとめたプログラムを使って入出庫者名の登録と削除をする 【VBA在庫管理#21】

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

同期のサクラ(ドラマ)観て全米が泣いてるよね? どうもoReです(泣)。

今回は、ComboTSプロシージャを改良していきます。

変動する部分を引数にする

前回作成したComboTSプロシージャは、
TourokuフォームのComboBox1用のプロシージャとなっています。

これでは、まとめた意味がなく使えない子認定です(泣)。

 

『私には夢があります。
ComboTSを使える有能な子に育てる事です。』

 

要は変動する部分を引数に渡してもらえばいいわけです。

引数の作成

・どこのコンボボックスの登録・削除するの?

ByVal Box As Object

 

・どこのシートに登録・削除するの?

ByVal Ws As Worksheet
※ObjectでもOK

 

・どの列に登録・削除するの?

ByVal Retu As Long

 

・何を登録・削除するの?

ByVal ListName As String

 

'コンボボックス用 シートに登録・削除処理
Public Sub ComboTS(ByVal Box As Object, ByVal Ws As Worksheet, _
          ByVal Retu As Long, ByVal ListName As String, ByVal TS As String)

 

置換

・置換したい部分を選択Ctrl + H置換後の文字列(W):に入力

VBA置換

※対象の部分に注意してね(モジュールかプロシージャでね)
置換?対象?の方はこちら→【VBA在庫管理#14】

  ↓こんな感じ

'コンボボックス用 シートに登録・削除処理
  'Box=ComboBox, Ws=シート, Retu=列番号, ListName=登録削除名, TS=登録(T)or 削除(S)
Public Sub ComboTS(ByVal Box As Object, ByVal Ws As Worksheet, _
          ByVal Retu As Long, ByVal ListName As String, ByVal TS As String)
  Dim Knskcell As Range
  Dim YN As VbMsgBoxResult
  Dim LastRow As Long

  If Box = “” Then
    Exit Sub
  Else
    Set Knskcell = Ws.Columns(Retu).Find(what:= Box, lookat:= xlWhole)
    If TS = “T” Then ‘引数TSがTだった場合
      If Knskcell Is Nothing Then
        YN = MsgBox(ListName & " : ” & Box & vbCrLf & vbCrLf & _
               ”この" & ListName & "名を登録しますか?”, vbYesNo + vbQuestion, “登録確認”)
        If YN = vbYes Then
          LastRow = Ws.Cells(Rows.Count, Retu).End(xlUp).Row
          Ws.Cells(LastRow + 1, Retu) = Box
          MsgBox Box & “を登録しました。”
        End If
      End If
    ElseIf TS = “S” Then ‘引数TSがSだった場合
      If Not Knskcell Is Nothing Then
        YN = MsgBox(ListName & ": ” & Box & vbCrLf & vbCrLf & _ 
              ”この" & ListName &"名の登録を削除しますか?”, vbYesNo + vbQuestion, “登録削除確認”)
        If YN = vbYes Then
          Knskcell.Delete(xlShiftUp) 'セルを削除した際に上にシフトする
          MsgBox Box & “を削除しました。”
          Box = “”
        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(ComboBox1, Sheet3, 1, "メーカー", "T") 'ComboTSに引数を渡すよ
    Call UserForm_Initialize
  End If
End Sub

 

Tourokuフォームモジュールの、ComboBox1_DblClickプロシージャ変更

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

 

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

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

oReのぞき見

※ComboBoxの前に、Tourokuつけなくていいの?

いいんです!!(川平風)

Tourokuフォームモジュール上から引数へ渡しているので省略してもOK

 

ComboBoxへ登録するプログラムも標準モジュールへ書き引数を渡す

TourokuフォームのUserForm_Initializeに書いてある、
ComboBoxへ登録するプログラムを標準モジュール(Module1)に書きましょう。

  ↓こんな感じ

'コンボボックスセット処理
  'Box=ComboBox, Ws=シート, Retu=列番号
Public Sub ComboSet(ByVal Box As Object, ByVal Ws As Worksheet, ByVal Retu As Long)
  Dim LastRow As Long
  Box.Clear
  With Ws
    LastRow = .Cells(Rows.Count, Retu).End(xlUp).Row
    If LastRow = 1 Then '設定シートに1つも登録されていない場合
      Exit Sub 'リストに設定シートの項目を表示させない
    ElseIf LastRow = 2 Then '設定シートに1つしか登録されていない場合
      Box.AddItem .Cells(2, Retu) 'ComboBox.Listに1つのデータを登録できない為AddItemを使う
    Else
      Box.List = .Range(.Cells(2, Retu), .Cells(LastRow, Retu)).Value
    End If
  End With
End Sub

 

TourokuフォームのUserForm_Initializeのプロシージャを変更

'Tourokuフォーム初期化
Private Sub UserForm_Initialize()
  Call ComboSet(ComboBox1, Sheet3, 1) 'ComboSetに引数を渡すよ
End Sub

 

ComboTSプロシージャでComboSetを呼び出す

Module1のComboTSプロシージャの設定シートに登録・削除後にComboSetを呼び出します。

  ↓登録処理後はここに追加

  Ws.Cells(LastRow + 1, Retu) = Box
  MsgBox Box & “を登録しました。”
  ComboSet(Box, Ws, Retu)
End If

 

  ↓削除処理後はここに追加

  MsgBox Box & “を削除しました。”
  Box = “”
  ComboSet(Box, Ws, Retu)
End If

 

こうすることで、メーカー名登録処理メーカー名削除処理
Call UserForm_Initializeを消すことができます。

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

 

※メーカー名削除処理のCall UserForm_Initializeも消してください。

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

ちゃんとコンボボックスに登録できてますか?

oReのぞき見

 

でっ!? 全米は泣いてないんだが?

oReびっくり

まあ、まて…



転←今ここよ!!

Mainフォームの入出庫者名入力をTextBox1からComboBox1へ変更

おまたせしました、全米が泣きますよ!! 多分…

 

Mainフォームテキストボックスコンボボックスに変更します。

TextBox1を選択DeleteComboBox1を挿入

TextBoxからComboBoxへ変更

忘れないように、TexBox1をComboBox1へ置換しましょう。
※対象はモジュールだよ

 

そうしたら、設定シートのセルB1に『入出庫者名登録』と入力し、
設定シートのB列(2列目)に入出庫者名を登録・削除していくようにします。

入出庫者名登録削除

 

MainフォームComboBox1_DblClickと、ComboBox_KeyDownを作成

ダブルクリック、キーダウン作成

KeyDown?の方はこちら→【VBA在庫管理#12】

DblClick?の方はこちら→【VBA在庫管理#18】

 

Mainフォームモジュールの、ComboBox1_KeyDownプロシージャ

'設定シートに入出庫者名登録処理
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 13 Then
    Call ComboTS(ComboBox1, Sheet3, 2, "入出庫者", "T") 'ComboTSに引数を渡すよ
  End If
End Sub

 

Mainフォームモジュールの、ComboBox1_DblClickプロシージャ

'設定シートの入出庫者名削除処理
Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  Call ComboTS(ComboBox1, Sheet3, 2, "入出庫者", "S") 'ComboTSに引数を渡すよ
End Sub

 

Mainフォームモジュールの、UserForm_Initializeプロシージャに追加

'Mainフォーム初期化
Private Sub UserForm_Initialize()
  Dim LastRow As Long

  LastRow = Sheet2.Cells(Rows.Count, 9).End(xlUp).Row
  If LastRow > 2 Then
    ListBox1.ColumnCount = 8
    ListBox1.ColumnWidths = "110;50;40;110;110;120;30;30"
    ListBox1.List = Sheet2.Range("B3:I" & LastRow).Value
  End If
  Call ComboSet(ComboBox1, Sheet3, 2) 'ComboSetに引数を渡すよ
    以下省略
End Sub

 

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

ちゃんと、入出庫者名を登録・削除できてますか?

どう?全米とまではいかなくても、泣けるでしょ!?

oReびっくり

いやいや、コンボボックスを2個しか使ってないから効果がわかりづらいだけよ。
100個コンボボックスを使ってごらんよ!! 泣けるから…

まとめ

変動する部分を引数に渡してもらう

全然泣けねーよって?
OKわかった。次だ次こそは…

oReウォーズマン

次回 プロのグラマーな方達のタブーに迫る(笑)

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

コメント

  1. コーデ より:

    oRe 殿
    コーデと申します。いつも楽しく学ばせて頂いております。(赤霧は美味しいですよね!!)
    この回で、下記モジュール1に、ComboSet(Box, Worksheet, Retu)を追記すると、コンパイルエラーが発生します。表題のPublic Sub ComboTS(ByVal Box~TS As String)に黄色い網掛けが入ります。回避方法をご教示頂けますと助かります。宜しくお願い致します。

    '設定シートにメーカー名登録・削除処理
    Public Sub ComboTS(ByVal Box As Object, ByVal Ws As Worksheet, _
                       ByVal Retu As Long, ByVal ListName As String, ByVal TS As String)  '引数TSを作るよ
        Dim Knskcell As Range
        Dim YN As VbMsgBoxResult
        Dim LastRow As Long
    
        If Box = “” Then
            Exit Sub
        Else
            Set Knskcell = Ws.Columns(Retu).Find(what:=Box, lookat:=xlWhole)
            If TS = “T” Then  '引数TSがTだった場合
                If Knskcell Is Nothing Then
    
                    YN = MsgBox(ListName & ” : ” & Box & vbCrLf & vbCrLf & _
                    “この” & ListName & “名を登録しますか?”, vbYesNo + vbQuestion, “登録確認”)
                    If YN = vbYes Then
                        LastRow = Ws.Cells(Rows.Count, Retu).End(xlUp).Row
                        Ws.Cells(LastRow + 1, Retu) = Box
                        MsgBox Box & “を登録しました。”
                        ComboSet(Box, Worksheet, Retu)
                    End If
                End If
    
            ElseIf TS = “S” Then  '引数TSがSだった場合 修正 (*ノωノ)
                If Not Knskcell Is Nothing Then
                    YN = MsgBox(ListName & ” : ” & Box & vbCrLf & vbCrLf & _
                        “この” & ListName & “名の登録を削除しますか?”, vbYesNo + vbQuestion, “登録削除確認”)
                    If YN = vbYes Then
                        Knskcell.Delete (xlShiftUp)  'セルを削除した際に上にシフトする
                        MsgBox Box & “を削除しました。”
                        Box = “”
                        ComboSet(Box, Ws, Retu)
                    End If
    
    • oReoRe より:

      コーデ様
      コメントありがとうございます。

      >ComboSet(Box, Worksheet, Retu)を追記すると、コンパイルエラーが発生します。

      『Call』が抜けておりました。

      Call ComboSet(Box, Worksheet, Retu)
      

       

      大変たすかります。

       

      Ps.入出庫履歴のほうは解決されましたか?

      あと、赤霧は最高ですw

  2. コーデ より:

    oRe殿
    ご返信ありがとうございます!! 助かりました。自分の理解不足で恐縮です。
    入出庫履歴は、まだ未解決です。。。何で表示されないのでしょうか?? ヒントがあればご教示ください。

    PS.私は赤霧を真冬はお湯を少し入れて楽しみ、その他通年ロックです!! でも、ここ数年コンビニとかで売り始めて
      ちょっと香が薄らいだ気がしてます、、、oRe殿はそんな感じしませんか??

  3. コーデ より:

    oRe殿
    ご返信ありがとうございます。
    Call ComboSet(Box, Worksheet, Retu) に、してみましたが、担当者名登録もメーカー名登録も、
    「登録しました」の表示の後に、登録のCall ComboSet(Box, Worksheet, Retu)部分が、黄色アミになり登録できません。「オブジェクトが必要です」と表示がありました。
    何故なのか、わかりません。。。教えてください、宜しくお願いいたします。

    • oReoRe より:

      コーデ様
      コメントありがとうございます。

      >Call ComboSet(Box, Worksheet, Retu) に、してみましたが…

      申し訳ございません。

      Call ComboSet(Box, Ws, Retu)
      

      でどうでしょう?

       

      PS.たしかに、最近コンビニでも売られてますね…

      入出庫履歴のほうは、少しお時間ください。

  4. コーデ より:

    oRe殿

    Wsに変更したら直りました。ありがとうございます。自分でWorksheetに、変更してみたりしていたのを失念しておりました。恐縮です。
    入出庫履歴は、まだ現れません、、、ヒントが分かり次第で結構ですので、ご教示ください。
    私はoRe殿の次講義に進ませて頂きます。

    いつも、早朝にご返信頂いておりますが、体調にはお気を付けください。赤霧もほどほどに、、、
    (人の事言えませんが×××(笑))

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