VBA28_自作フォームに命を吹き込む(下)

こんにちは! Benです。
今日はこの前のオートフィルターオプションを自作する続きで完結編・・・完結するか不安です(^^;

20151216a.gif
使用する表はこのとおりです。1行目にタイトル、2行目に項目名で、3行目からデータになっています。

Private Sub UserForm_Initialize()
 Dim i As Integer, j As Integer, k As Integer, n As Boolean
 
 '判定コンボボックスの初期化
For i = 1 To 2
  With Me.Controls("Hantei" & i)
   .AddItem ("と等しい")
   .AddItem ("と等しくない")
   .AddItem ("より大きい")
   .AddItem ("以上")
   .AddItem ("より小さい")
   .AddItem ("以下")
   .AddItem ("で始まる")
   .AddItem ("で始まらない")
   .AddItem ("で終わる")
   .AddItem ("で終わらない")
   .AddItem ("を含む")
   .AddItem ("を含まない")
  End With
 Next
 
 '値コンボボックスの初期化
 i = 3 'データの始まりの行
 With Worksheets("Sheet1")
  Do Until IsEmpty(.Cells(i, 1)) '作物名のデータがなくなるまでループ
   n = True
   For j = 1 To 2 'コンボボックスのAtai1とAtai2を順次設定するループ
    For k = 0 To Me.Controls("Atai" & j).ListCount - 1 '各コンボボックスの重複チェックのループ
     If Me.Controls("Atai" & j).List(k) = .Cells(i, 2) Then n = False 'すでにリストにあったらFalse
    Next
    If n = True Then Me.Controls("Atai" & j).AddItem (.Cells(i, 2).Value) 'リストにないときは追加
   Next
   i = i + 1 '作物名の次の行に移る
  Loop
 End With

End Sub
いきなりドドーンとコードが出ました。これはフォームの初期化を完結させたものです。前回と変わったところは主に2つ、①Dimの変数の定義を先頭に集約したことと、②後半の値コンボボックスでループを増やして前回は上のAtai1コンボボックスのみにリストを入れましたが、下のAtai2にも入るようにしたことです。

上の判定コンボボックスは前回と同じなので、下の値コンボのほうを説明します。24行目のWithは35行目のEnd Withまでの効力(スコープ)です。前回紹介したように、この間でドット「.」で始まる文は、Withの後に示したオブジェクトについてですよ!というものです。今回はWorkSheets("Sheet1")なのでシート1という名前のワークシートです。25行目のドットで始まる.cells(i,1)WorkSheets("Sheet1").cells(i,1)という意味です。

25行目から34行目は以前紹介した、作物名を1行ずつ調べる方法で、データがなくなるまで(空白かどうか)繰り返します。判定する行を変数iとして、初期値はデータが始まる行の3で、26,29,31行目でi行目の作物名がコンボボックスのリストになかったら追加する作業をします。33行目にiを1増やしてからLoopで戻って次の行のデータを判定し、これをデータがなくなるまで繰り返します。

27行目のForはAtai1とAtai2の二つのコンボボックスに同じ処理をするための繰り返しで、j=1のときはAtai1コンボ、Nextで戻ったj=2のときはAtai2コンボを次の行以降で設定しています。28行目以降は以前のとおりで、既存のItemの数だけ同じのがないか照らし合わせてないときはリストに追加する作業です。複数の繰り返し処理は頭の中で処理のイメージをしなければならないので難しいですが、同じ処理を少ないコードで実行でき、とても効率的です。

20151216b.gif
御覧のようにすべてのコンボボックスの準備ができました。あとは2つのボタンだけ。

20151216c.gif
ボタンをダブルクリックすると御覧のような、「ボタンをクリックしたときに実行するイベントプロシージャ」が現れます。キャンセルのほうには、ユーザーフォームを非表示にするUserForm1.Hideをいれて完成です。OKのほうは・・・また次回にします。完結しなくてすみません

この記事へのコメント


この記事へのトラックバック