2011-12-06 8 views
1

다른 comboboxes에서 선택한 값에 따라 여러 콤보 상자를 채워야합니다. 내가 원하는 것은 선택한 이름에 대한 활동으로 상자를 채우는 것입니다. 특정 이름이 연속적인지 비교 한 다음 오프셋을 사용하여 활동 이름을 가져 와서 배열에 기록합니다. 그것은 작동하지 않습니다 아마도 오프셋과 관련이 있거나 어쩌면 활동 세포의 합병이 문제입니다.엑셀 vba 셀 선택

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 

누구나 아이디어가있다 :이 코드는 콤보 상자를 채우는 것입니다

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 

: 여기 내 코드는?

+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