車のエンジン付近からピーって音がするんだが!! どうも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』から始まるんです。
↓こんなイメージ
まあ、インデックス0を使わなければいいだけなんですが、
頭の片隅にでも入れておいてください。
ちなみに、インデックス0をなくすこともできます。
↓こんな感じに変更
Sub test()
Dim TestData(1 To 2) As String
TestData(1) = "あ"
TestData(2) = "い"
MsgBox TestData(0)
End Sub
実行すると
(# ゚Д゚)『インデックス0はねーよ!!宣言してねーだろ!!』となります。
二次元配列
配列変数の宣言
Dim 変数名(要素数, 要素数) As データ型
Sub test()
Dim TestData(2, 2) As String
TestData(1, 1) = "あ"
TestData(1, 2) = "い"
MsgBox TestData(1, 1)
End Sub
↓こんなイメージ
もちろん、インデックス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)以外で実行してみて。
ちゃんとデータ入ってますか?
セルの範囲を変数にぶっこむと、インデックスが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
動作確認してみてください。
ちゃんと検索できてますか?
まとめ
Dim 変数名(要素数) As データ型
Dim 変数名(要素数, 要素数) As データ型
次回 Buhinknskプロシージャの説明などなど
コメント
oRe 様
いつも楽しくブログを拝見させていただいております。
#27までは初心者ながらもどうにかプログラミングを進められていたんですが、#28でついに壁にぶち当たってしまいました。
というのも、部品検索のプロシージャを入力し、動作確認をしてみると、「配列の次元が一致していません。」とエラーが出てしまいます。(コードはコピペさせていただいてます。)
どこを修正すれば解決できるのか教えていただけないでしょうか。
Dq1c3様
はじめまして。
コメントありがとうございます。
>「配列の次元が一致していません。」とエラーが出てしまいます。
私もブログのコードをコピペして確認しましたが、
エラーは出ませんでした。
誤字脱字ではない様です。
↑Kensakuフォームのモジュール変数になっていますか?
※Kensakuフォーム内のコードの一番上に書いていますか?