Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5458 / 13644 ツリー ←次へ | 前へ→

【50639】コンボボックスにデータをいれる まー 07/8/6(月) 21:00 質問[未読]
【50647】Re:コンボボックスにデータをいれる Blue 07/8/7(火) 9:15 発言[未読]
【50652】Re:コンボボックスにデータをいれる Jaka 07/8/7(火) 16:18 発言[未読]
【50654】Re:コンボボックスにデータをいれる neptune 07/8/7(火) 17:52 発言[未読]
【50659】Re:コンボボックスにデータをいれる Hirofumi 07/8/7(火) 20:21 発言[未読]
【50661】Re:コンボボックスにデータをいれる まー 07/8/7(火) 20:54 お礼[未読]

【50639】コンボボックスにデータをいれる
質問  まー  - 07/8/6(月) 21:00 -

引用なし
パスワード
   こんばんは。
ユーザーフォームにコンボボックスとリストボックスを置き、コンボボックスに「データベース」というシートの列を表示させています。
ここで、私のパソコン(WindowsXp/office2003)では動くのですが、他のパソコン(Windows98/office97)では「ActiveX コンポーネントを作成できません。」とエラーになってしまします。
これを回避する為にはどうすればよいでしょうか?
よろしくご教示願います。

↓ソース↓
Option Explicit
Private rngList As Range
Private lngRows As Long
'************************
'画面起動時
'************************
Private Sub UserForm_Initialize()
  Dim dic As Object
  Dim i As Long
  Dim mykey As String

  Set dic = CreateObject("Scripting.Dictionary")
  With Sheets("データベース")
    For i = 3 To .Cells(.Rows.Count, 1).End(xlUp).row
      mykey = .Cells(i, 5).Value
      If Not dic.Exists(mykey) Then dic.Add mykey, mykey
    Next
  End With

  UserForm1.ComboBox1.List = dic.Keys
  Set dic = Nothing
  Set rngList = Sheets("データベース").Cells(1, "E")
  With rngList
    'List行数を取得
    lngRows = .Offset(Rows.Count - .row).End(xlUp).row - .row + 1
  End With
End Sub

【50647】Re:コンボボックスにデータをいれる
発言  Blue  - 07/8/7(火) 9:15 -

引用なし
パスワード
   ▼まー さん:
>  Set dic = CreateObject("Scripting.Dictionary")
おそらく、この行でオブジェクトの作成に失敗しているのでしょう。

考えられる原因としては、OSが98ということで、
Script ランタイム 
のバージョンが古いもしくは存在しないので使えないということが考えられます。

対処としては、Scripting.Dictionaryを使わない方法で対応することになりそうです。
(インストールすれば出来るようになるかもしれないけど、よくわからないので、、、)

【50652】Re:コンボボックスにデータをいれる
発言  Jaka  - 07/8/7(火) 16:18 -

引用なし
パスワード
   ちょっと寄り道。
参照設定で、scripting runtime(スペルは適当)辺り?か、他のランタイムの参照設定が必要だったような気が...。
違ってたらすみません。

【50654】Re:コンボボックスにデータをいれる
発言  neptune  - 07/8/7(火) 17:52 -

引用なし
パスワード
   ▼まー さん:

Script ランタイムはWin98からサポートされているのでBlueさんの
書かれているように
>考えられる原因としては、OSが98ということで、
>Script ランタイムのバージョンが古い
のかもしれません。

dic.Exists(mykey)
m1.ComboBox1.List = dic.Keys
などはサポートされてないですが、Collectionを使用したらどうですか?
キーをユニークなものにするという目的は達成できます。

【50659】Re:コンボボックスにデータをいれる
発言  Hirofumi  - 07/8/7(火) 20:21 -

引用なし
パスワード
   Option Explicit

Private rngList As Range
Private lngRows As Long

'************************
'画面起動時
'************************
Private Sub UserForm_Initialize()

'  Dim dic As Object
  Dim i As Long
'  Dim mykey As String
  Dim j As Long
  Dim vntData As Variant
  Dim vntList() As Variant
  Dim lngMax As Long

'  Set dic = CreateObject("Scripting.Dictionary")
'  With Sheets("データベース")
'    For i = 3 To .Cells(.Rows.Count, 1).End(xlUp).Row
'      mykey = .Cells(i, 5).Value
'      If Not dic.Exists(mykey) Then dic.Add mykey, mykey
'    Next
'  End With
'
'  UserForm1.ComboBox1.List = dic.Keys
'  Set dic = Nothing

'  Set rngList = Sheets("データベース").Cells(1, "E") '変?
  Set rngList = Sheets("データベース").Cells(3, "E")
  With rngList
    'List行数を取得
    lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row + 1
    'E列を配列に取得
    vntData = .Resize(lngRows + 1).Value
  End With
  
  'ComboBoxのListを作成
  'List用配列を確保
  ReDim vntList(lngMax)
  '先頭データを無条件で代入
  vntList(lngMax) = vntData(1, 1)
  'E列データ2行目〜最終まで繰り返し
  For i = 2 To lngRows
    'List用配列の中を探索
    For j = 0 To lngMax
      '重複が有った場合
      If vntData(i, 1) = vntList(j) Then
        Exit For
      End If
    Next j
    '重複が無いなら
    If j > lngMax Then
      'List用配列を拡張して末尾にデータを追加
      lngMax = lngMax + 1
      ReDim Preserve vntList(lngMax)
      vntList(lngMax) = vntData(i, 1)
    End If
  Next i
  
  UserForm1.ComboBox1.List = vntList

End Sub

IEのバージョンが4.0or5.0?なのでは?
遅く成るけど、取りあえず上記の様にすれば、重複なしでListが得られると思います

PS:
ただ、気に成る所が1か所有ります
元のコードだと、ComboBoxのデータは、E列3行目から下に取っているのですが?
UserFormで操作しているListは、データが1行目から有る事に成っています
これでは、矛盾が生じるのでは?

【50661】Re:コンボボックスにデータをいれる
お礼  まー  - 07/8/7(火) 20:54 -

引用なし
パスワード
   みなさん、お返事ありがとうございました!
動かなかったパソコンは私のではなく、参照設定を変えるのは嫌なので、Hirofumi さんの方法で解決しました!

>PS:
>ただ、気に成る所が1か所有ります
>元のコードだと、ComboBoxのデータは、E列3行目から下に取っているのですが?
>UserFormで操作しているListは、データが1行目から有る事に成っています
>これでは、矛盾が生じるのでは?

すいません。コンボボックスに表示するのは、とりあえず3行目からで良かったもので、特に意識していませんでした。。。ちなみに1行目は「空白」、2行目は「データ項目名称」、3行目からデータが入っています。
なので、正確にはHirofumiさんの方が正しいです。

5458 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free