マスクなくても大丈夫!! どうも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
実行すると、
このようになりましたか?
処理の流れとして
①変数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になるまで繰り返す
↓こんなイメージ
えっ!?いまいちわかりづらい?
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
動作確認してみてください。
なんとなくわかりましたか?
部品検索プログラム処理の説明
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!?
『お前は何を言ってんだ!?』って感じでしょう(笑)
↓セルの行・列番号はこうでしたよね?
↓リストボックスの行・列番号はこうなってます。
このへんが、ややこしい所なんですよね。
なので、行番号を0行にするために
ListBox1.ListCount – 1
列番号を0列にするために
j – 2としています。
まとめ
ListBox1.AddItem “”(空データを登録)してから
空データを書き換える
ListBox1.List(0, 0)
ただ、1つ1つリストボックスへ登録しているので
登録する点数が多くなると、時間が掛かるとです。
どがんかせんと、いかんとです。
次回 配列変数なるものを使うよ
コメント
はじめまして。
未経験から独学でプログラミングを始めましたが、色々なテキストやサイトで勉強しても途中で挫折し、私には無理だと諦めておりました。
しかしながら、Oregraming 様に出会って、一度も挫折することなく(むしろ楽しく)勉強させていただいてます!
毎回、更新を楽しみにしています(^^)
ありがとうございます!
南様
はじめまして。
コメントありがとうございます。
>むしろ楽しく
嬉しい限りです(笑)
ブログの更新頻度が低いのですが、気長に末永く御愛読頂ければ幸いです。 かしこ