2011-07-14 18 views
0

私は2つの列にステータスがあり、その他に名前があります。私がしたいのは、オプションボタンを使ってstausを選択することです。オプションに応じて、名前を選択してリストボックス/コンボボックスに入力する必要があります。リストボックスを動的に設定する

Private Sub CommandButton1_Click() 
Dim ListOfNames() As Variant 
Dim ws As Worksheet 
Set ws = Worksheets(2) 
Dim Count As Long 
Dim StatusVal As String 
Dim j As Long, k As Long, iRow As Long 

j = 0 
k = 0 
If OptionButton1.Value = True Then 
StatusVal = "Retired" 
j = j + 1 
ElseIf OptionButton2.Value = True Then 
StatusVal = "Employed" 
j = j + 1 
ElseIf OptionButton3.Value = True Then 
StatusVal = "On Leave" 
j = j + 1 
Else 
ListVal = "Not Selected" 
End If 

'Count the number of rows in excel 
iRow = ws.Cells(Rows.Count, 1) _ 
    .End(xlUp).Offset(1, 0).Row 

ReDim ListOfNames(iRow, j) 
' first row for header 
For Count = 2 To iRow - 1 Step 1 
    If StatusVal = ws.Cells(Count, 15).Value Then 
    k = k + 1 
    ListOfNames(k, j) = ws.Cells(Count, 1).Value 
    End If 
Next 
With ListBox1 
    .list() = ListOfAccounts 
End With 
End Sub 

答えて

0

私は2つの問題を見つけました。

  • リストボックスへの割り当てには、設定されていなかったプロパティが必要でした。多次元配列を持つので、AddItemメソッドを使用してリストボックスに追加しました。
  • 宣言したListOfEmployeesの代わりにリストにListOfAccountsを割り当てていました。

私はまた、ボタンプッシュの間で内容をクリアするには

ListBox1.Clear 

を追加しました。

Private Sub CommandButton1_Click() 

Dim ListOfNames() As Variant 

Dim Count As Long 
Dim StatusVal As String 
Dim j As Long, k As Long, iRow As Long 
ListBox1.Clear 
j = 0 
k = 0 
If OptionButton1.Value = True Then 
    StatusVal = "Retired" 
    j = j + 1 
ElseIf OptionButton2.Value = True Then 
    StatusVal = "Employed" 
    j = j + 1 
ElseIf OptionButton3.Value = True Then 
    StatusVal = "On Leave" 
    j = j + 1 
Else 
    ListVal = "Not Selected" 
End If 

'Count the number of rows in excel 
iRow = ws.Cells(Rows.Count, 1) _ 
     .End(xlUp).Offset(1, 0).Row 
ReDim ListOfNames(iRow, j) 
' first row for header 
For Count = 2 To iRow - 1 Step 1 
    If StatusVal = ws.Cells(Count, 15).Value Then 
     k = k + 1 
     ListOfNames(k, j) = ws.Cells(Count, 15).Value 
    End If 
Next 
Dim z 
For z = 0 To k 
    Me.ListBox1.AddItem (ListOfNames(z, j)) 
Next 
End Sub 
+0

ありがとうAndrew、私はadditemプロパティを使用したので、これを解決できませんでしたが、ループが追加され、見つかった名前の数が増えてパフォーマンスが低下します。 .list()関数が配列の値をリストボックスに割り当てるべきではないかどうかは、私のクエリです。 –

+0

.list()関数は、2次元配列を渡している間に、1次元配列を期待している可能性があります。私はそれを試みるだろう。配列の割り当てが反復処理よりも効率的であるかどうかを知るために、内部について十分に知りません。 –

関連する問題