2012-02-22 2 views
6

Код ниже пытается вставить выбранный диапазон (переданный как rng) в конец рабочего листа. Он работает, если уже имеется 2 ряда (A1, A2).Excel vba - xlDown

Sub copyRow(rng As Range, ws As Worksheet) 
    Dim newRange As Range 
    Set newRange = ws.Range("A1").End(xlDown).Offset(1, 0) 
    rng.Copy 
    newRange.PasteSpecial (xlPasteAll) 
End Sub 

Итак, если присутствуют A1 и A2, и если вы вызываете этот метод 100 раз, он вставляет по 100 строк после них. Но, если строк нет или только A1, он просто перезаписывает A2. Я мог видеть, что Excel записывается в той же строке (переписывать)

Появляется, что-то связано с тем, как xlDown вычисляет, если есть менее 2 строк, не уверен.

Любая помощь будет оценена по достоинству.

ответ

29

Извините, но я не согласен с ответом Майкла.

Конец (xlDown) является эквивалентом VBA щелчка + Down.

Попытка Ctrl + Down с

  • пустой столбец
  • столбец со значением в строке 1, но без каких-либо других
  • значений в строках 1 и 2
  • значений в строках 1, 2 , 3, 7, 8, 9, 13, 14 и 15

Это даст вам представление обо всех разных строках, Ctrl + Down может зайти.

Set newRange = ws.Range("A1").End(xlDown).End(xlDown).End(xlUp).Offset(1, 0) не обязательно вас к последней использованной строке плюс 1.

Я удивлен Set newRange = ws.Range("A1").End(xlDown).Offset(1, 0) работал с пустой колонкой. Range("A1").End(xlDown) приведет вас к нижнему ряду листа, тогда .Offset(1, 0) попытается увести вас с листа.

Рассмотрим:

Dim RowLast As Long 

RowLast = ws.Cells(Rows.Count, "A").End(xlUp).Row 
  • Если столбец А пусто, RowLast будет установлен в 1.
  • Если A1 имеет значение, но никакие другие клетки не имеют значения, RowLast будет установлен в 1.
  • Если количество ячеек в столбце A имеет значения, RowLast будет установлен в нижнюю строку со значением.
  • Если у вас есть значение в последней строке, оно будет проигнорировано.
  • Если у вас есть значение в последних двух строках, для RowLast будет установлено значение Rows.Count - 1.

Я предполагаю, что у вас нет значений в строках борма. Если вы не все равно, если строка 1 остаются пустой с пустой колонкой, то:

RowLast = ws.Cells(Rows.Count, "A").End(xlUp).Row 
Set NewRange = ws.Cells(RowLast + 1, "A") 

должен дать желаемый результат, независимо от текущего содержимого листа WS.

Если вы заботитесь о строке 1 остаться пустым, экспериментируя с Ctrl + Down и Ctrl + Up даст вам представление о влиянии различных комбинаций значений.

+5

+1 за красивое объяснение. Как бы то ни было, я никогда не поддерживал использование «ws.Range (« A1 »). End (xlDown)» для установки диапазона. Причина в том, что она не дает (вполне понятно) правильного диапазона, если между ними есть пустая ячейка. :) –

+0

Тони, спасибо за помощь ур. Это сработало для меня. Что касается первой части, почему я так делал, я шел по пункту 18 http://support.microsoft.com/kb/291308. Удивлен, чтобы не было простого способа сделать это. спасибо ага. – bsr

+0

@SiddharthRout .. или хуже последней ячейки, если строка пуста. Взгляд вверх намного лучше, но все же необходим тест для обеспечения того, чтобы диапазон данных не был пустым. ['Find' может быть проще] (http://stackoverflow.com/q/4872512/641067) в зависимости от того, что необходимо – brettdj

1

Проблема в том, что строка Offset указывает на строку, которая не является частью диапазона. Но без смещения вы попадаете в фактическую последнюю строку значения. Поэтому, вместо того, чтобы пытаться спуститься с вершины, давайте подняться снизу.

Go End (Down) дважды: один раз в конце этого диапазона, еще раз, чтобы выйти из этого диапазона. Затем перейдите в конец (вверх) один раз, а затем смещайте его на 1:

Sub copyRow(rng As Range, ws As Worksheet) 
    Dim newRange As Range 
    Set newRange = ws.Range("A1").End(xlDown).End(xlDown).End(xlUp).Offset(1, 0) 
    rng.Copy 
    newRange.PasteSpecial (xlPasteAll) 
End Sub 
+0

не похоже, что он работает для меня, он просто создает записи для A2, A3 (и A3 над написанием остальной части времени). Я сделаю тестовый файл и присоединяюсь к этому вопросу. Спасибо за вашу помощь. – bsr

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