2012-10-16 5 views
1

동적 범위의 값으로 (워크 시트에 끌어다 놓은) 콤보 상자를 채우려고합니다.동적 범위를 사용할 때 Excel VBA 오류

Normally 'ThisWorkbook.Names ("NAME_OF_RANGE"). RefersToRange'는 작동하지만 동적 범위에서 실패합니다!

내가 다른 솔루션 (아래 코드 참조) 시도하지만, 다음 워크 시트 명이 기준에서 제거됩니다

Public Sub FillCombobox(cboComboBox As ComboBox, sRange As String) 
'Remember current selected item 
Dim sSelectedItem As String 
sSelectedItem = cboComboBox.Text 

'Empty the combobox 
cboComboBox.Clear 
cboComboBox.AddItem "---pick one---" 

'Get the data from the dynamic range 
Dim oListFillRange As Range 
'This line will throw an error: 
Set oListFillRange = ThisWorkbook.Names(sRange).RefersToRange 'Does not work with a dynamic range!!! 
''Set oListFillRange = Range(Application.Evaluate(ThisWorkbook.Names(sRange).RefersTo).Address) 'Works with dynamic ranges on the SAME SHEET (as the sheetname is stripped out!) 

'Fill combobox 
Dim oRange As Range 
For Each oRange In oListFillRange 
    cboComboBox.AddItem oRange.Value 
Next oRange 

'Set previous selected item 
Dim i As Integer 
For i = 0 To cboComboBox.ListCount - 1 
    If cboComboBox.List(i) = sSelectedItem Then 
     cboComboBox.ListIndex = i 
     Exit for 
    End If 
Next i 

If cboComboBox.ListIndex = -1 Then cboComboBox.ListIndex = 0 
End Sub 

그래서 어떻게 '에서 ThisWorkbook을받을 수 있나요 (따라서 잘못된 데이터가 채워지고있다). 이름 ("NAME_OF_RANGE"). RefersToRange '동적 범위로 작업 하시겠습니까?

답변

1

범위를 Range 속성으로 참조하십시오. 엑셀 특성은 실제 범위를 읽을 수 있도록 동적 범위의 수식에는 범위가 없기 때문에 좀 더 많은 정보

Set oListFillRange = Sheets("mySheet").Range(sRange) 'where mySheet is the relevant sheet name 

RefersToRange 작동하지 않는 이유이다. 따라서 범위를 직접 참조하는 것이 유일한 방법입니다.

+0

시트 이름 추가 제안 사항, 감사합니다! 차라리 'global'메서드를 사용합니다. 시트 이름을 바꿀 때 VBA 코드를 업데이트 할 필요는 없지만 여기에는 선택의 여지가없는 것처럼 보입니다. –

+0

예, 이제 생각해 보겠습니다. 무엇이든 상관없이 시트 이름이 필요합니다. 내 대답을 더 정확하게 편집 할 것입니다. –

+0

Name.RefersToRange를 사용하여 동적 범위를 참조 할 수 있습니다. 그러나 당신의 대답은 더 직접적입니다. –

관련 문제