БлогNot. Как отсортировать ячейки Excel из макроса VBA?

Помощь дата->рейтинг Поиск Почта RSS канал Статистика nickolay.info Домой

Как отсортировать ячейки Excel из макроса VBA?

Просто понадобился пример программной сортировки чисел из кода на VBA.

Отметим, что решать многие счётные задачи в Excel можно как "вручную", программируя типовые алгоритмы, так и вызывая стандартные функции VBA или Excel, если таковые имеются.

Поэтому в примере можно сортировать и "пузырьком", и готовым методом Range.Sort.

В большинстве случаев штудирование MSDN позволяет легко найти ответы, как правильно вызывать тот или иной встроенный метод :)

Служебная функция getArrayFromCells, почти такая же, как здесь, считывает глобальный вещественный массив A из подряд заполненных ячеек столбца "A" и определяет его размерность N.

Функция ClearMe очищает рабочие ячейки листа, а остальные 3 подпрограммы обрабатывают нажатия кнопок "Заполнить", "СОРТИРОВКА" и "СОРТИРОВКА VBA", подробности видны из листинга.

Ниже показан этот листинг и прикреплён файл в архиве .zip с книгой .xlsm (документ Excel с макросами). Если при открытии книги Excel предупреждает о наличии макросов, их выполнение нужно разрешить:

разрешить выполнение макросов в Excel
разрешить выполнение макросов в Excel
Public A() As Double
Public N As Integer

Sub getArrayFromCells() 'Получить из столбца A массив чисел
 N = 0: I = 1
 Do While True
  V = Range("A" & I).Value
  If IsEmpty(V) Or IsNumeric(V) = False Then
   Exit Do
  End If
  N = I: I = I + 1
 Loop
 If N < 1 Then
  Range("B1").Value = "Ошибка:"
  Range("C1").Value = Str(N) & " чисел в столбце A"
  Exit Sub
 Else
  Range("B1").Value = "Всего:": Range("C1").Value = N
 End If
 ReDim A(1 To N)
 For I = 1 To N
  A(I) = Val(Range("A" & I).Value)
 Next I
End Sub

Sub ClearMe() 'Очистить лист
 Range("A:A").Select: Selection.Clear
 Range("B1").Select: Selection.Clear
 Range("C1").Select: Selection.Clear
 Range("A1").Select
 N = 0
End Sub

Sub Кнопка1_Щелчок() 'Сортировка массива "вручную"
 Call getArrayFromCells
 'Отсортировать полученный массив:
 For I = 1 To N - 1    'Каждый элемент
  For J = I + 1 To N   'сравнить с оставшимися до конца
   If A(I) > A(J) Then 'и, если нужно, поменять местами
    T = A(I): A(I) = A(J): A(J) = T
   End If
  Next J
 Next I
 'Записать обратно в столбец A:
 For I = 1 To N
  Range("A" & I).Value = A(I)
 Next I
End Sub

Sub Кнопка2_Щелчок() 'Сортировка вызовом функции VBA
 Call getArrayFromCells
 If N > 0 Then
  Range("A1:A" & N).Sort Key1:=Range("A1"), _
   Order1:=xlAscending, Header:=xlNo
 End If
End Sub

Sub Кнопка3_Щелчок() 'Заполнение случайными числами
 Call ClearMe
 N = 10 + Round(Rnd() * 10, 0)
 ReDim A(N)
 Randomize
 For I = 1 To N 'целые числа от -50 до 50
  A(I) = Round(-50 + Rnd() * 100, 0)
  Range("A" & I).Value = A(I)
 Next I
 Range("B1").Value = "Всего:": Range("C1").Value = N
End Sub

 скачать этот пример в архиве .zip с книгой Excel .xlsm (15 Кб)

Кстати:
Если при вставке кода в редактор Visual Basic for Applications (или вставке куда-либо кода, скопированного из VBA) символы кириллицы превращаются в "кракозябры", установите русскую раскладку клавиатуры перед копированием в Буфер Обмена.


теги: учебное программирование макрос vba excel

15.05.2018, 22:30; рейтинг: 130

  свежие записипоиск по блогукомментариистатистика

Наверх Яндекс.Метрика
© PerS
вход