Excel vba - xlDown - PullRequest
       5

Excel vba - xlDown

8 голосов
/ 23 февраля 2012

Приведенный ниже код пытается вставить выбранный диапазон (переданный как rng) в конец листа. Это работает, если уже есть 2 строки (A1, A2).

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 строк, не уверен.

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

1 Ответ

35 голосов
/ 23 февраля 2012

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

Конец (xlDown) - это эквивалент VBA нажатия Ctrl + 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
  • Если столбец A пуст, для 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 даст вам представление о влиянии различных комбинаций значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...