2017-01-18 4 views
2

Я перебираю некоторые ячейки по вертикали в Excel и затем передаю эту ячейку в качестве параметра для процедуры.Объект, требующий ошибки при переходе по ячейкам при выборе

Я сделал это таким образом, поэтому у меня нет содержимого ProcessCells дважды, в коде, один раз для цикла while и второй раз в цикле For.

Если я попытаюсь получить значение ячейки, выписанной, в цикле for она работает. Если я поместил содержимое процедуры ProcessCells в цикл for, он также будет работать.

Но если я стараюсь передать его в качестве параметра, в ProcessCells, я получаю сообщение об ошибке

«Объект Обязательный»

Вот код, если вы хотите, чтобы проверить его из:

Sub loopThroughCells() 

Dim c As Range 
Dim autoSelect As String 
Dim X, Y As Integer 

autoSelect = Cells(3, 2).Value 

If StrComp(autoSelect, "Y") = 0 Then 
    Y = 5 
    X = 4 
    While Not IsEmpty(Cells(Y, X).Value) 
     ProcessCells (Cells(Y, X)) 
     Y = Y + 1 
    Wend 
Else 
    For Each c In Selection 
     ProcessCells (c) 
    Next c 
End If 
End Sub 

Sub ProcessCells(ce As Range) 
End Sub 

Как

Клетки (п, м)

отличается от

С в селекции

?

Ошибка возникает в цикле For, но это не происходит в цикле while.

+0

Вероятно, это должно быть 'Для каждого cIn Selection.Cells' (и вам следует избегать использования' Select' как можно больше. Также см. этот документ: http://stackoverflow.com/documentation/vba/7363/pass-arguments-byref-or-byval # t = 201701181030371271291 – R3uK

+0

Спасибо, но, к сожалению, это не решило проблему. –

+0

Вы меняете ячейки в 'ProcessCells'? Поскольку вы не можете изменить значение элемента в цикле 'For Every' (я знаю, это боль ...) – R3uK

ответ

3

Вот как вы должны это сделать:

Option Explicit 

Sub TestMe() 

    Dim c As Range 

    For Each c In Selection 
     Call ProcessCells(c) 
    Next c 
End Sub 


Sub ProcessCells(ce As Range) 
End Sub 

Вы должны обратиться с call, потому что у вас есть аргумент в скобках. Или как это, если вы не любите call:

Option Explicit 

Sub TestMe() 

    Dim c As Range 

    For Each c In Selection 
     ProcessCells c 
    Next c 
End Sub 


Sub ProcessCells(ce As Range) 
End Sub 

Plus небольшой тираж вашего кода. Сделайте свои заявления, как это:

Dim X as Long, Y As long 

В программном коде X объявлен как вариант, и целое число медленнее и меньше, чем в длину - Why Use Integer Instead of Long?

Вот некоторые хорошее объяснение, когда поставить аргумент в скобках и когда использовать call - How do I call a VBA Function into a Sub Procedure

+2

Спасибо, используя 'Call' исправил его. Но вы говорите, что мне нужно использовать «Call», потому что в круглых скобках есть аргумент.Разве это не тот же случай, в цикле While? –

+0

№. В цикле while вы используете встроенную функцию XL - IsEmpty(). Он принимает аргументы в скобках. Вот хорошая ссылка об этом - http://stackoverflow.com/questions/1072075/how-do-i-call-a-vba-function-into-a-sub-procedure – Vityata

+0

Ноно, я имел в виду, что я звоню такую ​​же процедуру, которую я также вызываю в цикле For: 'ProcessCells' Но вместо замкнутой ячейки я передаю встроенный параметр «Ячейки». –

Смежные вопросы