配列変数を使って、リストボックスに登録する 【VBA在庫管理#28】

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

車のエンジン付近からピーって音がするんだが!! どうもoReです。

今回は、配列変数を使っていきます。

配列変数

変数は、データを入れる箱でしたよね?

配列変数は、変数の集合体

データを入れる箱がいっぱいある感じです。
ただそれだけです(笑)

配列変数

 

試しに使ってみましょう。

 

一次元配列

配列変数の宣言

Dim 変数名(要素数) As データ型

 

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

Sub test()
  Dim TestData(2) As String

  TestData(1) = "あ"
  TestData(2) = "い"

  MsgBox TestData(1)
End Sub

 

実行すると

MsgBox TestData(1)の場合、メッセージは『あ』となり、
MsgBox TestData(2)の場合は『い』となります。

 

ちなみに、MsgBox TestData(3)にすると

インデックスが有効範囲にありません

(# ゚Д゚)『インデックス3はねーよ!!宣言してねーだろ!!』ってことです。

 

・Index インデェクス

インデックスは、『索引』『指数』という意味みたいです。

 

しかし、MsgBox TestData(0)として実行してみると、
空白のメッセージが表示されます。

そうです、配列変数も前回のリストボックス同様『0』から始まるんです。

  ↓こんなイメージ

TestData(2)イメージ

 

まあ、インデックス0を使わなければいいだけなんですが、
頭の片隅にでも入れておいてください。

 

ちなみに、インデックス0をなくすこともできます。

  ↓こんな感じに変更

Sub test()
  Dim TestData(1 To 2) As String

  TestData(1) = "あ"
  TestData(2) = "い"

  MsgBox TestData(0)
End Sub

 

実行すると

(# ゚Д゚)『インデックス0はねーよ!!宣言してねーだろ!!』となります。

oReのぞき見

二次元配列

配列変数の宣言

Dim 変数名(要素数, 要素数) As データ型

 

Sub test()
  Dim TestData(2, 2) As String

  TestData(1, 1) = "あ"
  TestData(1, 2) = "い"

  MsgBox TestData(1, 1)
End Sub

 

  ↓こんなイメージ

TestData(2,2)イメージ

 

もちろん、インデックス0をなくすこともできます。

Sub test()
Dim TestData(1 To 2, 1 To 2) As String

  TestData(1, 1) = "あ"
  TestData(1, 2) = "い"

  MsgBox TestData(0, 1)
End Sub

 

なんとなく、配列変数なるものがわかりましたか?

(# ゚Д゚)『わかんねーよ!!』

という方は、ググってね。

ではでは、部品検索プログラムを作りこんでいきますか。

 

部品検索プログラム変更

リストボックスに1つ1つ登録すると時間が掛かるので、
Like演算子に引っ掛かったデータをListにして、
リストボックスに登録してあげればいいわけです。

とりあえず、データベースのセルデータを配列変数に入れてみます。

変数名はDataBaseとし、Kensakuフォームのモジュール変数としますか。

Dim DataBase As Variant 'DataBaseはバリアント型だよ

※Variant型は、なんでもOKの型

 

(# ゚Д゚)『配列変数の要素数はどうした!!』って?

こまけぇこたぁ気にしない(笑)

 

Kensakuフォームのイニシャライズに追加

'部品検索フォーム初期化
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
End Sub

 

一応、DataBaseにデータが入っているか確認しておきましょうか。

'部品検索フォーム初期化
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 DataBase(0, 0)
End Sub

 

実行してみると、

(# ゚Д゚)『インデックス0はねーよ!!宣言してねーだろ!!』となります(笑)

 

まあまて、MsgBox DataBase(0, 0)以外で実行してみて。

ちゃんとデータ入ってますか?

oReのぞき見

セルの範囲を変数にぶっこむと、インデックスが1からになるみたいです。

ややこしや・・・詳しくはググってね。

 

そうしたら、DataBase変数内でLike演算子に引っ掛かったデータを、
もう一つの配列変数にぶっこみましょう。

 

モジュール変数にKnskDataを追加

Dim KnskData As Variant 'KnskDataはバリアント型だよ

 

新たに部品検索するプロシージャを作成します。

'DataBaseから部品検索→KnskDataへデータ格納
Private Sub Buhinknsk()
  Dim i As Long, cn As Long

  cn = 0

  For i = LBound(DataBase) To UBound(DataBase)
    If DataBase(i, 5) Like "*" & TextBox1.Value & "*" Then
      cn = cn + 1
    End If
  Next i
  If cn = 0 Then
    ReDim KnskData(0)
    KnskData(0) = "NoData"
    Exit Sub
  Else
    ReDim KnskData(1 To cn, 1 To 5)
    cn = 0
    For i = LBound(DataBase) To UBound(DataBase)
      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
End Sub

 

テキストボックス1チェンジを変更

'部品検索処理
Private Sub TextBox1_Change()

  ListBox1.Clear 'リストボックスクリア
  If TextBox1 = "" Then '空白の場合
    Exit Sub '処理から抜ける
  Else
    Call Buhinknsk
    ListBox1.List = KnskData 'リストボックス1のListにKnskDataを登録する
  End If
End Sub

 

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

ちゃんと検索できてますか?

oReのぞき見

まとめ

配列変数は、変数の集合体
一次元配列
 Dim 変数名(要素数) As データ型
二次元配列
 Dim 変数名(要素数, 要素数) As データ型

oReの車異音

次回 Buhinknskプロシージャの説明などなど

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

コメント

  1. Dq1c3 より:

    oRe 様
    いつも楽しくブログを拝見させていただいております。
    #27までは初心者ながらもどうにかプログラミングを進められていたんですが、#28でついに壁にぶち当たってしまいました。
    というのも、部品検索のプロシージャを入力し、動作確認をしてみると、「配列の次元が一致していません。」とエラーが出てしまいます。(コードはコピペさせていただいてます。)
    どこを修正すれば解決できるのか教えていただけないでしょうか。

    • oReoRe より:

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

      >「配列の次元が一致していません。」とエラーが出てしまいます。

      私もブログのコードをコピペして確認しましたが、
      エラーは出ませんでした。

      誤字脱字ではない様です。

      Dim DataBase As Variant
      Dim KnskData As Variant
      

      ↑Kensakuフォームのモジュール変数になっていますか?

      ※Kensakuフォーム内のコードの一番上に書いていますか?

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