For~For入れ子(Nest・ネスト)の使い方と、リストボックス登録 【VBA在庫管理#27】

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

マスクなくても大丈夫!! どうもoReです。

今回は、前回作成した部品検索プログラムの説明をしていきます。

入れ子 Nest(ネスト)

前回のリストボックスに登録するプログラムは、
下記のように書きました。

'部品検索処理
Private Sub TextBox1_Change()
  Dim LastRow As Long, i As Long, j As Long

  ListBox1.Clear 'リストボックスクリア
  With Sheet1
    LastRow = .Cells(Rows.Count, 4).End(xlUp).Row
    For i = 6 To LastRow
      If TextBox1 = "" Then '空白の場合
        Exit Sub '処理から抜ける
      ElseIf .Cells(i, 6) Like "*" & TextBox1 & "*" Then 'セルの型式とTextBox1の文字を比較
        ListBox1.AddItem ""
        For j = 2 To 6
          ListBox1.List(ListBox1.ListCount - 1, j - 2) = .Cells(i, j)
        Next j
      End If
    Next i
  End With
End Sub

 

赤い部分、For文(繰り返し処理)の中に、If文(条件分岐)
さらにFor文(繰り返し処理)がはいってます。

 

このような処理を『入れ子』といいます。

入れ子とは、箱の中に、一回り小さい箱が入っている様な物みたいです。

詳しくはググってね。

英語では、Nest(ネェストゥ)と言うみたいです。

 

もちろん、If文(条件分岐)の中に、If文(条件分岐)を入れることも
入れ子(ネスト)といいます。

  ↓If文入れ子 例

If Range("A1") <= 10 Then '10以下
  If Range("A1") >= 5 Then '5以上
    MsgBox "OK"
  Else
    MsgBox "NG"
  End If
Else
  MsgBox "NG"
End If

 

まあ、多重構造の処理?を入れ子(ネスト)といいます。

 

If文の中のIf文は、わかりやすいと思いますが、
For文の中のFor文は、どういう処理するのかわかりにくいと思うので、
試しに使ってみましょう。

 

For~For入れ子

新規ブックのSheet1モジュールに下記のように書いてみてください。

Sub test()
  Dim i As Integer, j As integer

  For i = 1 To 10 'iは1から10まで繰り返す
    For j = 1 To 5 'jは1から5まで繰り返す
      Cells(i, j) = 1 'セルに1を入れる
    Next j
  Next i
End Sub

 

実行すると、

For~For入れ子

このようになりましたか?

 

処理の流れとして

①変数iに1が入る

②変数jに1が入る

③Cells(i, j)つまり、Cells(1, 1)つまりつまり、セルA1に1が入る

④変数jに2が入る←ここ重要!!

⑤Cells(i, j)つまり、Cells(1, 2)つまりつまり、セルB1に1が入る

※変数jが5になるまで繰り返す(⑥~⑪)
(つまり、セルA1からセルE1に1を入れる)

⑫変数iに2が入る

⑬変数jに1が入る

⑭Cells(i, j)つまり、Cells(2, 1)つまりつまり、セルA2に1が入る

⑮変数jに2が入る←また、変数jが5になるまで繰り返す
(つまり、セルA2からセルE2に1を入れる)

  ↓

※変数iが10になるまで繰り返す

  ↓こんなイメージ

For入れ子イメージ

 

 

えっ!?いまいちわかりづらい?

oReびっくり

 

OK!! メッセージボックスに表示させましょう。

  ↓こんな感じに追加

Sub test()
  Dim i As Integer, j As integer

  For i = 1 To 10 'iは1から10まで繰り返す
    For j = 1 To 5 'jは1から5まで繰り返す
      MsgBox "Cells(" & i & "," & j & ")に1を入れるよ"
      Cells(i, j) = 1 'セルに1を入れる
    Next j
  Next i
End Sub

 

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

なんとなくわかりましたか?

oReのぞき見

部品検索プログラム処理の説明

TextBox1の文字列のようなものがあった場合(1個目)、
リストボックスに登録するプログラム

 

・リストボックスに空のデータを登録する

ListBox1.AddItem ""

 

・登録したい列番号分繰り返す
※iは行番号(For i = 6 To LastRow)

登録したい列番号

For j = 2 To 6 '2列から6列まで繰り返す

Next j

 

・リストボックスに登録した空データを書き換える
※ここが肝になります。

ListBox1.List(ListBox1.ListCount - 1, j - 2) = .Cells(i, j)

 

ListBox1.ListCountは、リストボックスに登録されている
リスト(行)が何行あるのか数えています。

 

リストボックスに1個空データを登録したので、
ListBox1.ListCountは、1(行)となりますよね?

 

ただ、空データが入っているリストボックスの行番号は、0行に入っているんです!!

なので、ListBox1.ListCount – 1することで、0行にしています。

 

What!?
『お前は何を言ってんだ!?』って感じでしょう(笑)

 

↓セルの行・列番号はこうでしたよね?

ExcelCells画像

 

リストボックスの行・列番号はこうなってます。

リストボックス行列番号

 

このへんが、ややこしい所なんですよね。

なので、行番号を0行にするために
ListBox1.ListCount – 1

列番号を0列にするために
j – 2としています。

 

まとめ

多重構造の処理を『入れ子』『Nest(ネェストゥ)』という
リストボックスに複数列登録する場合
ListBox1.AddItem “”(空データを登録)してから
空データを書き換える
ListBox1.ListCount リスト(行)が何行あるのか数える
リストボックスの先頭行は0行、先頭列は0列
ListBox1.List(0, 0)

 

ただ、1つ1つリストボックスへ登録しているので
登録する点数が多くなると、時間が掛かるとです。

どがんかせんと、いかんとです。

oReヘルメット最強

次回 配列変数なるものを使うよ

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

コメント

  1. より:

    はじめまして。
    未経験から独学でプログラミングを始めましたが、色々なテキストやサイトで勉強しても途中で挫折し、私には無理だと諦めておりました。
    しかしながら、Oregraming 様に出会って、一度も挫折することなく(むしろ楽しく)勉強させていただいてます!
    毎回、更新を楽しみにしています(^^)

    ありがとうございます!

    • oReoRe より:

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

      >むしろ楽しく

      嬉しい限りです(笑)

      ブログの更新頻度が低いのですが、気長に末永く御愛読頂ければ幸いです。 かしこ

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