2017-07-13 8 views
4

コンテキスト:プロシージャを実行し、戻り値を持つワークシートを記入するためのフィルタがいくつかあるユーザーフォームをコーディングしています。リストボックスはExcelのユーザーフォームで何とかNullに設定されています

私のフィルタに問題があります。私は縮小バージョンで問題を再現することができました。このフィルタは、選択されたコンボボックスのオプションに基づいて、リストボックスにデータをロードする必要がありますUserForm1ListBox1ComboBox1

enter image description here

私は、構成要素である、何の名前を変更しませんでした。

マイ壊れコード(コメント):

Option Explicit 

'sub that fill data in the list box columns 
Sub loadList(list As ListBox, id As Integer) 
    list.Clear 
    If (id > 0) Then 
     list.AddItem 
     list.Column(0, 0) = "Item 1" 
     list.AddItem 
     list.Column(0, 1) = "Item 2" 
    End If 
End Sub 

'event that will trigger the loadList sub 
Private Sub ComboBox1_Change() 
    Dim id As Integer 
    id = ComboBox1.ListIndex 

    loadList ListBox1, id 
End Sub 

'the combo options is auto initialized 
Private Sub UserForm_Initialize() 
    ComboBox1.AddItem 
    ComboBox1.Column(0, 0) = "Option 1" 
    ComboBox1.AddItem 
    ComboBox1.Column(0, 1) = "Option 2" 
End Sub 

私はbrekpointを設定すると、私は問題を見ることができます。 ListBox1Nullに設定されているが、私はそれを回避する方法がわからない:

enter image description here

エラーは言う:

実行時エラー「13」:型の不一致を

しかし、ListBox1は何とかNullに設定されているため、明らかです。

誰もこの行動を経験したことがありますか?それを回避するには?前もって感謝します。

+0

@Fadi。何も変更されていません。上の1行をブレークポイントに設定すると、 'ListBox1'も' Null'ですが、 'Sub loadList'呼び出しの前にエラーが発生していると思います。 –

答えて

5

奇妙なことに、異なるライブラリのListBoxという2つのクラスがあり、VBAはそれらを混乱させます(実際はすべてのコントロールに同じです)。これは、MSFormsコントロールまたはActiveXコントロールのいずれを使用しているかによって異なります。

あなたの場合、リストボックスの実際のタイプであるMSForms.ListBoxで曖昧さを解消する必要があります。

Sub loadList(list As MSForms.ListBox, id As Integer) 
'     ^^^^^^^ 

、このような疑問を避けるために、あなたも(あなたのサブは限り、あなたは唯一の共通の方法を使用して、両方のタイプを処理するだろう)、list As Objectを使用することができます。

enter image description here

+1

男、あなたは忍者です!私はそれを見つけることは決してない..本当にありがとう:) –

関連する問題