2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Программа в Visual Basic для Microsoft Excel
Сообщение24.04.2010, 22:17 
Заслуженный участник
Аватара пользователя


23/07/05
17985
Москва
Никогда не программировал в 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 
Заслуженный участник


09/08/09
3438
С.Петербург
Для того, чтобы убрать моргание при работе макро, надо в начале Вашей программы запретить обновление экрана:
Код:
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 
Заблокирован
Аватара пользователя


07/08/06

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

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


23/07/05
17985
Москва
Спасибо, программу, вроде бы, отладил.

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group