VBA Excel - цикл, основанный на значении диапазона ячеек - PullRequest
0 голосов
/ 03 октября 2011

Итак, я запускаю цикл для извлечения данных из одного столбца на другом листе и хочу, чтобы он остановился, как только данные в столбце заканчиваются, но у меня возникли некоторые проблемы с поиском условия для завершения цикла.

Do While values(i) <> 0

Set xcell = Range(Cells(x + 3, 2), Cells(x + 3, 2))
Set ycell = Range(Cells(y + 3, 2), Cells(y + 3, 2))
x = x + 1
y = y + 1

ycell.Formula = "='\\Drcs8570168\shasad\[CR Status.xlsx]Sheet1'!" & xcell.Address

values(i + 1) = xcell.Value
i = i + 1

Loop

Я пытался присвоить каждую ячейку переменной с массивом и запускать цикл, пока пустые ячейки не начнут записываться.Это говорит мне, что индекс находится вне диапазона.

Ответы [ 3 ]

2 голосов
/ 03 октября 2011

Во-первых, вместо:

Set xcell = Range(Cells(x + 3, 2), Cells(x + 3, 2))

Используйте только:

Set xcell = Cells(x + 3, 2)

НО , я сомневаюсь, что вам вообще нужно зацикливаться.Попробуйте что-то вроде этого:

Dim vValues As Variant

'// Get the range of cells you want to work with
With Range("B3", Cells(Rows.Count, "B").End(xlUp))
    '// Add the formula, excel will automatically fill in series
    .Formula = "='\\Drcs8570168\shasad\[CR Status.xlsx]Sheet1'!A1"
    '// Build an array from the values
    vValues = .Value
End With
1 голос
/ 04 октября 2011

Вы инициализировали переменную i и массив values?

Перед циклом:

i=0
Redim Preserve valus(i)
values(i)=1 'or else we will never enter the loop

В цикле (последние строки перед оператором цикла):

i = i + 1
Redim Preserve values(i)
values(i) = xcell.Value

Но вам даже не нужен массив values (то есть если вы не будете использовать его где-либо еще в вашем коде), просто сохраните последнее значение ячейки в i.

Перед циклом:

i = 1 'or we won't enter the loop
while i<>0 'starting the loop

здесь идет ваш код цикла, а затем до конца цикла:

i = xcell.Value
Loop

EDIT: Но если у вас есть фактическое значение 0 в качестве значения ячейки в вашем списке, цикл остановится до конца списка, поэтому вы можете захотеть проверить, не содержит ли ваша ячейка никаких символов:

Предполагая, что:

Dim i as Variant

Тогда условие цикла в последнем примере также может быть:

while i<>""

И это остановится, только если ячейка действительно пуста (= не имеет содержимого)

1 голос
/ 03 октября 2011

Вы можете попробовать использовать функцию, чтобы найти последнюю строку с данными в ней, такими как:

Function LastRow(wks As Worksheet) As Long
    On Error GoTo ErrHandle
    LastRow = wks.Cells.Find("*", After:=wks.Cells(1, 1), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    Exit Function
ErrHandle:
    LastRow = 0
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...