2015-08-14 3 views
0

Я пытаюсь сделать код, который проверяет номера в листе мастера, который называется All в столбце D (например, 780101), и если он соответствует критериям, он копирует весь ряд и вставляет (не вставляют) его на другой лист с именем критериев (например, 780101), начиная с строки 6. Код, который у меня есть, не работает, как я этого хочу. Он не копирует все строки, соответствующие критериям, и иногда он вставляет пустые строки.Excel: скопировать и вставить строки на другом листе на основе ячейки

Sub Insert() 
For Each Cell In Sheets("All").Range("D:D") 
If Cell.Value = "780101" Then 
    matchRow = Cell.Row 
    Rows(matchRow & ":" & matchRow + 1).Select 
    Selection.Copy 
    Sheets("780101").Select 
    Rows("6:6").Select 
    Selection.Insert Shift:=xlDown 
End If 
Next 
End Sub 

Я только начинаю изучать VBA, так что, если это может быть возможным имена листов будет критерии значения ячеек (код для использования только в одном листе - 780101, но есть 20 листов с разными названиями).

+0

a) Это те тексты, которые выглядят как число, а не реальные цифры? 'If ​​Cell.Value =" 780101 "...' не то же самое, что 'If Cell.Value = 780101 ...'. б) если в строке ниже ничего нет (что вы включаете в копию), то да, вы будете получать пустые строки. – Jeeped

+0

@Jeeped a) Нет, это цифры. Как котировка в формуле влияет на результат? б) На главном листе нет пустых строк. Числа разделяются только по строкам с помощью слова «Департамент» в том же столбце, что и числа (D). – Aktist

+0

re: цитируемые числа против чисел. Вы также можете задать разницу между '.Value' и' .Value2'. – Jeeped

ответ

0

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

Sub Insert() 
    Dim dc As Range 
    With Sheets("All") 
     For Each dc In Intersect(.Range("D:D"), .UsedRange) 
      If dc.Value2 = 780101 Then 
       dc.Resize(2, 1).EntireRow.Copy 
       Sheets("780101").Rows(6).Insert Shift:=xlDown 
      End If 
     Next 
    End With 
End Sub 

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

+0

Код отлично работает, возникла небольшая проблема с линией 'dc.Resize (2, 1) .EntireRow.Copy'. Последние две строки, которые соответствовали критериям, были удвоены, а строка под ними также была скопирована в лист 780101 (рабочий 15, рабочий 16, отдел). Смотрите изображение: http://pasteboard.co/2HWSxrZw.png Я изменил его на 'dc.Resize (** 1 **, 1) .EntireRow.Copy', и он работает как шарм. – Aktist

+0

Привет, я использую приведенный выше код. Я могу вставить данные с одного листа на другой, но, как вы сказали, в обратном порядке, как читать снизу вверх – Arihant

Смежные вопросы