2017-01-27 6 views
0

У меня есть целый ряд временных рядов данных с датами в столбце А и цены в столбце B.Переход через колонки и установки диапазона с «Do While» петля в Vba

Эти данные имеют «N/A» (строка, а не ошибка) в первых 200 строках (это число не является точным и меняется при каждом запуске файла, поэтому я не могу ссылаться на него напрямую).

Чтобы иметь возможность отображать график из диапазона, который не имеет «N/A», я использую цикл «Do While» для прохождения строк до тех пор, пока он не будет равен «N/A», а затем установив диапазон.

Проблема: По какой-то причине мой счетчик «i» не суммирует. Затем цикл начинается с i = 1, где он должен быть i = номер строки из последнего «N/A».

Соответствующая часть кода:

i = 1 
If SourceWorksheet = "Ret" Or SourceWorksheet = "Vol" Then 

    Do While w.Sheets(SourceWorksheet).Cells(i, 2) = "N/A" 

     i = i + 1  '****Problem IS HERE, IT IS NOT SUMMING TO i 

    Loop 

    Set RetRange = w.Sheets(SourceWorksheet).Range(Cells(i + 1, 1), Cells(xlLastCell)) 

Else 

    Set RetRange = w.Sheets(SourceWorksheet).UsedRange 

End If 

Obs 1: В этом случае я поставил = 1, но я уже пытался не присваивание значения для него до, но получил сообщение об ошибке ,

Обс 2: Поскольку это функция, которая принимает аргументы из поднабора, SourceWorksheet является аргументом, который будет вводиться пользователем.

Любые идеи о том, что не так с этим кодом?

+0

@ YowE3K мои клетки действительно есть строка '«= N/A»', так как они приходят из другого кода, который помещает эту строку там. Это не ошибка, это всего лишь указание на то, что данных недостаточно. – DGMS89

+0

@ YowE3K Действительно, вы правы. Я только что это сделал. – DGMS89

+0

Мой комментарий был неправильным, у кода действительно есть #. Но даже в этом случае я уже пытался изменить это на «Недоступно», чтобы избежать проблемы # N/A, но это все еще не работает. – DGMS89

ответ

1

Помимо множества других проблем, которые мы уже решили, ваш цикл не будет работать, если ячейка B1 не содержит «N/A» (например, из-за заголовков).

Попробуйте этот пересмотренный код:

With w.Sheets(SourceWorksheet) 
    If SourceWorksheet = "Ret" Or SourceWorksheet = "Vol" Then 
     i = 2 ' or i=3, whatever row contains your first item of data 
     Do While .Cells(i, 2).Value = "N/A" 
      i = i + 1 
     Loop 

     Set RetRange = .Range(.Cells(i, 1), .Cells.SpecialCells(xlCellTypeLastCell)) 

    Else 

     Set RetRange = .UsedRange 

    End If 
End With 
+0

Большое спасибо. Я полностью забыл о SpecialCells для второй части. – DGMS89

+0

@ DGMS89 - Вы также оставили часть «CellType» имени константы. И вы не проводили квалификацию «Ячейки» со ссылкой на лист, а это означало, что они ссылались бы на активный лист и поэтому, вероятно, сбой при попытке использовать их в качестве границ диапазона на листе «Исходный лист» , У вас определенно был выходной день! – YowE3K

+1

@ DGMS89 На самом деле, похоже, что 'xlLastCell' действительно работает, хотя' xlCellTypeLastCell' является «правильной» константой, показанной Intellisense. 'xlLastCell' является константой в' Excel.Constants' (со значением 11), а 'xlCellTypeLastCell' является константой в' Excel.XlCellType' (также со значением 11). – YowE3K