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

Private Sub Form_Activate()
With Me.lstACC
.AddItem “AAA”
.AddItem “BBB”
.AddItem “CCC”
End With
End Sub
データを削除する
削除はAccess側のリストボックスが(上記の追加時と同じように)「集合値」を変えていれば、同じコードで実現できました。
■Excelのコード
With Me.lstXLS
.RemoveItem 1
End With
■Accessのコード
With Me.lstACC
.RemoveItem 1
End With
データを選択する
リストボックスのデータをプログラム上から選択させる方法については、若干異なりました。
ここでは「ListIndex」、「Selected」の2種類のプロパティで試しました。
Excelの方はどちらのプロパティでも成功しましたが、Accessでは、「ListIndex」で失敗しました。
■Excelのコード
With Me.lstXLS
.ListIndex = 1
End With
With Me.lstXLS
.Selected(1) = True
End With
■Accessのコード
ListIndexプロパティの実行時に下記のエラーが発生しました。

With Me.lstAcc
.ListIndex = 1
End With
With Me.lstAcc
.Selected(1) = True
End With
AccessのListIndexプロパティのヘルプでは
このプロパティは、マクロまたは Visual Basic でのみ使用できます。また、フォーム ビューとデータシート ビューでのみ値を取得できます。
とあるので、設定ができない仕様のようです。
選択された行位置を取得する(単一行)
今度は、ユーザーが選択した行の位置(何行目か)をプログラム側で取得する方法を試しました。
■Excelのコード
With Me.lstXLS
MsgBox .ListIndex + 1 & “行目が選択されています”
End With

■Accessのコード
With Me.lstAcc
MsgBox .ListIndex + 1 & “行目が選択されています”
End With

選択された行位置を取得する(複数行)
リストボックスで複数選択可能になっている場合も確認しました。Excelではリスト件数分だけループ処理を行い、「各行で選択されているかどうか」を確認するという方法をとっています。
Accessでも同様ですが、別途効率的な方法として「ItemsSelected」コレクションがあります。これはExcelのときの「各行で選択されているかどうか」の処理が不要になります。つまりループしている段階で選択されたデータのみが対象となっています(便利)。
■Excelのコード
With Me.lstXLS
For i = 0 To .ListCount – 1
If .Selected(i) = True Then
strMSG = strMSG & i + 1 & “行目が選択されています” & vbCrLf
End If
Next i
End With
MsgBox strMSG

■Accessのコード
Dim i As Integer
Dim strMSG As String
With Me.lstAcc
For i = 0 To .ListCount – 1
If .Selected(i) = True Then
strMSG = strMSG & i + 1 & “行目が選択されています” & vbCrLf
End If
Next i
End With
MsgBox strMSG
■同じく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ではよくListプロパティを使いますが、Accessにはそれがありません。行列を逆に指定するColumnプロパティはExcelにもAccessにもあります。
■Excelのコード
With Me.lstXLS
MsgBox .List(.ListIndex, 0) & “が選択されています(Listプロパティ)”
End With
With Me.lstXLS
MsgBox .Column(0, .ListIndex) & “が選択されています(Columnプロパティ)”
End With

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

With Me.lstAcc
MsgBox .Column(0, .ListIndex) & “が選択されています(Columnプロパティ)”
End With

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