2013-10-01 3 views
2

Я повторяю через столбец «А» каждой строки в диапазоне, определяемом .UsedRange(), и записывая номер строки в ячейку. Странное поведение я вижу, когда номер строки записывается в ячейку, порядковый номер строки записывается только каждый второй ячейки:При повторении диапазона Excel значения записываются во каждую вторую ячейку

(1,1) = «1»

(2,1) = пусто

(3,1) = "2"

(4,1) = пусто

(5,1) = "3"

(6 , 1) = пусто

(7,1) = "4"

...

Лист имеет 10 строк, с пустыми ячейками в столбце "A", и отдельные слова в каждая ячейка в обоих столбцах «B» и «C». Когда я перехожу через код, я вижу, что количество строк (oRow.Row) повторяется последовательно, как и следовало ожидать, но значения записываются в другом месте. Я попытался сбросить .UsedRange(), как упоминалось здесь: http://www.j-walk.com/ss/excel/tips/tip73.htm, но никаких изменений с результатом не было.

код я использую:

Option Explicit 

Sub IterateAndWrite() 
    Dim oRange As Range 
    Dim oRow As Range 
    Dim lCount As Long 

    Set oRange = ThisWorkbook.Worksheets(1).UsedRange 

    For Each oRow In oRange.Rows 
     oRow.Cells(oRow.Row, 1).Value = oRow.Row 
     ' Reset the range 
     'lCount = ActiveWorkbook.Worksheets(1).UsedRange.Rows.Count 
    Next oRow 
End Sub 

Где я буду неправильно?

+0

Смотрите мой ответ ниже для объяснения что вы делаете неправильно (видимо, это недокументированный вариант использования метода '.Cells') и быстрый переход к вашему коду :) –

ответ

0

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

For Each oRow In oRange.Rows 
    oRange.Cells(oRow.Row, 1).Value = oRow.Row 
Next 

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

oRow.Cells(1,1).Value = oRow.Row 

ПОЧЕМУ?

Поскольку oRow является объектом диапазон, который представляет собой , например, $B$1:$C$1 и т.д. При использовании метода .Cells, вы передаете ему строку аргумент (oRow.Row), который вне от oRow объекта/диапазон. При использовании в этом одноиндексном способе он кажется эквивалентным методу Offset.

Например, Range("B2").Cells(2,1) является эквивалентом Range("B2").Offset(1,0), который является эквивалентом Range("B3"), поэтому, используя индекс строки, которая находится вне самой строки, вы заставляя его «пропустить» к следующей строке :)

Существует еще некоторая информация об этом via Chip Pearson's website:

это не является необходимым для ячейки, чтобы находиться в пределах диапазона, чтобы ссылаться таким образом. ... Что не задокументировано, так это то, что этот метод ссылок продолжается вниз по листу; например, Range ("A1: B2") (5) относится к ячейке A3, Range ("A1: B2") (14) относится к ячейке B7 и т.д.

+1

Большое спасибо за объяснение того, что происходит с кодом. Было разочаровывающе, что переменные выглядели нормально во время отладки, но код все еще не функционировал, как я ожидал. – ACS

+0

Добро пожаловать! Это тоже расстроило - мне пришлось найти ответ сам :) –

0

Try:

Sub IterateAndWrite() 
    Dim oRange As Range 
    Dim oRow As Range 
    Dim lCount As Long 

    Set oRange = ThisWorkbook.Worksheets(1).UsedRange 

    For lCount = 1 To oRange.Rows.Count 
     oRange.Cells(lCount, 1).Value = oRange.Cells(lCount, 1).Row 
    Next 
End Sub 
+0

Благодарим вас за альтернативу. Он работает так, как я надеялся, что мой код будет. Вы знаете, почему метод, который я использовал, который я видел на разных сайтах, не работает, как ваш? – ACS

0

вот как я понимаю ваше беспокойство:

Option Explicit 

Sub IterateAndWrite() 
    Dim oRange As Range 
    Dim oRow, range_to_write As Range 

    Set oRange = ThisWorkbook.Worksheets(1).UsedRange 

    'you need to set the range where you want to write as in below 
    Set range_to_write = oRange.Offset(, -1).Resize(, 1) 

    'here instead of rows, use cells since you are to iterate cells 
    For Each oRow In range_to_write.Cells 
     oRow.Value = oRow.Row 'oRow is now a range pertaining to a Cell 
    Next oRow 

End Sub 

Надеется, что это то, что вам нужно.

+0

Спасибо за ваш ответ. Я не использовал его, но это помогло мне узнать о методе .Offset. – ACS

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