powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Excel &VBA
14 сообщений из 14, страница 1 из 1
Excel &VBA
    #32330861
Olesia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу сделать форму с использованием VBasic в документе Excel, для сортировки по записям в таблице (Excel), подскажите, пожалуйста, как это сделать.
...
Рейтинг: 0 / 0
Excel &VBA
    #32331120
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это для работы (а не для учёбы, напр.), то чем не устраивает сортировка
стандартная форма сортировки по 1...3 полям (Данные-->Сортировка)?
После этого можно обсуждать варианты...
...
Рейтинг: 0 / 0
Excel &VBA
    #32332538
Olesia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению, если бы все было так просто.
Но все-таки, как сформировать массив для осуществления сортировки по записям в таблице?
Например: Выделяются нужные записи в таблице excel, с которыми нужно осуществить сортировку, далее нажимаю на кнопку (находящуюся рядом с таблицей), появляется окно, где находятся несколько переключателей (сортировка по возрастанию, по убыванию и др.), ставлю галочку на нужном переключателе и нажимаю «ОК». В таблице при этом происходят изменения в соответствии с заданной операцией.
И нужно ли использовать макросы?
...
Рейтинг: 0 / 0
Excel &VBA
    #32332840
Фотография Stepler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не понял, проблема в чём - можно или нет использовать макросы!? Мона использовать, если это проще... Объясни поточнее, в чем непонятки...

Stepler (щёлк-щёлк!!)
...
Рейтинг: 0 / 0
Excel &VBA
    #32332844
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно ли использовать макросы?
Если правило отбора реализуется стандартным автофильтром, то не нужно.
После фильтрации на экране видны записи, которые можно сортировать стандартными "кнопками" (диалоговыми окнами) Excel.
Однако отфильтрованные записи НЕ образуют непрерывный диапазон
(это легко видеть после нажатия кнопки "Копировать": "бегущие муравьи" сегментированы).
...
Рейтинг: 0 / 0
Excel &VBA
    #32333664
Olesia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я нашла код сортировки массива, но как связать его с таблицей Excel, так, чтобы в таблице происходила сортировка по заданным параметрам, при выделении в таблице того или иного столбца или строки?

Option Explicit
Private Sub CancelButton_Click()
Unload Me
End Sub
Private Sub Label2_Click()
End Sub
Private Sub OKButton_Click()
Dim Array1(), Array2(), Array3(), Array4()
Dim i As Long
Dim Elements As Long, RElement As Long, Temp As Long
Dim Time1 As Date, Time2 As Date
Dim Time3 As Date, Time4 As Date
Dim Time5 As Date, Time6 As Date
Dim Time7 As Date, Time8 As Date
Dim Msg As String
lblTime1.Caption = ""
lblTime2.Caption = ""
lblTime3.Caption = ""
LblTime4.Caption = ""
' Сообщения в окне
If IsNumeric(tbElements.Value) Then
If tbElements.Value > 65536 And Me.CheckBox1 Then
MsgBox "Сортировка на рабочем листе выполняется только для 65,536 элементов."
Exit Sub
End If
Else
MsgBox "Неправильное значение (Количество элементов)", vbInformation
tbElements.SetFocus
Exit Sub
End If
Elements = Val(tbElements.Value)
If Elements < 1 Then
MsgBox "Неправильное значение (Количество элементов)", vbInformation
tbElements.SetFocus
Exit Sub
End If
' Создание четырех одинаковых массивов
lblCurrentSort = "Создание массива..."
Me.Repaint
Randomize
ReDim Array1(1 To Elements, 0)
ReDim Array2(1 To Elements)
ReDim Array3(1 To Elements)
ReDim Array4(1 To Elements)
For i = 1 To Elements
Array1(i, 0) = Rnd * 1000
' Else
' Array1(i, 0) = i
' End If
Array2(i) = Array1(i, 0)
Array3(i) = Array1(i, 0)
Array4(i) = Array1(i, 0)
Next i
' частично сортированный массив?
If obSorted Then
RElement = Int((Elements) * Rnd + 1)
Temp = Array1(RElement, 0)
Array1(RElement, 0) = Array1(1, 0)
Array1(1, 0) = Temp
Array2(RElement) = Array2(1)
Array2(1) = Temp
Array3(RElement) = Array3(1)
Array3(1) = Temp
Array4(RElement) = Array4(1)
Array4(1) = Temp
End If
' Сортировка на рабочем листе
If CheckBox1 Then
lblCurrentSort = "Сортировка на рабочем листе..."
Me.Repaint
Time1 = Timer
Call WorksheetSort(Array1)
Time2 = Timer
lblTime1.Caption = Format(Time2 - Time1, "00.00") & " sec."
Me.Repaint
End If
' Пузырьковый метод
If CheckBox2 Then
lblCurrentSort = "Пузырьковый метод..."
Me.Repaint
Time1 = Timer
Call BubbleSort(Array2)
Time2 = Timer
lblTime2.Caption = Format(Time2 - Time1, "00.00") & " sec."
Me.Repaint
End If
' Быстрая сортировка
If CheckBox3 Then
lblCurrentSort = "Быстрая сортировка..."
Me.Repaint
Time1 = Timer
Call Quicksort(Array3, LBound(Array2), UBound(Array2))
Time2 = Timer
lblTime3.Caption = Format(Time2 - Time1, "00.00") & " sec."
Me.Repaint
End If
' Метод пересчета
If CheckBox4 Then
lblCurrentSort = "Метод пересчета..."
Me.Repaint
Time1 = Timer
Call Countingsort(Array4)
Time2 = Timer
LblTime4.Caption = Format(Time2 - Time1, "00.00") & " sec."
Me.Repaint
End If
lblCurrentSort = "Готово."
End Sub
...
Рейтинг: 0 / 0
Excel &VBA
    #32333920
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я нашла код сортировки массива
Этот код демонстрирует алгоритмы сортировки и приведен в учебных целях.

как связать его с таблицей Excel, так, чтобы в таблице происходила сортировка по заданным параметрам,
при выделении в таблице того или иного столбца или строки?

Типичная ошибка: при выделении в таблице того или иного столбца или строки
Выделяют обычно записи или поля.

1. Таблицы, как правило, имеют "шапку" (аналог имён полей в БД).
2. Таблицы НЕ содержат пустых строк или столбцов.
3. Таблицы имеют размеры, определяемые программно.
4. Существует встроенный метод сортировки, работающий быстрее любого приведенного
(за счёт того, что он уже скомпилирован и оптимизирован).
Он-то и использует наименования полей (как правило) для сортировки.
5. Существует метод Autofilter, позволяющий как программно, так и интерактивно фильтровать записи
(обычно представляет интерес выборка , а не вся таблица)

Вот код, сортирующий реестр налоговых накладных:
а) по дате: key1:=r.Cells(1, 4)
б) по наименованию организации: key2:=r.Cells(1, 3)
в) по номеру накладной: key3:=r.Cells(1, 2)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Public Sub SortRegisterByName()
    Set shR = ThisWorkbook.Worksheets( "Реестр" )
    shR.Range( "B13" ).Activate    'шапка таблицы
    i = shR.UsedRange.Rows.Count  'номер последней строки таблицы
    Dim r As Range      'диапазон ячеек таблицы с шапкой
    Set r = Range(shR.Cells( 13 ,  1 ), shR.Cells(i,  25 ))
    r.Sort key1:=r.Cells( 1 ,  4 ), key2:=r.Cells( 1 ,  3 ), key3:=r.Cells( 1 ,  2 ), header:=xlYes
    If shR.AutoFilterMode = False Then Range( "RegistryHead" ).AutoFilter
End Sub
...
Рейтинг: 0 / 0
Excel &VBA
    #32342796
Olesia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за разьяснение, я оказывается совсем темная.
А что означает - shR ?
...
Рейтинг: 0 / 0
Excel &VBA
    #32342802
Nadejda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShR - это тот лист, на котором находятся данные (реестр в данном случае). Чтобы произвести сортировку, нужно сначала сказать Excel'ю, на каком листе находятся данные, которые нужно отсортировать:
Set shR = ThisWorkbook.Worksheets("Реестр")
...
Рейтинг: 0 / 0
Excel &VBA
    #32342806
Nadejda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Могу предложить такой подход - выделяешь данные, которые нужно отсортировать. При нажатии на CommandButton - заносишь их в массив, а потом, в зависимости от того, какой метод сортировки ты выберешь (по возрастанию или убыванию) - применять его к этому массиву. Могу предложить неплохой и быстрый метод сортировки по возрастанию (сортирует как числа по возрастанию, так и строковые значения по алфавиту), если немного переделать - получишь и по убыванию.
...
Рейтинг: 0 / 0
Excel &VBA
    #32344054
Olesia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за отзывчивость и внимание, мне, конечно, не достает знаний, но по возможности стараюсь ликвидировать свои пробелы.
я попробовала так:
Sub Ascendingsort(list())
Range("G14:G21").Select
Selection.Sort Key1:=Range("G15"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
но сортируются данные, естественно только в заданных заранее ячейках…
Nadejda меня заинтересовало предложение по поводу кода, похоже, что у меня самой пока не получится добиться нужного результата.
...
Рейтинг: 0 / 0
Excel &VBA
    #32344107
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вышел небольшой перехлёст:
раньше ты выделяла строки и/или столбцы ЦЕЛИКОМ,
в приведенном коде - только диапазон-столбец:
Код: plaintext
Range( "G14:G21" ).Select 

В моём примере выделяется диапазон из 25 столбцов и вычисляемого количества строк:
Код: plaintext
1.
2.
    i = shR.UsedRange.Rows.Count  'номер последней строки таблицы
    Dim r As Range      'диапазон ячеек таблицы с шапкой
    Set r = Range(shR.Cells( 13 ,  1 ), shR.Cells(i,  25 ))

Таблица размером N*25 сортируется по трём полям.
Если надо сортировать по бОльшему к-ву полей, сортировку применяешь последовательно.
Относительно скорости сортировки.
Встроенные функции работают быстрее VBA-шных: они УЖЕ откомпилированы в машинный код. VBA-шный код исполняется интерпретатором.
...
Рейтинг: 0 / 0
Excel &VBA
    #32347277
Nadejda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
Option Explicit
Option Base  1 
Private Const dhcMissing = - 2 
Private Sub CommandButton1_Click()
'-- после выбора диапазона для сортировки при нажатии на CommandButton1 
' -- вызывается алгоритм быстрой сортировки QuickSort      
 
'-- сортировать можно как числовые значения, так     
' -- и строковые                                            
 
Dim c As Integer
Dim r As Integer
Dim c_count As Integer
Dim r_count As Integer
Dim i As Integer
Dim aSortArray() As Variant

c = Selection.Column '-- № первого столбца диапазона
r = Selection.Row      ' -- № первой строки диапазона
 
c_count = Selection.Columns.Count  '-- число столбцов в диапазоне
r_count = Selection.Rows.Count      ' -- число строк в диапазоне
 

If c_count < r_count Then
MsgBox  "выбран столбец "  &  "" & FindClm(c) & r & " : " & FindClm(c) & r + r_count - 1  & " "
ReDim Preserve aSortArray(r_count)
For i = 1  To r_count
aSortArray(i) = Cells(r + i -  1 , c).Value
Next i
Call dhQuickSort(aSortArray())
'-- Результат записываю в столбец D
For i = 1 To r_count
Cells(i, 4).Value = aSortArray(i)
Next i

ElseIf c_count > r_count Then
MsgBox "Выбрана строка " & "" & FindClm(c) & r & ":" & FindClm(c + c_count - 1) & r & ""
ReDim Preserve aSortArray(c_count)
For i = 1 To c_count
aSortArray(i) = Cells(r, c + i - 1).Value
Next i
Call dhQuickSort(aSortArray())
' -- Результат записываю в первую строку
 
For i =  1  To c_count
Cells( 1 , i).Value = aSortArray(i)
Next i
ElseIf c_count = r_count Then
MsgBox "Для сортировки выбрана одна ячейка. Подумай еще. "
End If
End Sub
Public Sub dhQuickSort(varArray As Variant, Optional lngLeft As Long = dhcMissing, Optional lngRight As Long = dhcMissing)
'----------алгоритм быстрой сортировки
 
Dim i As Long
Dim j As Long
Dim varTestVal As Variant
Dim lngMid As Long

If lngLeft = dhcMissing Then lngLeft = LBound(varArray)
If lngRight = dhcMissing Then lngRight = UBound(varArray)
If lngLeft < lngRight Then
lngMid = (lngLeft + lngRight) /  2 
varTestVal = varArray(lngMid)
i = lngLeft
j = lngRight
Do
    Do While varArray(i) < varTestVal
    i = i +  1 
    Loop
    Do While varArray(j) > varTestVal
    j = j -  1 
    Loop
    If i <= j Then
    SwapElements varArray, i, j
    i = i +  1 
    j = j -  1 
    End If
Loop Until i > j

If j <= lngMid Then
Call dhQuickSort(varArray, lngLeft, j)
Call dhQuickSort(varArray, i, lngRight)
Else
Call dhQuickSort(varArray, i, lngRight)
Call dhQuickSort(varArray, lngLeft, j)
End If
End If
End Sub
Private Sub SwapElements(varItems As Variant, lngItem1 As Long, lngItem2 As Long)
Dim varTemp As Variant
varTemp = varItems(lngItem2)
varItems(lngItem2) = varItems(lngItem1)
varItems(lngItem1) = varTemp
End Sub

Public Function FindClm(Num_Clm As Integer) As String
Dim n As Integer
If Num_Clm =  1  Then FindClm = "A "
If Num_Clm = 2  Then FindClm = "B "
If Num_Clm = 3  Then FindClm = "C "
If Num_Clm = 4  Then FindClm = "D "
If Num_Clm = 5  Then FindClm = "E "
If Num_Clm = 6  Then FindClm = "F "
If Num_Clm = 7  Then FindClm = "G "
If Num_Clm = 8  Then FindClm = "H "
If Num_Clm = 9  Then FindClm = "I "
If Num_Clm = 10  Then FindClm = "J "
If Num_Clm = 11  Then FindClm = "K "
If Num_Clm = 12  Then FindClm = "L "
If Num_Clm = 13  Then FindClm = "M "
If Num_Clm = 14  Then FindClm = "N "
If Num_Clm = 15  Then FindClm = "O "
If Num_Clm = 16  Then FindClm = "P "
If Num_Clm = 17  Then FindClm = "Q "
If Num_Clm = 18  Then FindClm = "R "
If Num_Clm = 19  Then FindClm = "S "
If Num_Clm = 20  Then FindClm = "T "
If Num_Clm = 21  Then FindClm = "U "
If Num_Clm = 22  Then FindClm = "V "
If Num_Clm = 23  Then FindClm = "W "
If Num_Clm = 24  Then FindClm = "X "
If Num_Clm = 25  Then FindClm = "Y "
If Num_Clm = 26  Then FindClm = "Z "
If Num_Clm >= 27  And Num_Clm <=  52  Then
n = Num_Clm -  26 
FindClm = "A " & FindClm(n)
End If
If Num_Clm >= 53  And Num_Clm <=  78  Then
n = Num_Clm -  26  *  2 
FindClm = "B" & FindClm(n)
End If

End Function

...
Рейтинг: 0 / 0
Excel &VBA
    #32352396
Olesia
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромнейшее спасибо!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Excel &VBA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]