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