Использование.Rows в Excel VBA

У меня проблемы с чистотой копирования / вставки. В настоящее время у меня есть это:

If distanceValue <= distanceParameter Then
    sh2.Rows(i).Copy _
    sh3.Rows(i).Offset(0, 1)
End If

sh2 и sh3 определены правильно и находятся внутри цикла for; это не проблема. Range кажется грязным в использовании, так как я должен был бы определить переменную lastcolumn и т. Д. Есть ли способ сделать это с.Rows?

Цель состоит в том, чтобы скопировать строку, если она удовлетворяет условию, на другой лист, но оставить столбец A пустым. Любые отзывы о чистых решениях (я знаю, что это неправильно) будет принята с благодарностью.

1 ответ

Решение

Ваш диапазон копирования (если вы копируете всю строку) будет больше, чем диапазон вставки, если вы смещены на столбец. Вы не можете вставить 16384 столбца в 16383, недостаточно места.

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

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

Sub Sample()
Dim sh2 As Worksheet, sh3 As Worksheet

Set sh2 = Worksheets("Sheet1")
Set sh3 = Worksheets("Sheet2")

If distanceValue <= distanceParameter Then
    sh2.Rows(i).Copy _
    sh3.Rows(i)
End If

sh3.Columns("A").insert
End Sub

ИЛИ ЖЕ

Sub Sample()
Dim sh2 As Worksheet, sh3 As Worksheet

Set sh2 = Worksheets("Sheet1")
Set sh3 = Worksheets("Sheet2")

sh2.Columns("A").insert

If distanceValue <= distanceParameter Then
    sh2.Rows(i).Copy _
    sh3.Rows(i)
End If

'The next line is to return the source data back to the original format remove if not needed

sh2.Columns("A").Delete

End Sub

Ваш последний и наиболее динамичный вариант будет работать с listobject/DataTable вместо диапазона Excel. ЕСЛИ ВОЗМОЖНО.

Если у вас уже есть таблица, то вы можете просто использовать:

Sub Sample()
Dim sh2 As Worksheet, sh3 As Worksheet
Dim rngCurrentRow As Range

Set sh2 = Worksheets("Sheet1")
Set sh3 = Worksheets("Sheet2")

Set rngCurrentRow = sh2.ListObjects("YourTableNameHere").ListRows(i).Range

If distanceValue <= distanceParameter Then
    rngCurrentRow.Copy _
    sh3.Cells(i, 2)
End If

End Sub

Очень просто создать диапазон в таблице, если ваши данные не содержат пробелов, это так же просто, как щелкнуть первую ячейку в диапазоне и нажать Ctrl+L После этого будет выбран ваш диапазон. Если вам нужно увеличить размер диапазона, поскольку он содержит пробелы, просто измените поле ввода, чтобы выбрать все ваши данные.

Не забудьте, если у вас есть heade3rs, чтобы проверить флажок

ПРИМЕЧАНИЕ. Если вы не уверены в названии таблицы, просто нажмите на таблицу, после чего на ленте откроется новая вкладка, а в конце появится табличка Инструменты / Дизайн. На этой вкладке самая левая область содержит имя вашей таблицы. Вы можете изменить это на что угодно.

Другие вопросы по тегам