Для уточнения Избегайте использования Select .
Использование таких методов, как Select
, Copy
и Paste
, легко читается и визуализирует то, что делает ваш код - но - это приходит за плату. Это не самый эффективный и эффективный код, который может действительно отображаться, когда ваши приложения начинают становиться все больше и больше.
Большой или маленький, хорошей практикой является избегать подобных методов и обращаться непосредственно к вашему Worksheet
объекту и соответствующему Range
на листе, чтобы найти данные и поместить их в другое место.
Перефразируя главные ответы на этот вопрос, вот основные причины, по которым следует избегать этих методов;
- Выбор и выбор являются частой причиной ошибок во время выполнения.
- Это потому, что он не полагается ни на что (ни код, ни пользователь), изменяющий фокус листов. Если кто-то щелкает где-то еще или что-то в вашем коде меняет лист или выделение, он может вызовет странные результаты или ошибку.
- Как уже упоминалось выше, они замедляют ваш код. Немного погуглив, вы найдете тесты, показывающие разницу во времени между использованием этих методов и их избеганием.
с учетом сказанного, это должно решить вашу проблему:
Sub CopyPaste3()
Dim row As Integer
Dim lastrow As Integer
Dim r As Integer
Dim S1 As Worksheet
Dim S2 As Worksheet
Dim myArray As Variant
Dim Destination As Range
Set S1 = Worksheets("Sheet1")
Set S2 = Worksheets("sheet2")
rowg = 12
lastrow = S1.Range("A" & Rows.Count).End(xlUp).row
For r = 2 To lastrow
If S1.Range("D" & r).Value = "Y" Then
myArray = S1.Range("E" & r & ":F" & r).Value
Set Destination = S2.Cells(rowg, 7)
Set Destination = Destination.Resize(UBound(myArray, 2), 1)
Destination = Application.Transpose(myArray)
rowg = S2.Range("G" & Rows.Count).End(xlUp).row + 1
End If
Next r
End Sub
Я использовал массив, чтобы захватить необходимые значения столбца E в F и транспонировать те к вашему целевому диапазону. Я использовал переменную rowg
, которую вы обновляете при каждой итерации при перемещении данных - поскольку в качестве строки у вас было жестко задано значение 12, оно ранее каждый раз перезаписывало ваши значения, а не переходило к следующей пустой строке.
Вот примеры данных листа1 и листа2:
Лист1
![Sample input sheet1](https://i.stack.imgur.com/IV0h5.png)
Лист2:
![Sample output sheet2](https://i.stack.imgur.com/VyCZ2.png)