Excel VBA > Excel上級:マクロ > ExcelとAccessのリストボックスの違いを比較してみる
このエントリーをはてなブックマークに追加

ExcelとAccessのリストボックスの違いを比較してみる

同じ「リストボックス」でもソフトウェアによって扱いが異なる

ExcelとAccessでは同じVBAを扱うことができますが、似て非なる部分もあり、Excel(またはAccess)でできることが、もう一方ではそのまま(コピペ)できない場合もあります。
今回はユーザーフォーム上のコントロールの一つで使用頻度の高いリストボックスで、ExcelとAccessの(Excel VBA目線よりで)いくつかの操作を簡単に対比させてみました。
excel_access_01

データを追加する

リストボックスにデータを追加する場合、Excel、AccessともにAdditemメソッドがありますが、Accessでは設定を確認する必要があります。

Excelでは、下記の形で対応できます。一方Accessでは、「値集合」プロパティを変更しないと追加できません。

■Excelのコード

Private Sub UserForm_Activate()

    With Me.lstXLS
        .AddItem “AAA”
        .AddItem “BBB”
        .AddItem “CCC”

    End With

End Sub

■Accessのコード
excel_access_02

Private Sub Form_Activate()

    With Me.lstACC
        .AddItem “AAA”
        .AddItem “BBB”
        .AddItem “CCC”

    End With

End Sub

データを削除する

削除はAccess側のリストボックスが(上記の追加時と同じように)「集合値」を変えていれば、同じコードで実現できました。

■Excelのコード

    ‘2行目を削除
    With Me.lstXLS
        .RemoveItem 1
    End With

■Accessのコード

    ‘2行目を削除
    With Me.lstACC
        .RemoveItem 1
    End With

データを選択する

リストボックスのデータをプログラム上から選択させる方法については、若干異なりました。
ここでは「ListIndex」、「Selected」の2種類のプロパティで試しました。
Excelの方はどちらのプロパティでも成功しましたが、Accessでは、「ListIndex」で失敗しました。

■Excelのコード

    ‘————————-
    ‘2行目を選択
    ‘————————-

    ‘ListIndexプロパティ(※下記Selectedをコメント化して試す)
    With Me.lstXLS
     .ListIndex = 1
    End With

    ‘Selectedプロパティ
    With Me.lstXLS
        .Selected(1) = True
    End With

■Accessのコード
ListIndexプロパティの実行時に下記のエラーが発生しました。
excel_access_03

    ‘————————-
    ‘2行目を選択
    ‘————————-

    ‘ListIndexプロパティ(※下記Selectedをコメント化して試す)
    With Me.lstAcc
        .ListIndex = 1
    End With

    ‘Selectedプロパティ
    With Me.lstAcc
        .Selected(1) = True
    End With

AccessのListIndexプロパティのヘルプでは

このプロパティは、マクロまたは Visual Basic でのみ使用できます。また、フォーム ビューとデータシート ビューでのみ値を取得できます。

とあるので、設定ができない仕様のようです。

選択された行位置を取得する(単一行)

今度は、ユーザーが選択した行の位置(何行目か)をプログラム側で取得する方法を試しました。

■Excelのコード

    ‘————————-
    ‘あらかじめ2行目を選択しておく
    ‘————————-

    ‘選択されているデータを取得する
    With Me.lstXLS
        MsgBox .ListIndex + 1 & “行目が選択されています”
    End With

excel_access_04

■Accessのコード

    ‘————————-
    ‘あらかじめ2行目を選択しておく
    ‘————————-

    ‘選択されているデータを取得する
    With Me.lstAcc
        MsgBox .ListIndex + 1 & “行目が選択されています”
    End With

excel_access_05

選択された行位置を取得する(複数行)

リストボックスで複数選択可能になっている場合も確認しました。Excelではリスト件数分だけループ処理を行い、「各行で選択されているかどうか」を確認するという方法をとっています。
Accessでも同様ですが、別途効率的な方法として「ItemsSelected」コレクションがあります。これはExcelのときの「各行で選択されているかどうか」の処理が不要になります。つまりループしている段階で選択されたデータのみが対象となっています(便利)。

■Excelのコード

    ‘選択されているデータを取得する
    With Me.lstXLS
        For i = 0 To .ListCount – 1

            ‘i行目が選択されているか
            If .Selected(i) = True Then
                strMSG = strMSG & i + 1 & “行目が選択されています” & vbCrLf
            End If
        Next i
    End With

    MsgBox strMSG

excel_access_06

■Accessのコード

    ‘————————-
    ‘あらかじめ1、2行目を選択しておく
    ‘————————-
    Dim i As Integer
    Dim strMSG As String

    ‘選択されているデータを取得する
    With Me.lstAcc
        For i = 0 To .ListCount – 1

            ‘i行目が選択されているか
            If .Selected(i) = True Then
                strMSG = strMSG & i + 1 & “行目が選択されています” & vbCrLf
            End If
        Next i
    End With

    MsgBox strMSG

■同じくItemsSelectedコレクションを使用

    ‘————————-
    ‘ItemsSelectedを使用
    ‘————————-

    Dim var As Variant

    With Me.lstAcc
        For Each var In .ItemsSelected
            strMSG = strMSG & var + 1 & “行目が選択されています” & vbCrLf
        Next var

    End With

    MsgBox strMSG

excel_access_07

選択された行のデータ(値)を取得する

リストボックスで選択されたデータの取得もいくつか方法があります。弊社では、ExcelではよくListプロパティを使いますが、Accessにはそれがありません。行列を逆に指定するColumnプロパティはExcelにもAccessにもあります。

■Excelのコード

    ‘————————-
    ‘あらかじめ2行目を選択しておく
    ‘————————-

    ‘選択されているデータを取得する(Listプロパティ)
    With Me.lstXLS
        MsgBox .List(.ListIndex, 0) & “が選択されています(Listプロパティ)”
    End With

    ‘選択されているデータを取得する(Columnプロパティ)
    With Me.lstXLS
        MsgBox .Column(0, .ListIndex) & “が選択されています(Columnプロパティ)”
    End With

excel_access_10

■Accessのコード
Listプロパティはエラーになりました。
excel_access_08

    ‘————————-
    ‘あらかじめ2行目を選択しておく
    ‘————————-

    ‘選択されているデータを取得する(Columnプロパティ)
    With Me.lstAcc
        MsgBox .Column(0, .ListIndex) & “が選択されています(Columnプロパティ)”
    End With

excel_access_09

以上、簡単ではありますが、ExcelとAccessのリストボックスを比較してみました。Accessの方は実務では、クエリやSQL文で直接値を入れたりすることが多いため、今回のような追加や削除は利用頻度が低いかもしれませんね。
ただ、今回のようなリストボックスでの違いは、Optionボタンなど他のコントロールにもありますので注意というか、(同時でなくても)両方使う場合は違いを覚えておく必要がありそうです。

カテゴリ:Excel上級:マクロ