Никогда не программировал в Visual Basic для Microsoft Excel, но понадобилось время от времени сортировать таблицу. Меня бы устроило сортировать её вручную (выделить нужные строки и выполнить команду сортировки), но проблема в том, что таблица довольно длинная, и её заголовок периодически дублируется, разбивая, таким образом, таблицу на части, а для таких таблиц команда сортировки не работает. Конечно, можно скопировать информационные строки таблицы на отдельное поле, отбросив заголовки, отсортировать и скопировать назад, но это отнимает довольно много времени, поскольку таблица уже большая и время от времени пополняется. Сочинил такую программку:
Код:
Const LP As Integer = 38
Sub Кнопка1_Щелчок()
Dim K, L, M, N As Integer
K = NextL(0)
With Лист1
L = K
Do While .Cells(L, 1) <> ""
L = NextL(L)
Loop
' L=L+LP
K = NextL(K)
Do While K < L
' Do While .Cells(K, 1) <> ""
M = K
N = PrevL(M)
If .Cells(N, 1).Text > .Cells(K, 1).Text Then
.Rows(K).Copy (.Rows(L))
Do
.Rows(N).Copy (.Rows(M))
M = N
N = PrevL(M)
If N < 1 Then Exit Do
If .Cells(N, 1).Text < .Cells(L, 1).Text Then Exit Do
Loop
.Rows(L).Copy (.Rows(M))
End If
K = NextL(K)
Loop
.Rows(L).Clear
End With
End Sub
Function NextL(ByVal N As Integer) As Integer
Dim M As Integer
M = WorksheetFunction.Floor(N, LP)
M = N - M
If M < 3 Then N = N + (3 - M) Else N = N + 1
NextL = N
End Function
Function PrevL(ByVal N As Integer) As Integer
Dim M As Integer
M = WorksheetFunction.Floor(N, LP)
M = N - M
If M <= 3 And M > 0 Then N = N - M Else N = N - 1
PrevL = N
End Function
Программа, вроде бы, работает (во всяком случае, при пошаговом выполнении), но при запуске из документа изображение начинает ужасно мигать, программа выполняется страшно медленно. Кроме того, при копировании строк копируются на новое место также их границы (оформление таблицы - линии, выделяющие заголовки), что нежелательно.
Как бы это исправить?