VBA: копирование диапазона (строка за строкой) в al oop и вставка этого (строка за строкой) в новый лист (оператор l oop + if) - PullRequest
0 голосов
/ 21 апреля 2020

В VBA я пытаюсь запустить al oop с оператором if. L oop настроен для одновременного запуска строки для диапазона (wks "Данные", B7: J25).

Для каждой строки, если значение в столбце C7: C25 равно 1, я хотел бы скопировать эту строку (например, B7: J7) и вставить ее в таблицу «temp» по одному за раз.

Я пробовал различные коды, например:

Sub start()
   Dim i As Integer
   Dim wsData, wsCalcAndOutput, wsTemp As Worksheet
      For i = 1 To 25
         If Cells((7 + i), 3) = "1" Then
         Worksheets("Data").Range("B7:J7").Copy _
         Worksheets("temp").Range("B7:J7")
         End If
      Next
End Sub

Но тогда я могу только скопировать и вставить первую строку диапазона. Кроме того, я нашел эту процедуру в stackoverflow, но я не могу вставить то, что копирую на каждой итерации:

Dim wsData, wsCalcAndOutput As Worksheet Dim rSPX, rSX5E, rNKY, rUKX, rSMI, REEMUP, testData As Range

Sub start()
   Dim i As Integer

   For i = 1 To 25
         If Cells((7 + i), 3) = "1" Then
              With ActiveSheet
               .Range(.Cells((7 + i), 2), .Cells((7 + i), 10)).Copy
              End With
         End If
   Next

End Sub

Это правильный способ сделать это или есть более эффективный способ?

Также - в наборе данных критерием для оператора if на самом деле является строка с именем «ИСТИНА» или «ЛОЖЬ». Может ли оператор if использовать строку в качестве сигнала вместо «1»?

Всего наилучшего, Кристоффер

1 Ответ

0 голосов
/ 21 апреля 2020

Как говорит BigBen, использование AutoFilter было бы быстрее, но вот один из способов сделать это с al oop. Добавили несколько комментариев, которые, надеюсь, объясняют основы.

Одна проблема с вашим кодом заключалась в том, что вы не меняли целевые ячейки, поэтому они постоянно перезаписывались.

Sub start()

Dim i As Long 'better than integer
Dim n As Long: n = 7
Dim wsData As Worksheet, wsCalcAndOutput As Worksheet, wsTemp As Worksheet 'specify each type

With Worksheets("Data")
    For i = 7 To 25 'change as appropriate
        If .Cells(i, 3) = 1 Then 'no need for quotes
            Range(.Cells(i, "B"), Cells(i, "J")).Copy _
                    Worksheets("temp").Cells(n, "B") 'start at row 7?
            n = n + 1 'update so that we don't overwrite next time
        End If
    Next
End With

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