6042
表題の通りなのですが、複数選択可にするとどうすれば VBA 上からコンボボックスに指定した項目をチェックするのか分かりません。

VBA に慣れていないこともあり、まったく的外れな方法でやろうとしたのか、

  1. 選択用関数があるのでは？
  2. `.Value` が配列だから配列を追加してやればいいのでは？
  3. ２が駄目だったから別の配列を用意して入れ替えるのは？

の三本立てで攻めてみましたが、駄目でした。

実現方法をご存知の方はアドバイスをよろしくお願いいたします。

* * *

![画像の説明をここに入力](https://i.stack.imgur.com/WviIa.png)  
_上図: テーブルの設計_

![画像の説明をここに入力](https://i.stack.imgur.com/EDOCQ.png)  
_上図: フォームの内容_

![画像の説明をここに入力](https://i.stack.imgur.com/8GIKX.png)  
_上図: VBAサブルーチンの内容_
CC BY-SA 3.0
2015-02-06T01:04:14.397
6032
2015-02-06T12:28:03.343
2015-02-06T02:29:34.147
4978
8102
question
ms-access vba
MS Accessで複数選択可のコンボボックスに VBA にて指定した項目をチェックする方法
以下の様にすればいいと思います。

```

    タグ.Value = Array("ゴリラ")
    
```

複数の場合は以下の様にします

```

    タグ.Value = Array("ズック","ゴリラ")
    
```

ただし、存在しなくてもアイテムが増えてチェックがついてしまうので、存在しないアイテムを追加しないように気を付けてください。

```

    タグ.Value = Array("たぶん無いだろうと思うアイテム")
    
```

![画像の説明をここに入力](https://i.stack.imgur.com/hC1db.jpg)

* * *

**コメントに書いた部分の検証コード**

大した内容ではないですが、コメントだと読みにくいのでコードにしました。  
試す場合は意味ディエイトウィンドウを表示しておいてください。

```

    Private Sub コマンド7_Click()
    
        Debug.Print "* Sample1 *"
        Call Sample1(Me![タグ].Value, Me![タグ].Value)
        Debug.Print "--"
        Debug.Print "Result: " & UBound(Me![タグ].Value) ' 結果は増えない
    
        Dim aMyArr() As Variant
        ReDim aMyArr(2)
    
        Debug.Print "* Sample2 *"
        Call Sample2(aMyArr, aMyArr)
        Debug.Print "--"
        Debug.Print "Result: " & UBound(aMyArr)  ' 結果も増える
    End Sub
    
    Public Sub Sample1(ByRef a1 As Variant, ByRef a2 As Variant)
        'ByRef a1() as Variant では受け取れない
    
        Debug.Print "Before :" & UBound(a1)  ' (A)
    
        ReDim Preserve a1(UBound(a1) + 1)
    
        Debug.Print "After1 :" & UBound(a1)  ' (A) + 1 の値
        Debug.Print "After2 :" & UBound(a2)  ' (A) と同じ値
    
    End Sub
    
    Public Sub Sample2(ByRef a1() As Variant, ByRef a2() As Variant)
        ' ByRef a1 As Variant でも受け取れる（結果は同じ）。
    
        Debug.Print "Before :" & UBound(a1)  ' (B)
    
        ReDim Preserve a1(UBound(a1) + 1)
    
        Debug.Print "After1 :" & UBound(a1)  ' (B) + 1 の値
        Debug.Print "After2 :" & UBound(a2)  ' (B) + 1 の値(変更に追随している）
    
    End Sub
    
```
CC BY-SA 3.0
2015-02-06T03:04:04.847
6042
2015-02-06T12:28:03.343
2015-02-06T12:28:03.343
728
728
6032
answer
このように修正すると正常に動作しました。配列のサイズを拡張する時はRedim Preserveを使うんですね。  
まだひとつ疑問が残ってまして、'コントロールのValueを直接触ると内容が変わらないのですが、VBAはこういうものなのでしょうか？

```

    Private Sub Btnゴリラにチェック_Click()
      'これだと動く
      Dim arr()
      arr = Me![タグ].Value
      If Not InArray("ゴリラ",arr) Then Call ArrayPush(arr, "ゴリラ")
      [タグ].Value = arr
    
      'これだと動かない
      'If Not InArray("ゴリラ",Me![タグ].Value) Then Call ArrayPush(Me![タグ].Value, "ゴリラ")
    End Sub
    
```

標準モジュール

```

    Public Sub ArrayPush(ByRef arr, val)
      Dim cnt
      cnt = UBound(arr) + 1
      ReDim Preserve arr(cnt)
      arr(cnt) = val
    End Sub
    
    Public Function InArray(val, arr)
      Dim re As Variant
      re = Filter(arr, val)
    
      If UBound(re) <> -1 Then
        InArray = True
      Else
        InArray = False
      End If
    End Function
    
```
CC BY-SA 3.0
2015-02-06T05:58:39.857
6058
2015-02-06T05:58:39.857
8102
6032
answer