в вашей логике есть главный недостаток c: использование UsedRange
, несмотря на то, что это 2D-диапазон, его свойство Item()
будет действовать так, как если бы это был одномерный массив с одной строкой после другого списка
, поэтому для «A1: H10» (восемь столбцов) адрес UsedRange
, UsedRange.Item(1)
будет указывать на «A1», UsedRange.Item(8)
будет указывать на «H1» и UsedRange.Item(9)
будет указывать на "A2" ...
, поэтому вам нужно l oop только через ячейки столбца H
Тогда есть недостаток кодирования, который использует все эти Select
/ Selection
: привычка всегда использовать явную ссылку на диапазон, соответствующую их родительскому рабочему листу и рабочей книге. Это может быть достигнуто, например, с использованием With... End With
construct
, вот возможный код (пояснения в комментариях):
Option Explicit
Sub TransferRows()
Dim i As Long
With Sheets("GAWi") ' reference "source" sheet
For i = .Cells(.Rows.Count, "H").End(xlUp).Row To 1 Step -1 ' loop backwards from referenced sheet column H last not empty cell row index to 1
Select Case UCase(.Cells(i, "H").Value) ' check for referenced sheet column H current row content
Case "L"
TransferRow Intersect(.UsedRange, .Rows(i)), Sheets("LWi") ' pass referenced sheet current row "used" range and "LWi" destination sheet to the helper sub
Case "W"
TransferRow Intersect(.UsedRange, .Rows(i)), Sheets("WMi") ' pass referenced sheet current row "used" range and "WMi" destination sheet to the helper sub
Case "A"
TransferRow Intersect(.UsedRange, .Rows(i)), Sheets("OTi") ' pass referenced sheet current row "used" range and "OTi" destination sheet to the helper sub
End Select
Next i
End With
End Sub
Sub TransferRow(sourceRng As Range, destSht As Worksheet)
With destSht
.Cells(.Rows.Count, 1).End(xlUp).Offset(1).Resize(, sourceRng.Columns.Count).Value = sourceRng.Value
End With
sourceRng.Delete xlUp
End Sub
Как видите, кроме поправок к предисловиям, которые я здесь привожу:
использование синтаксиса Select Case
вместо If Then End If
, который, как мне кажется, гораздо понятнее и также исправит незначительные логики c недостаток вашего оригинального кода: если проверка положительна, другие запускать не нужно (это вы могли бы получить с помощью конструкции If - Then - ElseIf - Endif
)
использование вспомогательного подпрограммы для запроса повторяющегося кода на
, что дает вам гораздо больший контроль над вашим кодом и помогает его обслуживанию
использование ячеек (строк .Count, colIndex) .End (xlUp) шаблон
, который наиболее часто используется для получения ссылки на последнюю непустую ячейку в некотором colIndex
(будь то число или буква) столбце