画像付きのインターフェイスを作る


最後に、画像付きのインターフェイスを作ってみましょう。ここでは簡単な閲覧しかしませんが、応用すればデータの登録や修正ダイアログボックスとして活用することもできます。ちょっとだけ元データを変えてみます。

[商品マスター] シートには、上のように「単価」と「画像」を追加します。

[売上データ] シートは、上のように「売上コード」を追加しました。作成する UserForm は下のように設計します。

左上が画像を表示する Image1 です。その下の ScrollBar1 を操作すると [売上データ] シートのデータを次々と表示します。各データはテキストボックスに表示します。名前は上から順に TextBox1 ~ TextBox8 です。TextBox7 には「受注数」と「単価」を乗じた金額を計算して表示します。唯一あるコマンドボタンは CommandButton1 です。UserForm を閉じるために使います。

まず、UserForm を開くときに [売上データ] シートに登録されている件数をカウントして、ScrollBar1 の Min プロパティと Max プロパティを設定します。件数のカウントにはワークシート関数の COUNTA 関数です。A 列全体をカウントしているのでタイトル行も含まれてしまいます。設定するときは「-1」します。

Private Sub UserForm_Initialize()
    With ScrollBar1
        .Min = 1
        .Max = WorksheetFunction.CountA(Worksheets("売上データ").Range("A:A")) - 1
        .Value = 1
    End With
End Sub

この UserForm は、スクロール バーの値が変化したときにすべてのデータを更新します。ScrollBar1 の Value プロパティを調べて、もし「2」だったら [売上データ] シートの 2 番目のデータ、つまり 3 行目ですね。こんなときは、Cells より高速な Offset プロパティを使うと便利です。基点を [売上データ] シートのセル A1 とすれば、3 行目データの「売上コード」は .Offset(2,0)、「商品コード」は .Offset(2,1) となります。

Private Sub ScrollBar1_Change()
    Dim c As Long, PicFile As String
    c = ScrollBar1.Value
    With Worksheets("売上データ").Range("A1")
        ''売上コード
        TextBox1 = .Offset(c, 0)
        ''商品コード
        TextBox2 = .Offset(c, 1)
        ''商品名
        TextBox3 = WorksheetFunction.VLookup(.Offset(c, 1), _
                                          Worksheets("商品マスター").Range("A1:B8"), 2)
        ''納品日
        TextBox4 = Format(.Offset(c, 3), "m月d日")
        ''受注数
        TextBox5 = .Offset(c, 2)
        ''単価
        TextBox6 = WorksheetFunction.VLookup(.Offset(c, 1), _
                                           Worksheets("商品マスター").Range("A1:C8"), 3)
        ''金額
        TextBox7 = Format(Val(TextBox5.Text) * Val(TextBox6.Text), "\\#,##")
        ''画像
        TextBox8 = WorksheetFunction.VLookup(.Offset(c, 1), _
                                           Worksheets("商品マスター").Range("A1:D8"), 4)
        
        If TextBox8.Text <> "" Then
            If Dir(TextBox8.Text) <> "" Then Image1.Picture = LoadPicture(TextBox8.Text)
        End If
    End With
End Sub

「商品名」や「単価」は、「リレーショナル データベースのように使う」で解説した VLOOKUP 関数を使います。金額には「\」記号や 3 桁ごとの「,」を表示したいので、Format 関数で整形しました。

最後にコマンドボタンのプロシージャです。

Private Sub CommandButton1_Click() ''[閉じる]ボタン
    Unload Me
End Sub

こんな感じです。