2013-07-27 4 views
0

Почему на Земле это дает мне 1004? Worksheet Имя и Codename это то же самое, так что он может ссылаться на него, так почему же я продолжаю получать 1004Excel 1004 on for loop

Public Sub UserForm_Initialize() 
Dim coLoc As Integer 
Dim i As Integer 
Dim ia As Integer 

coLoc = ThisWorkbook.Worksheets("Company").Range(Cells(2, 1), Cells(Rows.count, 1).End(xlUp)).count 
For i = 2 To coLoc Step 1 
ComboBox1.AddItem (ThisWorkbook.Worksheets("Company").Cells(i, 2).Value) 
Next i 

End Sub 

Пожалуйста, дайте мне некоторую ясность, как клавиатура будет проходить через экран.

+1

Какая линия вызывает ошибку? –

ответ

2

Я не могу проверить его, но я предполагаю, что он сработает, когда вы назначаете значение Coloc. VBA не знает, какие «ячейки» вы говорите. Я знаю, что это может показаться противоречивым, но вам нужно указать, что внутри диапазона, а не раньше.

Try:

With ThisWorkbook.Worksheets("Company") 
    coLoc = Range(.Cells(2, 1), .Cells(.Rows.count, 1).End(xlUp)).count 
End With 
+1

Вероятно, также должен квалифицировать ваш объект 'Rows' :) –

+0

Ага, даже не обратил внимания на это. Спасибо за улов! –

2

Не уверен, что повышение этой конкретной ошибки, не более детально, но постарайтесь полностью квалифицировать ваши объекты диапазона.

Это использует немного другой метод итерации:

Public Sub UserForm_Initialize() 
    Dim wb as Workbook: Set wb = ThisWorkbook 
    Dim ws as Worksheet: Set ws = wb.Sheets("Company") 
    Dim colRange as Range 
    Dim cl as Range 


    Set colRange = ws.Range(ws.Cells(2, 1), ws.Cells(ws.Rows.count, 1).End(xlUp)) 
    For each cl in colRange.Cells 
     ComboBox1.AddItem cl.Value 
    Next 

End Sub 
+1

+1 для полной проверки объектов 'Cells'. очень важная и легкая ошибка. – Brad

1

Просто в качестве альтернативы, я хотел бы использовать List для заполнения выпадающего:

Private Sub UserForm_Initialize() 
    Dim wb As Workbook 
    Dim ws As Worksheet 
    Dim colRange As Range 

    Set wb = ThisWorkbook 
    Set ws = wb.Sheets("Company") 
    Set colRange = ws.Range(ws.Cells(2, 1), ws.Cells(Rows.Count, 1).End(xlUp)) 

    ComboBox1.List = colRange.Value 
End Sub 

Там нет необходимости квалифицировать Rows.Count, хотя это не наносит вреда.

+0

+1 Я всегда забываю о методе '.List'! Может быть, если я увижу его вокруг S/O чаще, я запомню его :) –

+0

@DavidZemens Спасибо. Я не думаю, что многие знают об этом (или они не уверены, как его назначить). BTW Мне любопытно, почему вы используете 'colRange.Cells'? –

+1

'.cells' в этом случае не требуется, потому что диапазон составляет всего один столбец, но он вмещает многоколоночный диапазон. Я стараюсь быть неясным, а не скрытым :) –