В отсутствие кода для функции SheetExists () я протестировал ваш код, заменив
If SheetExists(Cells(Row, 2).Value) Then
Set st_sheet = Sheets(Cells(Row, 2).Value)
от
If Cells(Row, 2).Value = "OH" Then
Set st_sheet = Sheets("Sheet2")
Список работает снизу вверх, что хорошо при удалении (но не единственный возможный способ). Первая строка, соответствующая условиям, - это строка № 4, которая помещается в строку 2 Листа 2, оставляя 1 строку пустой (из-за +1). Эта пустая строка # 1 создает некоторую путаницу для последующих вызовов к UsedRange, и последующее попадание в строку # 2 (условие даты) перезаписывает первую находку.
Кстати, 1-й If Row >= 2 Then
излишен, потому что окружение For
так или иначе устанавливает границы.
Я бы порекомендовал немного перекодировать весь саб ....
Sub Move1()
Dim SrcRng As Range, SrcIdx As Long
Dim TSPRng As Range, CtyRng As Range, TrgIdx As Long
Dim CblDate As Date
Set SrcRng = Sheets("Sheet1").[A1] ' source sheet
Set TSPRng = Sheets("Sheet2").[A1] ' target for date condition
Set CtyRng = Sheets("Sheet2").[A1] ' target for country condition, preliminary set equal to TSP
CblDate = DateAdd("yyyy", -59.5, Date)
SrcIdx = 2 ' 1st row is header row
' we stop on 1st blank in 1st column of SrcRng
Do While SrcRng(SrcIdx, 1) <> ""
If SrcRng(SrcIdx, 3) < CblDate Then
' copy to TSP sheet
TrgIdx = GetIdx(TSPRng)
SrcRng(SrcIdx, 1).EntireRow.Copy TSPRng(TrgIdx, 1)
' delete from source
SrcRng(SrcIdx, 1).EntireRow.Delete xlShiftUp
ElseIf SrcRng(SrcIdx, 2) = "OH" Then ' replace by your on condition re country
' here you would set CtyRng acc. to some algorithm
' copy to Country sheet
TrgIdx = GetIdx(CtyRng)
SrcRng(SrcIdx, 1).EntireRow.Copy CtyRng(TrgIdx, 1)
' delete from source
SrcRng(SrcIdx, 1).EntireRow.Delete xlShiftUp
Else
' we don't increment after deletions, because all records move up anyhow
SrcIdx = SrcIdx + 1
End If
Loop
End Sub
Function GetIdx(InRng As Range) As Long
' find row number of 1st empty row in 1st column of range InRng
GetIdx = 1
Do While InRng(GetIdx, 1) <> ""
GetIdx = GetIdx + 1
Loop
End Function
Конечно, если вы установите целевые листы на [A2] вместо A1, вы начнете вставлять во 2-ю строку ...
Надеюсь, это поможет
Удачи MikeD
после принятия редактирования
Что не так:
Очевидно, основная причина заключается в том, что UsedRange.Rows.Count
возвращает 1 для пустого листа (по крайней мере, в Excel 2003), что может оказаться неожиданным. Это означает, что при записи в ...UsedRange.Rows.Count + 1
ваша первая запись вставляется в строку № 2 пустого листа. К сожалению, с одной строкой на листе (в строке № 2 или в другом месте) вы получите тот же результат, который заставляет 2-ю запись данных перезаписывать первую и т. Д., Поскольку количество строк никогда не увеличивается.
Я проверил это с помощью отладки через этот маленький
Sub test()
Debug.Print ActiveSheet.UsedRange.Rows.Count
End Sub