2011-12-06 5 views
1

他のコンボボックスで選択した値に応じていくつかのコンボボックスを記入する必要があります。私が望むのは、ボックスに選択した名前のアクティビティを入力することです。特定の名前が行内にあるかどうかを比較してから、オフセットを使用してアクティビティ名を取得し、それを配列に書き込みます。動作していない可能性があります。おそらくオフセットと何か関係があるか、アクティビティセルのマージが問題になるかもしれません。ここに私のコードは次のとおりです。vba細胞を選択する

Function FindingActivities(ExpName) 

Dim ActNames(500) As String 
Dim i As Integer 
Dim CurrContent As String 


For Each cell In Range("B7").EntireColumn.cells 
    If cell.Value <> "" Then 
     If ExpName = cell.Value Then 
      CurrContent = Left(cell.Offset(0, -1).Value, 2) 
      If CurrContent = "Ac" Then 
       ActNames(i) = cell.Offset(0,-1).Value 
       i = i + 1 
      End If 
     End If 
    End If 
Next cell 

FindingActivities = ActNames() 

End Function 

これは、コンボボックスを埋めるためのコードです:

Private Sub ComboBox1_Change() 

Dim ExpName As String 
ExpName = ComboBox1.Value 
Dim ActNames() As String 

ActNames = FindingActivities(ExpName) 

For i = 0 To UBound(ActNames) 
    If ActNames(i) <> "" Then 
     ComboBox3.AddItem ActNames(i) 
    End If 
Next 

End Sub 

誰もがアイデアを持って?

+1

どの部分が機能していませんか?あなたはどのように変数を宣言していますか? – aevanko

+0

私は関数のための追加のコードを追加しました。機能していない部分は、アクティビティ名はそこにあるはずですが、CurrContentが空であることです。 – user366121

+0

'CurrContent' *は常に空文字列ですか?ブレークポイントを設定してコードをデバッグしようとしましたか?例えば'cell.Offset(0、-1).Value'を監視していますか?あなたはそれを行う必要があるように思えるし、自分でエラーを見つけるでしょう。 –

答えて

0

UPDATE

  1. がActNamesを保存し、.itemsを使用するために辞書を使用します。分かりやすく

    それはあなたが立ち往生しているところはほとんど不明だが、私はうまく動作するはずの書き換えを提供するために書き直さそれらを配列として取得する

  2. 列全体を処理する代わりに、列Bの境界を動的に検索する
  3. バリアント配列を使用して列AとBを格納し、

ここでは、コードです:基本的にトラブルを求めている未確定な長さの列に固定長の文字列配列を使用して

Private Sub ComboBox1_Change() 

Dim ExpName As String 
ExpName = ComboBox1.Value 
Dim ActNames As Variant 

ActNames = FindingActivities(ExpName) 
'Add this so you aren't just adding results upon results 
ComboBox3.Clear 

For i = LBound(ActNames) To UBound(ActNames) 
    ComboBox3.AddItem ActNames(i) 
Next 

End Sub 

...

Function FindingActivities(ByVal ExpName As String) 

Dim dict As Object 
Set dict = CreateObject("scripting.dictionary") 
Dim i As Long 
Dim cell As Range 
Dim varray As Variant 

varray = Range("A1:B" & Range("B" & Rows.Count).End(xlUp).Row).Value 

For i = 1 To UBound(varray, 1) 
    If Len(varray(i, 2)) <> 0 Then 
     If varray(i, 2) = ExpName Then 
      If Left$(varray(i, 1), 2) = "Ac" Then 
       dict.Add i, varray(i, 1) 
      End If 
     End If 
    End If 
Next 

FindingActivities = dict.items 

End Function 

が。メモリには悪く、遅く、バグを引き起こす可能性があります。辞書はあなたが好きな場合にのみユニークな項目にフィルタをかけることができます(私はこの場合は行っていません)、キーまたは項目を配列として出力することを除いて、コレクションと同じです。非常に効果的です。

+0

thx。私はあなたのコードに変更します。 – user366121