LBound・UBound関数とReDimの使い方 【VBA在庫管理#29】

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

車のタービン死亡の様です、どうもoReです(涙目)

今回は、前回作成したBuhinknskプロシージャの説明などをしていきますぅぅ(涙目)

LBound関数 UBound関数

・Bound バァゥンドゥ

Boundは、『跳ねる』のほかに、
『境界』『限界』という意味みたいです。

 

・LはLower(ロォゥア)の略で、『下のほうの』という意味みたいです。

LBoundは、下のほうの限界

 

・UはUpper(アパァ)の略で、『上のほうの』という意味みたいです。

UBoundは、上のほうの限界

 

LBound関数の構文

LBound(arrayname [ ,dimension ] )

 

UBound関数の構文

UBound(arrayname [ ,dimension ] )

 

・array アレェィ

arrayは、『整列』『配列』という意味みたいです。

 

arraynameは、まんま配列名(配列変数名)ということになります。
構文の[]の部分は省略可能、ちなみにdimensionは『次元』でしたよね。
次元を指定するときに使用します。

 

つまり、

LBound関数の引数に、配列変数を渡してあげると
配列変数の下のほうの限界、
最初のインデックス番号を返してくれます。

 

UBound関数の引数に、配列変数を渡してあげると
配列変数の上のほうの限界、
最後のインデックス番号を返してくれます。

 

部品検索フォームのイニシャライズで確認してみましょう。

'部品検索フォーム初期化
Private Sub UserForm_Initialize()
  Dim LastRow As Long

  ListBox1.ColumnCount = 5
  ListBox1.ColumnWidths = "50;50;100;100;100"

  With Sheet1 'データベースをDataBaseへ格納
    LastRow = .Cells(Rows.Count, 2).End(xlUp).Row
    DataBase = .Range(.Cells(6, 2), .Cells(LastRow, 17)).Value
  End With
  MsgBox "最初のインデックスは" & LBound(DataBase) & vbCrLf & _
      "最後のインデックスは" & UBound(DataBase)
End Sub

 

実行してみると、

LBound UBoundメッセージ確認

となります。

それでは、前回作成したBuhinknskプロシージャの説明をしていきます。

 

Buhinknskプロシージャ説明

 

For i = LBound(DataBase) To UBound(DataBase) 'DataBaseの最初~最後のインデックスまでぶん回すぜ!! ヒーハー!!
  If DataBase(i, 5) Like "*" & TextBox1.Value & "*" Then 'DataBase5列目がLikeに引っ掛かった場合
    cn = cn + 1 'カウントするよ
  End If
Next i

↑この部分は、DataBaseの最初のインデックス番号から、
最後のインデックス番号までFor文でぶん回して、
DataBase5列目のデータでLike演算子に引っ掛かった数を数えています。

 

ReDim

・Re レェィ

Reは、『再び』という意味みたいです。

 

ReDim(Dimension)つまり、再び次元を変えるよってことで、
配列変数の要素数を変更する時に使います。

 

If cn = 0 Then 'カウントが0の場合
  ReDim KnskData(0) 'KnskDataの要素数を0に変更
  KnskData(0) = "NoData"
  Exit Sub

↑この部分は、Like演算子に引っ掛かった数が0だった場合、
KnskDataの要素数を0に変更し、KnskDataの要素0にNoDataを入れて処理を抜けています。

Like演算子に引っ掛かった数が0だった場合、リストボックスにNoDataを表示させています。

 

『つーか要素数0なら、普通の変数でいいんでない?』

と思ったあなた、イイね!! だが、ダメなんだ(笑)

KnskDataエラー

(# ゚Д゚)『Listは配列形式じゃないとゆるさん!!インデックスねーだろ!!』ってことです。

 

通常は、1つのデータを登録する場合ListBox1.AddItemを使用します。

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

 

インデックスが付いていれば、配列変数となるようなので
0のインデックスを付けています。

 

↓こんな感じ

oRe『お代官様(VBA)、こちらインデックス0をつけた配列変数で御座います。ヒッヒッヒッ』

VBA『越後谷(oRe)、そちもワルよの~。グフフフフ』

oReのぞき見

 

Else 'カウントが0じゃない場合
  ReDim KnskData(1 To cn, 1 To 5) 'KnskDataの要素数を二次元配列に変更 行は1~cn分 列は1~5
  cn = 0 'カウントリセット
  For i = LBound(DataBase) To UBound(DataBase) 'もう1回ぶん回すぜ!! Heehaw!!
    If DataBase(i, 5) Like "*" & TextBox1.Value & "*" Then
      cn = cn + 1 'カウントするよ
      KnskData(cn, 1) = DataBase(i, 1) '部品管理№
      KnskData(cn, 2) = DataBase(i, 2) 'バーコード
      KnskData(cn, 3) = DataBase(i, 3) 'メーカー
      KnskData(cn, 4) = DataBase(i, 4) '品名
      KnskData(cn, 5) = DataBase(i, 5) '型式
    End If
  Next i
End If

↑この部分は、Like演算子に引っ掛かった数が0じゃなかった場合、
KnskDataの要素数の行(インデックス)を1からカウントした分に変更し、列を1~5列に変更。

 

そんで、もう1回ぶん回してDataBase5列目のデータで、
Like演算子に引っ掛かった行(インデックス)の1~5列を
KnskDataにぶっこんでリストボックスに表示させています。

 

まとめ

LBound関数
最初のインデックス番号
LBound(arrayname [ ,dimension ] )
UBound関数
最後のインデックス番号
UBound(arrayname [ ,dimension ] )
ReDim 配列変数の要素数を変更
KnskData(0)こちら、配列変数で御座います。ヒッヒッヒッ

oReタービン死亡

次回 OptionButtonを使ってみるよ

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

コメント

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