Прочитайте комментарии к коду и настройте его в соответствии с вашими потребностями.
Некоторые вещи для начала:
- Используйте явную опцию , чтобы у вас не было неожиданное поведение с неопределенными переменными
- Всегда делайте отступ в своем коде (см. www.rubberduckvba.com бесплатный инструмент, который поможет вам в этом)
- Попробуйте отделить ваши логики c, определяя переменные и их повторное использование
РЕДАКТИРОВАТЬ: Некоторые отзывы к вашему коду:
Как упомянуто @ Pᴇʜ вам нужно объявлять каждый из ваших типов переменных.
Это:
Dim k,j,i As Interger
- это то же самое, что и объявление:
Dim k As Variant
Dim j As Variant
Dim i As Integer
Сторона примечание. У вас была опечатка в Interger
Это не то, что вы действительно хотите, зная, что все они будут хранить номера
Объявите объекты, с которыми вы собираетесь работать. Например, вы обращаетесь к листу Санкции три раза в своем коде:
ActiveWorkbook.Sheets("Sanctions")
Это можно установить один раз так:
Set targetSheet = ThisWorkbook.Worksheets("Sanctions")
И затем использовать повторно в таких строках:
With Sheets("Sanctions")
или это:
Sheets("Sanctions").Range("NextRow")
, написав это:
With targetSheet
таким образом, если вам когда-нибудь понадобится изменить его (человек, работающий с вашим кодом, или ваше будущее, вы будете очень благодарны)
Объявление ваших переменных просто буквами делает ваш код действительно трудным для понимания.
Dim j,k,l
отличается, когда у вас есть:
Dim lastRow As Long
Dim lastColumn As Long
etc.
Я предлагаю вам воспользоваться ключом F8
, пройтись по коду и увидеть логи c позади него. Таким образом, вы можете узнать больше.
Код:
Public Sub ConditionalRowCopy()
' Declare object variables
Dim sourceSheet As Worksheet
Dim targetSheet As Worksheet
Dim cell As Range
' Declare other variables
Dim sourceLastRow As Long
Dim targetLastRow As Long
' Set a reference to the sheets so you can access them later
Set sourceSheet = ThisWorkbook.Worksheets("PEP")
Set targetSheet = ThisWorkbook.Worksheets("Sanctions")
' Find last row in source sheet based on column "R"
sourceLastRow = sourceSheet.Cells(sourceSheet.Rows.Count, "R").End(xlUp).Row
' Find cell with word "Emetteurs", search in column R)
For Each cell In sourceSheet.Range("R1:R" & sourceLastRow).Cells
' If match
If cell.Value = "Emetteurs" Then
' Find last row in target sheet based on column "A"
targetLastRow = targetSheet.Cells(targetSheet.Rows.Count, "A").End(xlUp).Row
' Copy entire row to next empty row in target sheet
cell.EntireRow.Copy Destination:=targetSheet.Range("A" & targetLastRow).Offset(RowOffset:=1)
End If
Next cell
End Sub
Дайте мне знать, если это работает!