2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Программа в Visual Basic для Microsoft Excel
Сообщение24.04.2010, 22:17 
Аватара пользователя
Никогда не программировал в 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

Программа, вроде бы, работает (во всяком случае, при пошаговом выполнении), но при запуске из документа изображение начинает ужасно мигать, программа выполняется страшно медленно. Кроме того, при копировании строк копируются на новое место также их границы (оформление таблицы - линии, выделяющие заголовки), что нежелательно.
Как бы это исправить?

 
 
 
 Re: Программа в Visual Basic для Microsoft Excel
Сообщение24.04.2010, 23:08 
Для того, чтобы убрать моргание при работе макро, надо в начале Вашей программы запретить обновление экрана:
Код:
Application.ScreenUpdating = False
а в конце -- снова разрешить:
Код:
Application.ScreenUpdating = True

Чтобы копировать только значения в ячейках, а не их оформление, можно вместо одного вызова
Код:
.Rows(n).Copy(.Rows(m))
воспользоваться парой
Код:
.Rows(n).Copy ' копируем в Clipboard
.Rows(m).PasteSpecial Paste:=xlPasteValues ' Вставляем из Clipboard'а только значения
(лучше, наверное, их в отдельную подпрограммку вынести)

 
 
 
 Re: Программа в Visual Basic для Microsoft Excel
Сообщение24.04.2010, 23:33 
Аватара пользователя
Можно предложить ещё пару вариантов без программирования:
1) Встать на ячейку A2 (или какая будет строка, следующая за заголовком), выбрать меню "Окно \ Закрепить области", а все остальные заголовки - стереть. Тогда при скроллинге заголовок будет оставаться на месте.
2) Выделить-таки информационные строки на отдельный лист, а в ячейки таблицы вставить формулы вида "=Лист1!A1" и откопировать их сколько нужно. Тогда при сортировке данных таблицы будут пересчитываться сами.

 
 
 
 Re: Программа в Visual Basic для Microsoft Excel
Сообщение29.04.2010, 23:02 
Аватара пользователя
Спасибо, программу, вроде бы, отладил.

Варианты без программирования тоже интересны. Если бы я знал про первый вариант, то программу писать не стал бы.

 
 
 [ Сообщений: 4 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group